From b43ff80d21b97a6a2f9ab652f6aadb59e3a26526 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin <valyala@victoriametrics.com> Date: Mon, 25 Sep 2023 16:14:14 +0200 Subject: [PATCH] app/vmselect/promql: do not sort `q1 or q2` results This makes sure that `q2` series are returned after `q1` series in the same way as Prometheus does See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4763 --- app/vmselect/promql/exec.go | 6 +++++ app/vmselect/promql/exec_test.go | 38 +++++++++++++++++++++++++++----- docs/CHANGELOG.md | 1 + 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/app/vmselect/promql/exec.go b/app/vmselect/promql/exec.go index bb64191f9..5be2f70ff 100644 --- a/app/vmselect/promql/exec.go +++ b/app/vmselect/promql/exec.go @@ -112,6 +112,12 @@ func maySortResults(e metricsql.Expr) bool { "bottomk_max", "bottomk_min", "bottomk_avg", "bottomk_median", "bottomk_last": return false } + case *metricsql.BinaryOpExpr: + if strings.ToLower(v.Op) == "or" { + // Do not sort results for `a or b` in the same way as Prometheus does. + // See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4763 + return false + } } return true } diff --git a/app/vmselect/promql/exec_test.go b/app/vmselect/promql/exec_test.go index 7537c870b..930bd922f 100644 --- a/app/vmselect/promql/exec_test.go +++ b/app/vmselect/promql/exec_test.go @@ -8489,11 +8489,11 @@ func TestExecSuccess(t *testing.T) { }) t.Run(`result sorting`, func(t *testing.T) { t.Parallel() - q := `label_set(1, "instance", "localhost:1001", "type", "free") - or label_set(1, "instance", "localhost:1001", "type", "buffers") - or label_set(1, "instance", "localhost:1000", "type", "buffers") - or label_set(1, "instance", "localhost:1000", "type", "free") -` + q := `(label_set(1, "instance", "localhost:1001", "type", "free"), + label_set(1, "instance", "localhost:1001", "type", "buffers"), + label_set(1, "instance", "localhost:1000", "type", "buffers"), + label_set(1, "instance", "localhost:1000", "type", "free"), + )` r1 := netstorage.Result{ MetricName: metricNameExpected, Values: []float64{1, 1, 1, 1, 1, 1}, @@ -8525,6 +8525,34 @@ func TestExecSuccess(t *testing.T) { resultExpected := []netstorage.Result{r1, r2, r3, r4} f(q, resultExpected) }) + t.Run(`no_sorting_for_or`, func(t *testing.T) { + t.Parallel() + q := `label_set(2, "foo", "bar") or label_set(1, "foo", "baz")` + r1 := netstorage.Result{ + MetricName: metricNameExpected, + Values: []float64{2, 2, 2, 2, 2, 2}, + Timestamps: timestampsExpected, + } + r1.MetricName.Tags = []storage.Tag{ + { + Key: []byte("foo"), + Value: []byte("bar"), + }, + } + r2 := netstorage.Result{ + MetricName: metricNameExpected, + Values: []float64{1, 1, 1, 1, 1, 1}, + Timestamps: timestampsExpected, + } + r2.MetricName.Tags = []storage.Tag{ + { + Key: []byte("foo"), + Value: []byte("baz"), + }, + } + resultExpected := []netstorage.Result{r1, r2} + f(q, resultExpected) + }) t.Run(`sort_by_label_numeric(multiple_labels_only_string)`, func(t *testing.T) { t.Parallel() q := `sort_by_label_numeric(( diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 0a2b2b9f2..d204d463d 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -49,6 +49,7 @@ The sandbox cluster installation is running under the constant load generated by * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): add `eval_offset` attribute for [Groups](https://docs.victoriametrics.com/vmalert.html#groups). If specified, Group will be evaluated at the exact time offset on the range of [0...evaluationInterval]. The setting might be useful for cron-like rules which must be evaluated at specific moments of time. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3409) for details. * FEATURE: [vmalert](https://docs.victoriametrics.com/vmalert.html): validate [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html) function names in alerting and recording rules when `vmalert` runs with `-dryRun` command-line flag. Previously it was allowed to use unknown (aka invalid) MetricsQL function names there. For example, `foo()` was counted as a valid query. See [this feature request](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4933). * FEATURE: limit the length of string params in log messages to 500 chars. Longer string params are replaced with the `first_250_chars..last_250_chars`. This prevents from too long log lines, which can be emitted by VictoriaMetrics components. +* FEATURE: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): make sure that `q2` series are returned after `q1` series in the results of `q1 or q2` query, in the same way as Prometheus does. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/4763). * BUGFIX: [Official Grafana dashboards for VictoriaMetrics](https://grafana.com/orgs/victoriametrics): fix display of ingested rows rate for `Samples ingested/s` and `Samples rate` panels for vmagent's dasbhoard. Previously, not all ingested protocols were accounted in these panels. An extra panel `Rows rate` was added to `Ingestion` section to display the split for rows ingested rate by protocol. * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): fix the bug causing render looping when switching to heatmap.