github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/usagestats/stats_test.go (about) 1 package usagestats 2 3 import ( 4 "runtime" 5 "sync" 6 "testing" 7 "time" 8 9 "github.com/grafana/loki/pkg/util/build" 10 11 "github.com/google/uuid" 12 jsoniter "github.com/json-iterator/go" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func Test_BuildReport(t *testing.T) { 17 now := time.Now() 18 seed := &ClusterSeed{ 19 UID: uuid.New().String(), 20 CreatedAt: now, 21 } 22 23 Edition("non-OSS") 24 Edition("OSS") 25 Target("distributor") 26 Target("compactor") 27 NewString("compression").Set("snappy") 28 NewString("compression").Set("lz4") 29 NewInt("compression_ratio").Set(50) 30 NewInt("compression_ratio").Set(100) 31 NewFloat("size_mb").Set(100.1) 32 NewFloat("size_mb").Set(200.1) 33 NewCounter("lines_written").Inc(200) 34 s := NewStatistics("query_throughput") 35 s.Record(25) 36 s = NewStatistics("query_throughput") 37 s.Record(300) 38 s.Record(5) 39 w := NewWordCounter("active_tenants") 40 w.Add("buz") 41 w = NewWordCounter("active_tenants") 42 w.Add("foo") 43 w.Add("bar") 44 w.Add("foo") 45 46 r := buildReport(seed, now.Add(time.Hour)) 47 require.Equal(t, r.Arch, runtime.GOARCH) 48 require.Equal(t, r.Os, runtime.GOOS) 49 require.Equal(t, r.PrometheusVersion, build.GetVersion()) 50 require.Equal(t, r.Edition, "OSS") 51 require.Equal(t, r.Target, "compactor") 52 require.Equal(t, r.Metrics["num_cpu"], runtime.NumCPU()) 53 // Don't check num_goroutine because it could have changed since the report was created. 54 require.Equal(t, r.Metrics["compression"], "lz4") 55 require.Equal(t, r.Metrics["compression_ratio"], int64(100)) 56 require.Equal(t, r.Metrics["size_mb"], 200.1) 57 require.Equal(t, r.Metrics["lines_written"].(map[string]interface{})["total"], int64(200)) 58 require.Equal(t, r.Metrics["query_throughput"].(map[string]interface{})["min"], float64(5)) 59 require.Equal(t, r.Metrics["query_throughput"].(map[string]interface{})["max"], float64(300)) 60 require.Equal(t, r.Metrics["query_throughput"].(map[string]interface{})["count"], int64(3)) 61 require.Equal(t, r.Metrics["query_throughput"].(map[string]interface{})["avg"], float64(25+300+5)/3) 62 require.Equal(t, r.Metrics["active_tenants"], int64(3)) 63 64 out, _ := jsoniter.MarshalIndent(r, "", " ") 65 t.Log(string(out)) 66 } 67 68 func TestCounter(t *testing.T) { 69 c := NewCounter("test_counter") 70 c.Inc(100) 71 c.Inc(200) 72 c.Inc(300) 73 time.Sleep(1 * time.Second) 74 c.updateRate() 75 v := c.Value() 76 require.Equal(t, int64(600), v["total"]) 77 require.GreaterOrEqual(t, v["rate"], float64(590)) 78 c.reset() 79 require.Equal(t, int64(0), c.Value()["total"]) 80 require.Equal(t, float64(0), c.Value()["rate"]) 81 } 82 83 func TestStatistic(t *testing.T) { 84 s := NewStatistics("test_stats") 85 s.Record(100) 86 s.Record(200) 87 s.Record(300) 88 v := s.Value() 89 require.Equal(t, float64(100), v["min"]) 90 require.Equal(t, float64(300), v["max"]) 91 require.Equal(t, int64(3), v["count"]) 92 require.Equal(t, float64(100+200+300)/3, v["avg"]) 93 require.Equal(t, float64(81.64965809277261), v["stddev"]) 94 require.Equal(t, float64(6666.666666666667), v["stdvar"]) 95 } 96 97 func TestWordCounter(t *testing.T) { 98 w := NewWordCounter("test_words_count") 99 var wg sync.WaitGroup 100 for i := 0; i < 100; i++ { 101 wg.Add(1) 102 go func() { 103 defer wg.Done() 104 w.Add("foo") 105 w.Add("bar") 106 w.Add("foo") 107 }() 108 } 109 wg.Wait() 110 require.Equal(t, int64(2), w.Value()) 111 } 112 113 func TestPanics(t *testing.T) { 114 require.Panics(t, func() { 115 NewStatistics("panicstats") 116 NewWordCounter("panicstats") 117 }) 118 119 require.Panics(t, func() { 120 NewWordCounter("panicwordcounter") 121 NewCounter("panicwordcounter") 122 }) 123 124 require.Panics(t, func() { 125 NewCounter("paniccounter") 126 NewStatistics("paniccounter") 127 }) 128 129 require.Panics(t, func() { 130 NewFloat("panicfloat") 131 NewInt("panicfloat") 132 }) 133 134 require.Panics(t, func() { 135 NewInt("panicint") 136 NewString("panicint") 137 }) 138 139 require.Panics(t, func() { 140 NewString("panicstring") 141 NewFloat("panicstring") 142 }) 143 144 require.Panics(t, func() { 145 NewFloat(targetKey) 146 Target("new target") 147 }) 148 149 require.Panics(t, func() { 150 NewFloat(editionKey) 151 Edition("new edition") 152 }) 153 }