From baa11a778dd3ab53d4eadd63a4d81fc3388d888c Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Thu, 6 Oct 2022 22:30:40 +0300 Subject: [PATCH] app/vmselect/promql: properly calculate `quantiles_over_time()` over a single raw sample --- app/vmselect/promql/exec_test.go | 35 +++++++++++++++++++++++++++++++- app/vmselect/promql/rollup.go | 6 +----- docs/CHANGELOG.md | 1 + 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/app/vmselect/promql/exec_test.go b/app/vmselect/promql/exec_test.go index a92b35ed48..0679fbe2a4 100644 --- a/app/vmselect/promql/exec_test.go +++ b/app/vmselect/promql/exec_test.go @@ -5110,7 +5110,40 @@ func TestExecSuccess(t *testing.T) { resultExpected := []netstorage.Result{r} f(q, resultExpected) }) - t.Run(`quantiles_over_time`, func(t *testing.T) { + t.Run(`quantiles_over_time(single_sample)`, func(t *testing.T) { + t.Parallel() + q := `sort_by_label( + quantiles_over_time("phi", 0.5, 0.9, + time()[100s:100s] + ), + "phi", + )` + r1 := netstorage.Result{ + MetricName: metricNameExpected, + Values: []float64{1000, 1200, 1400, 1600, 1800, 2000}, + Timestamps: timestampsExpected, + } + r1.MetricName.Tags = []storage.Tag{ + { + Key: []byte("phi"), + Value: []byte("0.5"), + }, + } + r2 := netstorage.Result{ + MetricName: metricNameExpected, + Values: []float64{1000, 1200, 1400, 1600, 1800, 2000}, + Timestamps: timestampsExpected, + } + r2.MetricName.Tags = []storage.Tag{ + { + Key: []byte("phi"), + Value: []byte("0.9"), + }, + } + resultExpected := []netstorage.Result{r1, r2} + f(q, resultExpected) + }) + t.Run(`quantiles_over_time(multiple_samples)`, func(t *testing.T) { t.Parallel() q := `sort_by_label( quantiles_over_time("phi", 0.5, 0.9, diff --git a/app/vmselect/promql/rollup.go b/app/vmselect/promql/rollup.go index 1c4946e752..cdc26f0a3f 100644 --- a/app/vmselect/promql/rollup.go +++ b/app/vmselect/promql/rollup.go @@ -1122,11 +1122,7 @@ func newRollupQuantiles(args []interface{}) (rollupFunc, error) { // before calling rollup funcs. values := rfa.values if len(values) == 0 { - return rfa.prevValue - } - if len(values) == 1 { - // Fast path - only a single value. - return values[0] + return nan } qs := getFloat64s() qs.A = quantiles(qs.A[:0], phis, values) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index be7be666f7..68cf5a7dc9 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -65,6 +65,7 @@ See [these docs](https://docs.victoriametrics.com/Cluster-VictoriaMetrics.html#m * 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)`. +* BUGFIX: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): properly calculate [quantiles_over_time](https://docs.victoriametrics.com/MetricsQL.html#quantiles_over_time) when the lookbehind window contains only a single sample. Previously an empty result was incorrectly returned in this case. * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): fix `RangeError: Maximum call stack size exceeded` error when the query returns too many data points at `Table` view. See [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/3092/files). * BUGFIX: [vmui](https://docs.victoriametrics.com/#vmui): fix workaround for adding more queries via URL. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3169). * BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): re-evaluate annotations per each alert evaluation. Previously, annotations were evaluated only on alert's value change. This could result in stale annotations in some cases described in [this pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/3119).