diff --git a/internal/metrics/datum/buckets.go b/internal/metrics/datum/buckets.go index 4d4a11736..ef15f0cb0 100644 --- a/internal/metrics/datum/buckets.go +++ b/internal/metrics/datum/buckets.go @@ -44,7 +44,7 @@ func (d *Buckets) Observe(v float64, ts time.Time) { defer d.Unlock() for i, b := range d.Buckets { - if b.Range.Contains(v) { + if v <= b.Range.Max { d.Buckets[i].Count++ break } diff --git a/internal/runtime/compiler/codegen/codegen.go b/internal/runtime/compiler/codegen/codegen.go index e18a05a4d..30467b796 100644 --- a/internal/runtime/compiler/codegen/codegen.go +++ b/internal/runtime/compiler/codegen/codegen.go @@ -130,17 +130,12 @@ func (c *codegen) VisitBefore(node ast.Node) (ast.Visitor, ast.Node) { c.errorf(n.Pos(), "a histogram need at least two boundaries") return nil, n } - if n.Buckets[0] >= n.Buckets[1] { - c.errorf(n.Pos(), "buckets boundaries must be sorted") - return nil, n - } if n.Buckets[0] > 0 { m.Buckets = append(m.Buckets, datum.Range{0, n.Buckets[0]}) } - m.Buckets = append(m.Buckets, datum.Range{n.Buckets[0], n.Buckets[1]}) - min := n.Buckets[1] - for _, max := range n.Buckets[2:] { + min := n.Buckets[0] + for _, max := range n.Buckets[1:] { if max <= min { c.errorf(n.Pos(), "buckets boundaries must be sorted") return nil, n diff --git a/internal/runtime/runtime_integration_test.go b/internal/runtime/runtime_integration_test.go index 883c832a5..f5b8b28b2 100644 --- a/internal/runtime/runtime_integration_test.go +++ b/internal/runtime/runtime_integration_test.go @@ -71,6 +71,7 @@ histogram hist3 by f buckets -1, 0, 1 `b 3 b 3 b 3 +b 0 `, 0, metrics.MetricSlice{ @@ -84,7 +85,10 @@ b 3 { Value: &datum.Buckets{ Buckets: []datum.BucketCount{ - {Range: datum.Range{Min: 0, Max: 1}}, + { + Range: datum.Range{Min: 0, Max: 1}, + Count: 1, + }, {Range: datum.Range{Min: 1, Max: 2}}, { Range: datum.Range{Min: 2, Max: 4}, @@ -93,7 +97,7 @@ b 3 {Range: datum.Range{Min: 4, Max: 8}}, {Range: datum.Range{Min: 8, Max: math.Inf(+1)}}, }, - Count: 3, + Count: 4, Sum: 9, }, }, @@ -111,7 +115,10 @@ b 3 Labels: []string{"b"}, Value: &datum.Buckets{ Buckets: []datum.BucketCount{ - {Range: datum.Range{Min: 0, Max: 1}}, + { + Range: datum.Range{Min: 0, Max: 1}, + Count: 1, + }, {Range: datum.Range{Min: 1, Max: 2}}, { Range: datum.Range{Min: 2, Max: 4}, @@ -120,7 +127,7 @@ b 3 {Range: datum.Range{Min: 4, Max: 8}}, {Range: datum.Range{Min: 8, Max: math.Inf(+1)}}, }, - Count: 3, + Count: 4, Sum: 9, }, }, @@ -139,14 +146,17 @@ b 3 Labels: []string{"b"}, Value: &datum.Buckets{ Buckets: []datum.BucketCount{ - {Range: datum.Range{Min: -1, Max: 0}}, + { + Range: datum.Range{Min: -1, Max: 0}, + Count: 1, + }, {Range: datum.Range{Min: 0, Max: 1}}, { Range: datum.Range{Min: 1, Max: math.Inf(+1)}, Count: 3, }, }, - Count: 3, + Count: 4, Sum: 9, }, },