github.com/netdata/go.d.plugin@v0.58.1/pkg/metrics/histogram_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package metrics 4 5 import ( 6 "testing" 7 8 "github.com/stretchr/testify/assert" 9 ) 10 11 func TestLinearBuckets(t *testing.T) { 12 buckets := LinearBuckets(0, 1, 10) 13 assert.Len(t, buckets, 10) 14 assert.EqualValues(t, 0, buckets[0]) 15 assert.EqualValues(t, 5.0, buckets[5]) 16 assert.EqualValues(t, 9.0, buckets[9]) 17 18 assert.Panics(t, func() { 19 LinearBuckets(0, 1, 0) 20 }) 21 } 22 23 func TestExponentialBuckets(t *testing.T) { 24 buckets := ExponentialBuckets(1, 2, 10) 25 assert.Len(t, buckets, 10) 26 assert.EqualValues(t, 1, buckets[0]) 27 assert.EqualValues(t, 32.0, buckets[5]) 28 assert.EqualValues(t, 512.0, buckets[9]) 29 30 assert.Panics(t, func() { 31 ExponentialBuckets(1, 2, 0) 32 }) 33 assert.Panics(t, func() { 34 ExponentialBuckets(0, 2, 2) 35 }) 36 37 assert.Panics(t, func() { 38 ExponentialBuckets(1, 1, 2) 39 }) 40 } 41 42 func TestNewHistogram(t *testing.T) { 43 h := NewHistogram(nil).(*histogram) 44 assert.EqualValues(t, 0, h.count) 45 assert.EqualValues(t, 0.0, h.sum) 46 assert.Equal(t, DefBuckets, h.upperBounds) 47 48 h = NewHistogram([]float64{1, 10, 5}).(*histogram) 49 assert.Equal(t, []float64{1, 5, 10}, h.upperBounds) 50 assert.Len(t, h.buckets, 3) 51 } 52 53 func TestHistogram_WriteTo(t *testing.T) { 54 h := NewHistogram([]float64{1, 2, 3}) 55 m := map[string]int64{} 56 h.WriteTo(m, "pi", 100, 1) 57 assert.Len(t, m, 5) 58 assert.EqualValues(t, 0, m["pi_count"]) 59 assert.EqualValues(t, 0, m["pi_sum"]) 60 assert.EqualValues(t, 0, m["pi_bucket_1"]) 61 assert.EqualValues(t, 0, m["pi_bucket_2"]) 62 assert.EqualValues(t, 0, m["pi_bucket_3"]) 63 64 h.Observe(0) 65 h.Observe(1.5) 66 h.Observe(3.5) 67 h.WriteTo(m, "pi", 100, 1) 68 assert.Len(t, m, 5) 69 assert.EqualValues(t, 3, m["pi_count"]) 70 assert.EqualValues(t, 500, m["pi_sum"]) 71 assert.EqualValues(t, 1, m["pi_bucket_1"]) 72 assert.EqualValues(t, 2, m["pi_bucket_2"]) 73 assert.EqualValues(t, 2, m["pi_bucket_3"]) 74 } 75 76 func TestHistogram_searchBucketIndex(t *testing.T) { 77 h := NewHistogram(LinearBuckets(1, 1, 5)).(*histogram) // [1, 2, ..., 5] 78 assert.Equal(t, 0, h.searchBucketIndex(0.1)) 79 assert.Equal(t, 1, h.searchBucketIndex(1.1)) 80 assert.Equal(t, 5, h.searchBucketIndex(8.1)) 81 82 h = NewHistogram(LinearBuckets(1, 1, 40)).(*histogram) // [1, 2, ..., 5] 83 assert.Equal(t, 0, h.searchBucketIndex(0.1)) 84 assert.Equal(t, 1, h.searchBucketIndex(1.1)) 85 assert.Equal(t, 5, h.searchBucketIndex(5.1)) 86 assert.Equal(t, 7, h.searchBucketIndex(8)) 87 assert.Equal(t, 39, h.searchBucketIndex(39.5)) 88 assert.Equal(t, 40, h.searchBucketIndex(40.5)) 89 } 90 91 func BenchmarkHistogram_Observe(b *testing.B) { 92 benchmarks := []struct { 93 name string 94 buckets []float64 95 }{ 96 {"default", nil}, 97 {"len_10", LinearBuckets(0, 0.1, 10)}, 98 {"len_20", LinearBuckets(0, 0.1, 20)}, 99 {"len_30", LinearBuckets(0, 0.1, 30)}, 100 {"len_40", LinearBuckets(0, 0.1, 40)}, 101 } 102 for _, bm := range benchmarks { 103 b.Run(bm.name, func(b *testing.B) { 104 h := NewHistogram(bm.buckets) 105 for i := 0; i < b.N; i++ { 106 h.Observe(2.5) 107 } 108 }) 109 } 110 } 111 112 func BenchmarkHistogram_WriteTo(b *testing.B) { 113 benchmarks := []struct { 114 name string 115 buckets []float64 116 }{ 117 {"default", nil}, 118 {"len_10", LinearBuckets(0, 0.1, 10)}, 119 {"len_20", LinearBuckets(0, 0.1, 20)}, 120 {"len_30", LinearBuckets(0, 0.1, 30)}, 121 {"len_40", LinearBuckets(0, 0.1, 40)}, 122 } 123 for _, bm := range benchmarks { 124 b.Run(bm.name, func(b *testing.B) { 125 h := NewHistogram(bm.buckets) 126 h.Observe(0.1) 127 h.Observe(0.01) 128 h.Observe(0.5) 129 h.Observe(10) 130 m := map[string]int64{} 131 for i := 0; i < b.N; i++ { 132 h.WriteTo(m, "pi", 100, 1) 133 } 134 }) 135 } 136 }