From b69ec3f39c59545a30480b05b9fa979809153b66 Mon Sep 17 00:00:00 2001 From: Linas Medziunas Date: Wed, 28 Jan 2026 15:11:10 +0200 Subject: [PATCH] Only track signs of surviving buckets Signed-off-by: Linas Medziunas --- promql/engine.go | 45 ++++++++----------- .../testdata/native_histograms.test | 6 +-- 2 files changed, 21 insertions(+), 30 deletions(-) diff --git a/promql/engine.go b/promql/engine.go index 1036ed0d5e..039c5fce7b 100644 --- a/promql/engine.go +++ b/promql/engine.go @@ -3243,9 +3243,18 @@ func trimHistogram(trimmedHist *histogram.FloatHistogram, rhs float64, isUpperTr updatedCount := 0.0 origSum := trimmedHist.Sum removedSum := 0.0 - hasPositive, hasNegative := false, false isCustomBucket := trimmedHist.UsesCustomBuckets() + var hasPositive, hasNegative bool + trackBucketSigns := func(bucket histogram.Bucket[float64]) { + if bucket.Lower < 0 { + hasNegative = true + } + if bucket.Upper > 0 { + hasPositive = true + } + } + if isUpperTrim { // Calculate the fraction to keep for buckets that contain the trim value. // For TRIM_UPPER, we keep observations below the trim point (rhs). @@ -3255,18 +3264,6 @@ func trimHistogram(trimmedHist *histogram.FloatHistogram, rhs float64, isUpperTr if bucket.Count == 0 { continue } - if isCustomBucket { - if bucket.Upper <= 0 { - hasNegative = true - } else { - if bucket.Lower < 0 { - hasNegative = true - } - hasPositive = true - } - } else { - hasPositive = true - } keepCount, bucketMidpoint := computeBucketTrim(bucket, rhs, isUpperTrim, true, isCustomBucket) @@ -3274,10 +3271,12 @@ func trimHistogram(trimmedHist *histogram.FloatHistogram, rhs float64, isUpperTr case bucket.Upper <= rhs: // Bucket is entirely below the trim point - keep all. updatedCount += bucket.Count + trackBucketSigns(bucket) case bucket.Lower < rhs: // Bucket contains the trim point - interpolate. removedCount := bucket.Count - keepCount removedSum += removedCount * bucketMidpoint + trackBucketSigns(bucket) updatedCount += keepCount trimmedHist.PositiveBuckets[i] = keepCount @@ -3296,19 +3295,20 @@ func trimHistogram(trimmedHist *histogram.FloatHistogram, rhs float64, isUpperTr if bucket.Count == 0 { continue } - hasNegative = true keepCount, bucketMidpoint := computeBucketTrim(bucket, rhs, isUpperTrim, false, isCustomBucket) switch { case bucket.Upper <= rhs: updatedCount += bucket.Count + trackBucketSigns(bucket) case bucket.Lower < rhs: removedCount := bucket.Count - keepCount removedSum += removedCount * bucketMidpoint trimmedHist.NegativeBuckets[i] = keepCount updatedCount += keepCount + trackBucketSigns(bucket) default: bucketMidpoint = -math.Sqrt(bucket.Lower * bucket.Upper) removedSum += bucket.Count * bucketMidpoint @@ -3323,30 +3323,20 @@ func trimHistogram(trimmedHist *histogram.FloatHistogram, rhs float64, isUpperTr if bucket.Count == 0 { continue } - if isCustomBucket { - if bucket.Upper <= 0 { - hasNegative = true - } else { - if bucket.Lower < 0 { - hasNegative = true - } - hasPositive = true - } - } else { - hasPositive = true - } keepCount, bucketMidpoint := computeBucketTrim(bucket, rhs, isUpperTrim, true, isCustomBucket) switch { case bucket.Lower >= rhs: updatedCount += bucket.Count + trackBucketSigns(bucket) case bucket.Upper > rhs: removedCount := bucket.Count - keepCount removedSum += removedCount * bucketMidpoint trimmedHist.PositiveBuckets[i] = keepCount updatedCount += keepCount + trackBucketSigns(bucket) default: if !isCustomBucket { bucketMidpoint = math.Sqrt(bucket.Lower * bucket.Upper) @@ -3361,19 +3351,20 @@ func trimHistogram(trimmedHist *histogram.FloatHistogram, rhs float64, isUpperTr if bucket.Count == 0 { continue } - hasNegative = true keepCount, bucketMidpoint := computeBucketTrim(bucket, rhs, isUpperTrim, false, isCustomBucket) switch { case bucket.Lower >= rhs: updatedCount += bucket.Count + trackBucketSigns(bucket) case bucket.Upper > rhs: removedCount := bucket.Count - keepCount removedSum += removedCount * bucketMidpoint trimmedHist.NegativeBuckets[i] = keepCount updatedCount += keepCount + trackBucketSigns(bucket) default: bucketMidpoint = -math.Sqrt(bucket.Lower * bucket.Upper) removedSum += bucket.Count * bucketMidpoint diff --git a/promql/promqltest/testdata/native_histograms.test b/promql/promqltest/testdata/native_histograms.test index c62983f8b2..7f2585ef6e 100644 --- a/promql/promqltest/testdata/native_histograms.test +++ b/promql/promqltest/testdata/native_histograms.test @@ -1897,7 +1897,7 @@ eval instant at 1m h_test >/ 0 h_test {{schema:0 sum:127.28553390593274 count:30.5 z_bucket:0.5 z_bucket_w:0.001 buckets:[2 4 8 16]}} eval instant at 1m h_test / -1 h_test{} {{count:32 sum:126.57842712474618 z_bucket:1 z_bucket_w:0.001 buckets:[2 4 8 16] n_buckets:[1]}} eval instant at 1m h_test