From dd7dd0b1db6daaf30f5fc79028f52a777bf44af9 Mon Sep 17 00:00:00 2001 From: Hui Wang Date: Thu, 29 Feb 2024 22:00:22 +0800 Subject: [PATCH] =?UTF-8?q?metricsql:=20fix=20label=5Fjoin()=20when=20`dst?= =?UTF-8?q?=5Flabel`=20is=20equal=20to=20one=20of=20the=20`=E2=80=A6=20(#5?= =?UTF-8?q?886)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * metricsql: fix label_join() when `dst_label` is equal to one of the `src_label` * Update app/vmselect/promql/transform.go * Update docs/CHANGELOG.md --------- Co-authored-by: Aliaksandr Valialkin --- app/vmselect/promql/exec_test.go | 15 +++++++++++++++ app/vmselect/promql/transform.go | 3 +-- docs/CHANGELOG.md | 2 +- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/vmselect/promql/exec_test.go b/app/vmselect/promql/exec_test.go index c1f55fb94..412ab78b0 100644 --- a/app/vmselect/promql/exec_test.go +++ b/app/vmselect/promql/exec_test.go @@ -2307,6 +2307,21 @@ func TestExecSuccess(t *testing.T) { resultExpected := []netstorage.Result{r} f(q, resultExpected) }) + t.Run(`label_join dst_label is equal to src_label`, func(t *testing.T) { + t.Parallel() + q := `label_join(label_join(time(), "bar", "sep1", "a", "b"), "bar", "sep2", "a", "bar")` + r := netstorage.Result{ + MetricName: metricNameExpected, + Values: []float64{1000, 1200, 1400, 1600, 1800, 2000}, + Timestamps: timestampsExpected, + } + r.MetricName.Tags = []storage.Tag{{ + Key: []byte("bar"), + Value: []byte("sep2sep1"), + }} + resultExpected := []netstorage.Result{r} + f(q, resultExpected) + }) t.Run(`label_value()`, func(t *testing.T) { t.Parallel() q := `with ( diff --git a/app/vmselect/promql/transform.go b/app/vmselect/promql/transform.go index a52055dbb..fadc072cf 100644 --- a/app/vmselect/promql/transform.go +++ b/app/vmselect/promql/transform.go @@ -1940,8 +1940,7 @@ func transformLabelJoin(tfa *transformFuncArg) ([]*timeseries, error) { for _, ts := range rvs { mn := &ts.MetricName dstValue := getDstValue(mn, dstLabel) - b := *dstValue - b = b[:0] + var b []byte for j, srcLabel := range srcLabels { srcValue := mn.GetTagValue(srcLabel) b = append(b, srcValue...) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index d8daa29cf..671390f3f 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -54,7 +54,7 @@ See also [LTS releases](https://docs.victoriametrics.com/LTS-releases.html). * BUGFIX: [vmalert](https://docs.victoriametrics.com/#vmalert): consistently sort groups by name and filename on `/groups` page in UI. This should prevent non-deterministic sorting for groups with identical names. * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): fix Popper display issues. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/5842). * BUGFIX: [vmselect](https://docs.victoriametrics.com/): format time with milliseconds precision when `__timestamp__:rfc3339` is specified for [/api/v1/export/csv](https://docs.victoriametrics.com/#how-to-export-csv-data) API response. See this [issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5837) for details. - +* BUGFIX: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): properly construct the destination label in [label_join](https://docs.victoriametrics.com/metricsql/#label_join) if it is used as source label. See this [issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5881) for details. ## [v1.98.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.98.0)