From b9a4601c97ce04ebebc7b2ce3c097bb918e43967 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Tue, 13 Oct 2020 15:53:31 +0300 Subject: [PATCH] app/vmselect/promql: return a single time series at max from `absent()` function like Prometheus does --- CHANGELOG.md | 1 + app/vmselect/promql/exec_test.go | 4 ---- app/vmselect/promql/transform.go | 25 +++++++++++++------------ 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b645b6b446..aba39bad1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ * BUGFIX: properly handle stale time series after K8S deployment. Previously such time series could be double-counted. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/748 +* BUGFIX: return a single time series at max from `absent()` function like Prometheus does. * BUGFIX: vmalert: accept days, weeks and years in `for: ` part of config like Prometheus does. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/817 * BUGFIX: fix `mode_over_time(m[d])` calculations. Previously the function could return incorrect results. diff --git a/app/vmselect/promql/exec_test.go b/app/vmselect/promql/exec_test.go index c1f65733ed..4b05851756 100644 --- a/app/vmselect/promql/exec_test.go +++ b/app/vmselect/promql/exec_test.go @@ -592,10 +592,6 @@ func TestExecSuccess(t *testing.T) { Values: []float64{1, 1, 1, 1, 1, 1}, Timestamps: timestampsExpected, } - r.MetricName.Tags = []storage.Tag{{ - Key: []byte("yy"), - Value: []byte("foo"), - }} resultExpected := []netstorage.Result{r} f(q, resultExpected) }) diff --git a/app/vmselect/promql/transform.go b/app/vmselect/promql/transform.go index bc39a112f0..660f8bb8e9 100644 --- a/app/vmselect/promql/transform.go +++ b/app/vmselect/promql/transform.go @@ -167,23 +167,24 @@ func transformAbsent(tfa *transformFuncArg) ([]*timeseries, error) { if err := expectTransformArgsNum(args, 1); err != nil { return nil, err } - arg := args[0] - if len(arg) == 0 { - rvs := getAbsentTimeseries(tfa.ec, tfa.fe.Args[0]) + tss := args[0] + rvs := getAbsentTimeseries(tfa.ec, tfa.fe.Args[0]) + if len(tss) == 0 { return rvs, nil } - for _, ts := range arg { - ts.MetricName.ResetMetricGroup() - for i, v := range ts.Values { - if !math.IsNaN(v) { - v = nan - } else { - v = 1 + for i := range tss[0].Values { + isAbsent := true + for _, ts := range tss { + if !math.IsNaN(ts.Values[i]) { + isAbsent = false + break } - ts.Values[i] = v + } + if !isAbsent { + rvs[0].Values[i] = nan } } - return arg, nil + return rvs, nil } func getAbsentTimeseries(ec *EvalConfig, arg metricsql.Expr) []*timeseries {