From 717f78b01497c17c9c52bed896b7877089c49bbc Mon Sep 17 00:00:00 2001 From: Konstantin Bogomolov Date: Wed, 13 Apr 2022 11:13:31 -0700 Subject: [PATCH] Add additional init checks to ExponentialBucketer. PiperOrigin-RevId: 441529868 --- pkg/metric/metric.go | 6 ++++++ pkg/metric/metric_test.go | 3 +++ 2 files changed, 9 insertions(+) diff --git a/pkg/metric/metric.go b/pkg/metric/metric.go index 97f034976..2010d52d9 100644 --- a/pkg/metric/metric.go +++ b/pkg/metric/metric.go @@ -551,6 +551,9 @@ func NewExponentialBucketer(numFiniteBuckets int, width uint64, scale, growth fl if numFiniteBuckets < exponentialMinBuckets || numFiniteBuckets > exponentialMaxBuckets { panic(fmt.Sprintf("number of finite buckets must be in [%d, %d]", exponentialMinBuckets, exponentialMaxBuckets)) } + if scale < 0 || growth < 0 { + panic(fmt.Sprintf("scale and growth for exponential buckets must be >0, got scale=%f and growth=%f", scale, growth)) + } b := &ExponentialBucketer{ numFiniteBuckets: numFiniteBuckets, width: float64(width), @@ -562,6 +565,9 @@ func NewExponentialBucketer(numFiniteBuckets int, width uint64, scale, growth fl b.lowerBounds[0] = 0 for i := 1; i <= numFiniteBuckets; i++ { b.lowerBounds[i] = int64(b.width*float64(i) + b.scale*math.Pow(b.growth, float64(i-1))) + if b.lowerBounds[i] < 0 { + panic(fmt.Sprintf("encountered bucket width overflow at bucket %d", i)) + } } b.maxSample = b.lowerBounds[numFiniteBuckets] - 1 return b diff --git a/pkg/metric/metric_test.go b/pkg/metric/metric_test.go index 89d57ffa0..a7adc7390 100644 --- a/pkg/metric/metric_test.go +++ b/pkg/metric/metric_test.go @@ -830,6 +830,9 @@ func TestBucketerPanics(t *testing.T) { "NewDurationBucketer @ 2": func() { NewDurationBucketer(2, time.Second, time.Minute) }, + "NewDurationBucketer @ 80": func() { + NewDurationBucketer(80, time.Microsecond, 50*time.Microsecond) + }, } { t.Run(name, func(t *testing.T) { var recovered interface{}