From b191e425b3b4081bf1a25d64c2e6e0d24e14545d Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Sun, 26 Jul 2020 12:06:40 +0300 Subject: [PATCH] app/vmselect/promql: improve further the accuracy of buckets_limit() function The accuracy is increased by mergin the smallest bucket with the smallest adjacent bucket. --- app/vmselect/promql/exec_test.go | 5 +++-- app/vmselect/promql/transform.go | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/vmselect/promql/exec_test.go b/app/vmselect/promql/exec_test.go index df70ca5584..a97fdcfc4d 100644 --- a/app/vmselect/promql/exec_test.go +++ b/app/vmselect/promql/exec_test.go @@ -3066,6 +3066,7 @@ func TestExecSuccess(t *testing.T) { t.Parallel() q := `sort(buckets_limit(2, ( alias(label_set(100, "le", "inf", "x", "y"), "metric"), + alias(label_set(98, "le", "300", "x", "y"), "metric"), alias(label_set(52, "le", "200", "x", "y"), "metric"), alias(label_set(50, "le", "120", "x", "y"), "metric"), alias(label_set(20, "le", "70", "x", "y"), "metric"), @@ -3074,14 +3075,14 @@ func TestExecSuccess(t *testing.T) { )))` r1 := netstorage.Result{ MetricName: metricNameExpected, - Values: []float64{50, 50, 50, 50, 50, 50}, + Values: []float64{52, 52, 52, 52, 52, 52}, Timestamps: timestampsExpected, } r1.MetricName.MetricGroup = []byte("metric") r1.MetricName.Tags = []storage.Tag{ { Key: []byte("le"), - Value: []byte("120"), + Value: []byte("200"), }, { Key: []byte("x"), diff --git a/app/vmselect/promql/transform.go b/app/vmselect/promql/transform.go index 003074fba0..7fdc3ded79 100644 --- a/app/vmselect/promql/transform.go +++ b/app/vmselect/promql/transform.go @@ -363,8 +363,9 @@ func transformBucketsLimit(tfa *transformFuncArg) ([]*timeseries, error) { xxMinIdx = i } } - if xxMinIdx+1 == len(leGroup) { - // Merge the `inf` bucket with the previous bucket in order to save accuracy. + // Merge the leGroup[xxMinIdx] bucket with the smallest adjacent bucket in order to preserve + // the maximum accuracy. + if xxMinIdx+1 == len(leGroup) || (xxMinIdx > 0 && leGroup[xxMinIdx-1].hits < leGroup[xxMinIdx+1].hits) { xxMinIdx-- } leGroup[xxMinIdx+1].hits += leGroup[xxMinIdx].hits