mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-12 16:44:05 -08:00
aa82fe198f
So far, `ValidateHistogram` would not detect if the count did not include the count in the zero bucket. This commit fixes the problem and updates all the tests that have been undetected offenders so far. Note that this problem would only ever create false negatives, so we never falsely rejected to store a histogram because of it. On the other hand, `ValidateFloatHistogram` has been to strict with the count being at least as large as the sum of the counts in all the buckets. Float precision issues could create false positives here, see products of PromQL evaluations, it's actually quite hard to put an upper limit no the floating point imprecision. Users could produce the weirdest expressions, maxing out float precision problems. Therefore, this commit simply removes that particular check from `ValidateFloatHistogram`. Signed-off-by: beorn7 <beorn@grafana.com>
121 lines
3.4 KiB
Go
121 lines
3.4 KiB
Go
// Copyright 2023 The Prometheus Authors
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package tsdbutil
|
|
|
|
import (
|
|
"math/rand"
|
|
|
|
"github.com/prometheus/prometheus/model/histogram"
|
|
)
|
|
|
|
func GenerateTestHistograms(n int) (r []*histogram.Histogram) {
|
|
for i := 0; i < n; i++ {
|
|
h := GenerateTestHistogram(i)
|
|
if i > 0 {
|
|
h.CounterResetHint = histogram.NotCounterReset
|
|
}
|
|
r = append(r, h)
|
|
}
|
|
return r
|
|
}
|
|
|
|
// GenerateTestHistogram but it is up to the user to set any known counter reset hint.
|
|
func GenerateTestHistogram(i int) *histogram.Histogram {
|
|
return &histogram.Histogram{
|
|
Count: 12 + uint64(i*9),
|
|
ZeroCount: 2 + uint64(i),
|
|
ZeroThreshold: 0.001,
|
|
Sum: 18.4 * float64(i+1),
|
|
Schema: 1,
|
|
PositiveSpans: []histogram.Span{
|
|
{Offset: 0, Length: 2},
|
|
{Offset: 1, Length: 2},
|
|
},
|
|
PositiveBuckets: []int64{int64(i + 1), 1, -1, 0},
|
|
NegativeSpans: []histogram.Span{
|
|
{Offset: 0, Length: 2},
|
|
{Offset: 1, Length: 2},
|
|
},
|
|
NegativeBuckets: []int64{int64(i + 1), 1, -1, 0},
|
|
}
|
|
}
|
|
|
|
func GenerateTestGaugeHistograms(n int) (r []*histogram.Histogram) {
|
|
for x := 0; x < n; x++ {
|
|
r = append(r, GenerateTestGaugeHistogram(rand.Intn(n)))
|
|
}
|
|
return r
|
|
}
|
|
|
|
func GenerateTestGaugeHistogram(i int) *histogram.Histogram {
|
|
h := GenerateTestHistogram(i)
|
|
h.CounterResetHint = histogram.GaugeType
|
|
return h
|
|
}
|
|
|
|
func GenerateTestFloatHistograms(n int) (r []*histogram.FloatHistogram) {
|
|
for i := 0; i < n; i++ {
|
|
h := GenerateTestFloatHistogram(i)
|
|
if i > 0 {
|
|
h.CounterResetHint = histogram.NotCounterReset
|
|
}
|
|
r = append(r, h)
|
|
}
|
|
return r
|
|
}
|
|
|
|
// GenerateTestFloatHistogram but it is up to the user to set any known counter reset hint.
|
|
func GenerateTestFloatHistogram(i int) *histogram.FloatHistogram {
|
|
return &histogram.FloatHistogram{
|
|
Count: 12 + float64(i*9),
|
|
ZeroCount: 2 + float64(i),
|
|
ZeroThreshold: 0.001,
|
|
Sum: 18.4 * float64(i+1),
|
|
Schema: 1,
|
|
PositiveSpans: []histogram.Span{
|
|
{Offset: 0, Length: 2},
|
|
{Offset: 1, Length: 2},
|
|
},
|
|
PositiveBuckets: []float64{float64(i + 1), float64(i + 2), float64(i + 1), float64(i + 1)},
|
|
NegativeSpans: []histogram.Span{
|
|
{Offset: 0, Length: 2},
|
|
{Offset: 1, Length: 2},
|
|
},
|
|
NegativeBuckets: []float64{float64(i + 1), float64(i + 2), float64(i + 1), float64(i + 1)},
|
|
}
|
|
}
|
|
|
|
func GenerateTestGaugeFloatHistograms(n int) (r []*histogram.FloatHistogram) {
|
|
for x := 0; x < n; x++ {
|
|
r = append(r, GenerateTestGaugeFloatHistogram(rand.Intn(n)))
|
|
}
|
|
return r
|
|
}
|
|
|
|
func GenerateTestGaugeFloatHistogram(i int) *histogram.FloatHistogram {
|
|
h := GenerateTestFloatHistogram(i)
|
|
h.CounterResetHint = histogram.GaugeType
|
|
return h
|
|
}
|
|
|
|
func SetHistogramNotCounterReset(h *histogram.Histogram) *histogram.Histogram {
|
|
h.CounterResetHint = histogram.NotCounterReset
|
|
return h
|
|
}
|
|
|
|
func SetFloatHistogramNotCounterReset(h *histogram.FloatHistogram) *histogram.FloatHistogram {
|
|
h.CounterResetHint = histogram.NotCounterReset
|
|
return h
|
|
}
|