mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-25 13:44:05 -08:00
promql: Refine zero bucket treatment in histogramQuantile
Essentially, this mirrors the existing behavior for negative buckets: If a histogram has only negative buckets, the upper bound of the zero bucket is assumed to be zero. Furthermore, it makes sure that the zero bucket boundaries are not modified if a histogram that has no buckets at all but samples in the zero bucket. Also, add an TODO to vet if we really want this behavior. Signed-off-by: beorn7 <beorn@grafana.com>
This commit is contained in:
parent
095b6c93dd
commit
ffaabea91a
|
@ -3244,15 +3244,15 @@ func TestSparseHistogram_HistogramQuantile(t *testing.T) {
|
||||||
},
|
},
|
||||||
{ // Zero bucket.
|
{ // Zero bucket.
|
||||||
quantile: "1",
|
quantile: "1",
|
||||||
value: 0.001,
|
value: 0,
|
||||||
},
|
},
|
||||||
{ // Zero bucket.
|
{ // Zero bucket.
|
||||||
quantile: "0.99",
|
quantile: "0.99",
|
||||||
value: 0.0008799999999999991,
|
value: -6.000000000000048e-05,
|
||||||
},
|
},
|
||||||
{ // Zero bucket.
|
{ // Zero bucket.
|
||||||
quantile: "0.9",
|
quantile: "0.9",
|
||||||
value: -0.00019999999999999933,
|
value: -0.0005999999999999996,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
quantile: "0.5",
|
quantile: "0.5",
|
||||||
|
|
|
@ -127,7 +127,10 @@ func bucketQuantile(q float64, buckets buckets) float64 {
|
||||||
// TODO(beorn7): Find an interpolation method that is a better fit for
|
// TODO(beorn7): Find an interpolation method that is a better fit for
|
||||||
// exponential buckets (and think about configurable interpolation).
|
// exponential buckets (and think about configurable interpolation).
|
||||||
//
|
//
|
||||||
// A natural lower bound of 0 is assumed if the histogram has no negative buckets.
|
// A natural lower bound of 0 is assumed if the histogram has only positive
|
||||||
|
// buckets. Likewise, a natural upper bound of 0 is assumed if the histogram has
|
||||||
|
// only negative buckets.
|
||||||
|
// TODO(beorn7): Come to terms if we want that.
|
||||||
//
|
//
|
||||||
// There are a number of special cases (once we have a way to report errors
|
// There are a number of special cases (once we have a way to report errors
|
||||||
// happening during evaluations of AST functions, we should report those
|
// happening during evaluations of AST functions, we should report those
|
||||||
|
@ -163,10 +166,16 @@ func histogramQuantile(q float64, h *histogram.FloatHistogram) float64 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if bucket.Lower < 0 && bucket.Upper > 0 && len(h.NegativeBuckets) == 0 {
|
if bucket.Lower < 0 && bucket.Upper > 0 {
|
||||||
// The result is in the zero bucket and the histogram has no
|
if len(h.NegativeBuckets) == 0 && len(h.PositiveBuckets) > 0 {
|
||||||
// negative buckets. So we consider 0 to be the lower bound.
|
// The result is in the zero bucket and the histogram has only
|
||||||
bucket.Lower = 0
|
// positive buckets. So we consider 0 to be the lower bound.
|
||||||
|
bucket.Lower = 0
|
||||||
|
} else if len(h.PositiveBuckets) == 0 && len(h.NegativeBuckets) > 0 {
|
||||||
|
// The result is in the zero bucket and the histogram has only
|
||||||
|
// negative buckets. So we consider 0 to be the upper bound.
|
||||||
|
bucket.Upper = 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Due to numerical inaccuracies, we could end up with a higher count
|
// Due to numerical inaccuracies, we could end up with a higher count
|
||||||
// than h.Count. Thus, make sure count is never higher than h.Count.
|
// than h.Count. Thus, make sure count is never higher than h.Count.
|
||||||
|
|
Loading…
Reference in a new issue