mirror of
https://github.com/prometheus/prometheus.git
synced 2025-02-21 03:16:00 -08:00
Add warnings for histogramRate applied with isCounter not matching counter/gauge histogram (#13392)
Add warnings for histogramRate applied with isCounter not matching counter/gauge histogram --------- Signed-off-by: Jeanette Tan <jeanette.tan@grafana.com>
This commit is contained in:
parent
df2a0ecf3b
commit
a3ddfbd1ee
|
@ -469,8 +469,8 @@ func (h *FloatHistogram) DetectReset(previous *FloatHistogram) bool {
|
||||||
// is a counter reset or not.
|
// is a counter reset or not.
|
||||||
// We do the same if the CounterResetHint is GaugeType, which should not happen, but PromQL still
|
// We do the same if the CounterResetHint is GaugeType, which should not happen, but PromQL still
|
||||||
// allows the user to apply functions to gauge histograms that are only meant for counter histograms.
|
// allows the user to apply functions to gauge histograms that are only meant for counter histograms.
|
||||||
// In this case, we treat the gauge histograms as a counter histograms
|
// In this case, we treat the gauge histograms as counter histograms. A warning should be returned
|
||||||
// (and we plan to return a warning about it to the user).
|
// to the user in this case.
|
||||||
if h.Count < previous.Count {
|
if h.Count < previous.Count {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,6 +187,8 @@ func histogramRate(points []HPoint, isCounter bool, metricName string, pos posra
|
||||||
minSchema = last.Schema
|
minSchema = last.Schema
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var annos annotations.Annotations
|
||||||
|
|
||||||
// First iteration to find out two things:
|
// First iteration to find out two things:
|
||||||
// - What's the smallest relevant schema?
|
// - What's the smallest relevant schema?
|
||||||
// - Are all data points histograms?
|
// - Are all data points histograms?
|
||||||
|
@ -197,10 +199,12 @@ func histogramRate(points []HPoint, isCounter bool, metricName string, pos posra
|
||||||
if curr == nil {
|
if curr == nil {
|
||||||
return nil, annotations.New().Add(annotations.NewMixedFloatsHistogramsWarning(metricName, pos))
|
return nil, annotations.New().Add(annotations.NewMixedFloatsHistogramsWarning(metricName, pos))
|
||||||
}
|
}
|
||||||
// TODO(trevorwhitney): Check if isCounter is consistent with curr.CounterResetHint.
|
|
||||||
if !isCounter {
|
if !isCounter {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if curr.CounterResetHint == histogram.GaugeType {
|
||||||
|
annos.Add(annotations.NewNativeHistogramNotCounterWarning(metricName, pos))
|
||||||
|
}
|
||||||
if curr.Schema < minSchema {
|
if curr.Schema < minSchema {
|
||||||
minSchema = curr.Schema
|
minSchema = curr.Schema
|
||||||
}
|
}
|
||||||
|
@ -218,6 +222,8 @@ func histogramRate(points []HPoint, isCounter bool, metricName string, pos posra
|
||||||
}
|
}
|
||||||
prev = curr
|
prev = curr
|
||||||
}
|
}
|
||||||
|
} else if points[0].H.CounterResetHint != histogram.GaugeType || points[len(points)-1].H.CounterResetHint != histogram.GaugeType {
|
||||||
|
annos.Add(annotations.NewNativeHistogramNotGaugeWarning(metricName, pos))
|
||||||
}
|
}
|
||||||
|
|
||||||
h.CounterResetHint = histogram.GaugeType
|
h.CounterResetHint = histogram.GaugeType
|
||||||
|
|
|
@ -107,6 +107,8 @@ var (
|
||||||
BadBucketLabelWarning = fmt.Errorf("%w: bucket label %q is missing or has a malformed value", PromQLWarning, model.BucketLabel)
|
BadBucketLabelWarning = fmt.Errorf("%w: bucket label %q is missing or has a malformed value", PromQLWarning, model.BucketLabel)
|
||||||
MixedFloatsHistogramsWarning = fmt.Errorf("%w: encountered a mix of histograms and floats for metric name", PromQLWarning)
|
MixedFloatsHistogramsWarning = fmt.Errorf("%w: encountered a mix of histograms and floats for metric name", PromQLWarning)
|
||||||
MixedClassicNativeHistogramsWarning = fmt.Errorf("%w: vector contains a mix of classic and native histograms for metric name", PromQLWarning)
|
MixedClassicNativeHistogramsWarning = fmt.Errorf("%w: vector contains a mix of classic and native histograms for metric name", PromQLWarning)
|
||||||
|
NativeHistogramNotCounterWarning = fmt.Errorf("%w: this native histogram metric is not a counter:", PromQLWarning)
|
||||||
|
NativeHistogramNotGaugeWarning = fmt.Errorf("%w: this native histogram metric is not a gauge:", PromQLWarning)
|
||||||
|
|
||||||
PossibleNonCounterInfo = fmt.Errorf("%w: metric might not be a counter, name does not end in _total/_sum/_count/_bucket:", PromQLInfo)
|
PossibleNonCounterInfo = fmt.Errorf("%w: metric might not be a counter, name does not end in _total/_sum/_count/_bucket:", PromQLInfo)
|
||||||
HistogramQuantileForcedMonotonicityInfo = fmt.Errorf("%w: input to histogram_quantile needed to be fixed for monotonicity (see https://prometheus.io/docs/prometheus/latest/querying/functions/#histogram_quantile) for metric name", PromQLInfo)
|
HistogramQuantileForcedMonotonicityInfo = fmt.Errorf("%w: input to histogram_quantile needed to be fixed for monotonicity (see https://prometheus.io/docs/prometheus/latest/querying/functions/#histogram_quantile) for metric name", PromQLInfo)
|
||||||
|
@ -166,6 +168,24 @@ func NewMixedClassicNativeHistogramsWarning(metricName string, pos posrange.Posi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewNativeHistogramNotCounterWarning is used when histogramRate is called
|
||||||
|
// with isCounter set to true on a gauge histogram.
|
||||||
|
func NewNativeHistogramNotCounterWarning(metricName string, pos posrange.PositionRange) error {
|
||||||
|
return annoErr{
|
||||||
|
PositionRange: pos,
|
||||||
|
Err: fmt.Errorf("%w %q", NativeHistogramNotCounterWarning, metricName),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewNativeHistogramNotGaugeWarning is used when histogramRate is called
|
||||||
|
// with isCounter set to false on a counter histogram.
|
||||||
|
func NewNativeHistogramNotGaugeWarning(metricName string, pos posrange.PositionRange) error {
|
||||||
|
return annoErr{
|
||||||
|
PositionRange: pos,
|
||||||
|
Err: fmt.Errorf("%w %q", NativeHistogramNotGaugeWarning, metricName),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// NewPossibleNonCounterInfo is used when a named counter metric with only float samples does not
|
// NewPossibleNonCounterInfo is used when a named counter metric with only float samples does not
|
||||||
// have the suffixes _total, _sum, _count, or _bucket.
|
// have the suffixes _total, _sum, _count, or _bucket.
|
||||||
func NewPossibleNonCounterInfo(metricName string, pos posrange.PositionRange) error {
|
func NewPossibleNonCounterInfo(metricName string, pos posrange.PositionRange) error {
|
||||||
|
|
Loading…
Reference in a new issue