From 22d0f4f114b9143c66d7805ed92c5f692e74c066 Mon Sep 17 00:00:00 2001 From: Jeanette Tan Date: Fri, 22 Mar 2024 03:42:50 +0800 Subject: [PATCH] improve handling of negative bounds in histogram std dev/var Signed-off-by: Jeanette Tan --- promql/engine_test.go | 6 +++--- promql/functions.go | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/promql/engine_test.go b/promql/engine_test.go index 3f5f2dc132..9d43efdb90 100644 --- a/promql/engine_test.go +++ b/promql/engine_test.go @@ -3496,7 +3496,7 @@ func TestNativeHistogram_HistogramStdDevVar(t *testing.T) { }, NegativeBuckets: []int64{1, 0}, }, - stdVar: 1544.8582535368798, // actual variance: 1738.4082 + stdVar: 1844.4651144196398, // actual variance: 1738.4082 }, { name: "-100000, -10000, -1000, -888, -888, -100, -50, -9, -8, -3", @@ -3514,7 +3514,7 @@ func TestNativeHistogram_HistogramStdDevVar(t *testing.T) { }, NegativeBuckets: []int64{1, 0, 0, 0, 0, 2, -2, 0}, }, - stdVar: 1240930974.5260057, // actual variance: 882690990 + stdVar: 759352122.1939945, // actual variance: 882690990 }, { name: "-10 x10", @@ -3528,7 +3528,7 @@ func TestNativeHistogram_HistogramStdDevVar(t *testing.T) { }, NegativeBuckets: []int64{10}, }, - stdVar: 454.2741699796952, // actual variance: 0 + stdVar: 1.725830020304794, // actual variance: 0 }, { name: "-50, -8, 0, 3, 8, 9, 100, NaN", diff --git a/promql/functions.go b/promql/functions.go index da66af2f02..e0b811a09d 100644 --- a/promql/functions.go +++ b/promql/functions.go @@ -1116,6 +1116,9 @@ func funcHistogramStdDev(vals []parser.Value, args parser.Expressions, enh *Eval val = 0 } else { val = math.Sqrt(bucket.Upper * bucket.Lower) + if bucket.Upper < 0 { + val = -val + } } delta := val - mean variance, cVariance = kahanSumInc(bucket.Count*delta*delta, variance, cVariance) @@ -1149,6 +1152,9 @@ func funcHistogramStdVar(vals []parser.Value, args parser.Expressions, enh *Eval val = 0 } else { val = math.Sqrt(bucket.Upper * bucket.Lower) + if bucket.Upper < 0 { + val = -val + } } delta := val - mean variance, cVariance = kahanSumInc(bucket.Count*delta*delta, variance, cVariance)