From cdf7208478de651f57d5b18327de1aad5612ca29 Mon Sep 17 00:00:00 2001 From: Julius Hinze Date: Wed, 20 Aug 2025 15:11:44 +0200 Subject: [PATCH] annotations: histogram counter reset warning includes operation Signed-off-by: Julius Hinze --- promql/engine.go | 4 ++-- promql/functions.go | 12 ++++++------ promql/functions_internal_test.go | 2 +- util/annotations/annotations.go | 18 +++++++++++++++--- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/promql/engine.go b/promql/engine.go index 8e2074c6ca..d476e28cf4 100644 --- a/promql/engine.go +++ b/promql/engine.go @@ -2960,7 +2960,7 @@ func vectorElemBinop(op parser.ItemType, lhs, rhs float64, hlhs, hrhs *histogram return 0, nil, false, err } if counterResetCollision { - err = annotations.NewHistogramCounterResetCollisionWarning(pos) + err = annotations.NewHistogramCounterResetCollisionWarning(pos, annotations.HistogramAdd) } return 0, res.Compact(0), true, err case parser.SUB: @@ -2969,7 +2969,7 @@ func vectorElemBinop(op parser.ItemType, lhs, rhs float64, hlhs, hrhs *histogram return 0, nil, false, err } if counterResetCollision { - err = annotations.NewHistogramCounterResetCollisionWarning(pos) + err = annotations.NewHistogramCounterResetCollisionWarning(pos, annotations.HistogramSub) } return 0, res.Compact(0), true, err case parser.EQLC: diff --git a/promql/functions.go b/promql/functions.go index 0b4716a026..aecd647c9b 100644 --- a/promql/functions.go +++ b/promql/functions.go @@ -264,7 +264,7 @@ func histogramRate(points []HPoint, isCounter bool, metricName string, pos posra } if counterResetCollision { - annos.Add(annotations.NewHistogramCounterResetCollisionWarning(pos)) + annos.Add(annotations.NewHistogramCounterResetCollisionWarning(pos, annotations.HistogramSub)) } if isCounter { @@ -281,7 +281,7 @@ func histogramRate(points []HPoint, isCounter bool, metricName string, pos posra } } if counterResetCollision { - annos.Add(annotations.NewHistogramCounterResetCollisionWarning(pos)) + annos.Add(annotations.NewHistogramCounterResetCollisionWarning(pos, annotations.HistogramAdd)) } } prev = curr @@ -403,7 +403,7 @@ func instantValue(vals Matrix, args parser.Expressions, out Vector, isRate bool) return out, annos.Add(annotations.NewIncompatibleCustomBucketsHistogramsWarning(metricName, args.PositionRange())) } if counterResetCollision { - annos.Add(annotations.NewHistogramCounterResetCollisionWarning(args.PositionRange())) + annos.Add(annotations.NewHistogramCounterResetCollisionWarning(args.PositionRange(), annotations.HistogramSub)) } } resultSample.H.CounterResetHint = histogram.GaugeType @@ -721,14 +721,14 @@ func funcAvgOverTime(_ []Vector, matrixVal Matrix, args parser.Expressions, enh return mean, err } if counterResetCollision { - annos.Add(annotations.NewHistogramCounterResetCollisionWarning(args[0].PositionRange())) + annos.Add(annotations.NewHistogramCounterResetCollisionWarning(args[0].PositionRange(), annotations.HistogramSub)) } _, counterResetCollision, err = mean.Add(toAdd) if err != nil { return mean, err } if counterResetCollision { - annos.Add(annotations.NewHistogramCounterResetCollisionWarning(args[0].PositionRange())) + annos.Add(annotations.NewHistogramCounterResetCollisionWarning(args[0].PositionRange(), annotations.HistogramAdd)) } } return mean, nil @@ -927,7 +927,7 @@ func funcSumOverTime(_ []Vector, matrixVal Matrix, args parser.Expressions, enh return sum, err } if counterResetCollision { - annos.Add(annotations.NewHistogramCounterResetCollisionWarning(args[0].PositionRange())) + annos.Add(annotations.NewHistogramCounterResetCollisionWarning(args[0].PositionRange(), annotations.HistogramAdd)) } } return sum, nil diff --git a/promql/functions_internal_test.go b/promql/functions_internal_test.go index 5ca4e54483..fc7e604dc0 100644 --- a/promql/functions_internal_test.go +++ b/promql/functions_internal_test.go @@ -121,7 +121,7 @@ func TestHistogramRate_Annotations(t *testing.T) { }, wantAnnotations: newAnnotations( annotations.NewNativeHistogramNotGaugeWarning(metricName, pos), - annotations.NewHistogramCounterResetCollisionWarning(pos), + annotations.NewHistogramCounterResetCollisionWarning(pos, annotations.HistogramSub), ), }, } { diff --git a/util/annotations/annotations.go b/util/annotations/annotations.go index a4d03f5e3c..5888a3256a 100644 --- a/util/annotations/annotations.go +++ b/util/annotations/annotations.go @@ -155,7 +155,7 @@ var ( NativeHistogramQuantileNaNResultInfo = fmt.Errorf("%w: input to histogram_quantile has NaN observations, result is NaN", PromQLInfo) NativeHistogramQuantileNaNSkewInfo = fmt.Errorf("%w: input to histogram_quantile has NaN observations, result is skewed higher", PromQLInfo) NativeHistogramFractionNaNsInfo = fmt.Errorf("%w: input to histogram_fraction has NaN observations, which are excluded from all fractions", PromQLInfo) - HistogramCounterResetCollisionWarning = fmt.Errorf("%w: conflicting histogram counter resets", PromQLWarning) + HistogramCounterResetCollisionWarning = fmt.Errorf("%w: conflicting counter resets during histogram", PromQLWarning) ) type annoErr struct { @@ -358,11 +358,23 @@ func NewNativeHistogramFractionNaNsInfo(metricName string, pos posrange.Position } } +type HistogramOperation string + +const ( + HistogramAdd HistogramOperation = "addition" + HistogramSub HistogramOperation = "subtraction" +) + // NewHistogramCounterResetCollisionWarning is used when two counter histograms are added or subtracted where one has // a CounterReset hint and the other has NotCounterReset. -func NewHistogramCounterResetCollisionWarning(pos posrange.PositionRange) error { +func NewHistogramCounterResetCollisionWarning(pos posrange.PositionRange, operation HistogramOperation) error { + switch operation { + case HistogramAdd, HistogramSub: + default: + operation = "unknown operation" + } return annoErr{ PositionRange: pos, - Err: fmt.Errorf("%w", HistogramCounterResetCollisionWarning), + Err: fmt.Errorf("%w %s", HistogramCounterResetCollisionWarning, operation), } }