github.com/netdata/go.d.plugin@v0.58.1/pkg/metrics/unique_counter_test.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package metrics 4 5 import ( 6 "fmt" 7 "strconv" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 ) 12 13 func TestHyperLogLogUniqueCounter_Value(t *testing.T) { 14 for _, useHLL := range []bool{true, false} { 15 t.Run(fmt.Sprintf("HLL=%v", useHLL), func(t *testing.T) { 16 c := NewUniqueCounter(useHLL) 17 assert.Equal(t, 0, c.Value()) 18 19 c.Insert("foo") 20 assert.Equal(t, 1, c.Value()) 21 22 c.Insert("foo") 23 assert.Equal(t, 1, c.Value()) 24 25 c.Insert("bar") 26 assert.Equal(t, 2, c.Value()) 27 28 c.Insert("baz") 29 assert.Equal(t, 3, c.Value()) 30 31 c.Reset() 32 assert.Equal(t, 0, c.Value()) 33 34 c.Insert("foo") 35 assert.Equal(t, 1, c.Value()) 36 }) 37 } 38 } 39 40 func TestHyperLogLogUniqueCounter_WriteTo(t *testing.T) { 41 for _, useHLL := range []bool{true, false} { 42 t.Run(fmt.Sprintf("HLL=%v", useHLL), func(t *testing.T) { 43 c := NewUniqueCounterVec(useHLL) 44 c.Get("a").Insert("foo") 45 c.Get("a").Insert("bar") 46 c.Get("b").Insert("foo") 47 48 m := map[string]int64{} 49 c.WriteTo(m, "pi", 100, 1) 50 assert.Len(t, m, 2) 51 assert.EqualValues(t, 200, m["pi_a"]) 52 assert.EqualValues(t, 100, m["pi_b"]) 53 }) 54 } 55 } 56 57 func TestUniqueCounterVec_Reset(t *testing.T) { 58 for _, useHLL := range []bool{true, false} { 59 t.Run(fmt.Sprintf("HLL=%v", useHLL), func(t *testing.T) { 60 c := NewUniqueCounterVec(useHLL) 61 c.Get("a").Insert("foo") 62 c.Get("a").Insert("bar") 63 c.Get("b").Insert("foo") 64 65 assert.Equal(t, 2, len(c.Items)) 66 assert.Equal(t, 2, c.Get("a").Value()) 67 assert.Equal(t, 1, c.Get("b").Value()) 68 69 c.Reset() 70 assert.Equal(t, 2, len(c.Items)) 71 assert.Equal(t, 0, c.Get("a").Value()) 72 assert.Equal(t, 0, c.Get("b").Value()) 73 }) 74 } 75 } 76 77 func BenchmarkUniqueCounter_Insert(b *testing.B) { 78 benchmarks := []struct { 79 name string 80 same bool 81 hyperloglog bool 82 nop bool 83 }{ 84 85 {"map-same", true, false, false}, 86 {"hll-same", true, true, false}, 87 88 {"nop", false, false, true}, 89 {"map-diff", false, false, false}, 90 {"hll-diff", false, true, false}, 91 } 92 for _, bm := range benchmarks { 93 b.Run(bm.name, func(b *testing.B) { 94 c := NewUniqueCounter(bm.hyperloglog) 95 if bm.same { 96 for i := 0; i < b.N; i++ { 97 c.Insert("foo") 98 } 99 } else if bm.nop { 100 for i := 0; i < b.N; i++ { 101 strconv.Itoa(i) 102 } 103 } else { 104 for i := 0; i < b.N; i++ { 105 c.Insert(strconv.Itoa(i)) 106 } 107 } 108 }) 109 } 110 } 111 112 func BenchmarkUniqueCounterVec_Insert(b *testing.B) { 113 benchmarks := []struct { 114 name string 115 same bool 116 hyperloglog bool 117 nop bool 118 }{ 119 120 {"map-same", true, false, false}, 121 {"hll-same", true, true, false}, 122 123 {"nop", false, false, true}, 124 {"map-diff", false, false, false}, 125 {"hll-diff", false, true, false}, 126 } 127 for _, bm := range benchmarks { 128 b.Run(bm.name, func(b *testing.B) { 129 c := NewUniqueCounterVec(bm.hyperloglog) 130 if bm.same { 131 for i := 0; i < b.N; i++ { 132 c.Get("a").Insert("foo") 133 } 134 } else if bm.nop { 135 for i := 0; i < b.N; i++ { 136 strconv.Itoa(i) 137 } 138 } else { 139 for i := 0; i < b.N; i++ { 140 c.Get("a").Insert(strconv.Itoa(i)) 141 } 142 } 143 }) 144 } 145 }