Histogram: Fix bug with negative schemas (#1054)

* Histogram: Expose bug with negative schema

Signed-off-by: beorn7 <beorn@grafana.com>

* Histogram: Fix bug with negative schemas

Signed-off-by: beorn7 <beorn@grafana.com>
This commit is contained in:
Björn Rabenstein 2022-05-15 20:22:30 +02:00 committed by GitHub
parent b2372302ca
commit eb59a7b3d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 4 deletions

View File

@ -595,7 +595,8 @@ func (hc *histogramCounts) observe(v float64, bucket int, doSparse bool) {
if frac == 0.5 { if frac == 0.5 {
sparseKey-- sparseKey--
} }
sparseKey /= 1 << -sparseSchema div := 1 << -sparseSchema
sparseKey = (sparseKey + div - 1) / div
} }
switch { switch {
case v > sparseZeroThreshold: case v > sparseZeroThreshold:

View File

@ -355,7 +355,8 @@ func TestBuckets(t *testing.T) {
} }
got = ExponentialBucketsRange(1, 100, 10) got = ExponentialBucketsRange(1, 100, 10)
want = []float64{1.0, 1.6681005372000588, 2.782559402207125, want = []float64{
1.0, 1.6681005372000588, 2.782559402207125,
4.641588833612779, 7.742636826811273, 12.915496650148842, 4.641588833612779, 7.742636826811273, 12.915496650148842,
21.544346900318846, 35.93813663804629, 59.94842503189414, 21.544346900318846, 35.93813663804629, 59.94842503189414,
100.00000000000007, 100.00000000000007,
@ -469,7 +470,6 @@ func TestHistogramExemplar(t *testing.T) {
} }
func TestSparseHistogram(t *testing.T) { func TestSparseHistogram(t *testing.T) {
scenarios := []struct { scenarios := []struct {
name string name string
observations []float64 // With simulated interval of 1m. observations []float64 // With simulated interval of 1m.
@ -498,6 +498,27 @@ func TestSparseHistogram(t *testing.T) {
factor: 1.2, factor: 1.2,
want: `sample_count:6 sample_sum:7.4 sb_schema:2 sb_zero_threshold:2.938735877055719e-39 sb_zero_count:1 sb_positive:<span:<offset:0 length:5 > delta:1 delta:-1 delta:2 delta:-2 delta:2 > `, want: `sample_count:6 sample_sum:7.4 sb_schema:2 sb_zero_threshold:2.938735877055719e-39 sb_zero_count:1 sb_positive:<span:<offset:0 length:5 > delta:1 delta:-1 delta:2 delta:-2 delta:2 > `,
}, },
{
name: "factor 4 results in schema -1",
observations: []float64{
0.5, 1, // Bucket 0: (0.25, 1]
1.5, 2, 3, 3.5, // Bucket 1: (1, 4]
5, 6, 7, // Bucket 2: (4, 16]
33.33, // Bucket 3: (16, 64]
},
factor: 4,
want: `sample_count:10 sample_sum:62.83 sb_schema:-1 sb_zero_threshold:2.938735877055719e-39 sb_zero_count:0 sb_positive:<span:<offset:0 length:4 > delta:2 delta:2 delta:-1 delta:-2 > `,
},
{
name: "factor 17 results in schema -2",
observations: []float64{
0.5, 1, // Bucket 0: (0.0625, 1]
1.5, 2, 3, 3.5, 5, 6, 7, // Bucket 1: (1, 16]
33.33, // Bucket 2: (16, 256]
},
factor: 17,
want: `sample_count:10 sample_sum:62.83 sb_schema:-2 sb_zero_threshold:2.938735877055719e-39 sb_zero_count:0 sb_positive:<span:<offset:0 length:3 > delta:2 delta:5 delta:-6 > `,
},
{ {
name: "negative buckets", name: "negative buckets",
observations: []float64{0, -1, -1.2, -1.4, -1.8, -2}, observations: []float64{0, -1, -1.2, -1.4, -1.8, -2},
@ -662,7 +683,6 @@ func TestSparseHistogram(t *testing.T) {
} }
}) })
} }
} }
func TestSparseHistogramConcurrency(t *testing.T) { func TestSparseHistogramConcurrency(t *testing.T) {