From 7543bdfd54b1a739d782316e7933029ddaede905 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Fri, 30 Sep 2022 08:39:51 +0300 Subject: [PATCH] app/vmselect/promql: remove empty series before applying aggregate function Previously empty series (e.g. series with all NaN samples) were passed to aggregate functions. Such series must be ingored by all the aggregate functions. So it is better from consistency PoV filtering out empty series before applying aggregate functions. --- app/vmselect/promql/aggr.go | 3 +++ app/vmselect/promql/exec_test.go | 6 ++++++ docs/CHANGELOG.md | 1 + 3 files changed, 10 insertions(+) diff --git a/app/vmselect/promql/aggr.go b/app/vmselect/promql/aggr.go index 353c0226b..07573fe3c 100644 --- a/app/vmselect/promql/aggr.go +++ b/app/vmselect/promql/aggr.go @@ -104,6 +104,9 @@ func removeGroupTags(metricName *storage.MetricName, modifier *metricsql.Modifie func aggrFuncExt(afe func(tss []*timeseries, modifier *metricsql.ModifierExpr) []*timeseries, argOrig []*timeseries, modifier *metricsql.ModifierExpr, maxSeries int, keepOriginal bool) ([]*timeseries, error) { + // Remove empty time series, e.g. series with all NaN samples, + // since such series are ignored by aggregate functions. + argOrig = removeEmptySeries(argOrig) arg := copyTimeseriesMetricNames(argOrig, keepOriginal) // Perform grouping. diff --git a/app/vmselect/promql/exec_test.go b/app/vmselect/promql/exec_test.go index 056d9ea99..6c54b0043 100644 --- a/app/vmselect/promql/exec_test.go +++ b/app/vmselect/promql/exec_test.go @@ -5490,6 +5490,12 @@ func TestExecSuccess(t *testing.T) { resultExpected := []netstorage.Result{r} f(q, resultExpected) }) + t.Run(`any(empty-series)`, func(t *testing.T) { + t.Parallel() + q := `any(label_set(time()<0, "foo", "bar"))` + resultExpected := []netstorage.Result{} + f(q, resultExpected) + }) t.Run(`group() by (test)`, func(t *testing.T) { t.Parallel() q := `group(( diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 258f8f570..cc931316f 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -22,6 +22,7 @@ The following tip changes can be tested by building VictoriaMetrics components f * BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly encode query params for aws signed requests, use `%20` instead of `+` as api requires. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3171). * BUGFIX: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): properly calculate `rate_over_sum(m[d])` as `sum_over_time(m[d])/d`. Previously the `sum_over_time(m[d])` could be improperly divided by smaller than `d` time range. See [rate_over_sum() docs](https://docs.victoriametrics.com/MetricsQL.html#rate_over_sum) and [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3045). * BUGFIX: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): properly calculate `increase(m[d])` over slow-changing counters with values smaller than 100. Previously [increase](https://docs.victoriametrics.com/MetricsQL.html#increase) could return unexpectedly big results in this case. See [the related issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/962) and [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/3163). +* BUGFIX: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): ignore empty series when applying [limit_offset](https://docs.victoriametrics.com/MetricsQL.html#limit_offset). It should improve queries with additional filters by value in expressions like `limit_offset(1,1, foo > 1)`. ## [v1.79.3](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.79.3)