github.com/GuanceCloud/cliutils@v1.1.21/pipeline/stats/metric_event_test.go (about) 1 // Unless explicitly stated otherwise all files in this repository are licensed 2 // under the MIT License. 3 // This product includes software developed at Guance Cloud (https://www.guance.com/). 4 // Copyright 2021-present Guance, Inc. 5 6 package stats 7 8 import ( 9 "fmt" 10 "sync" 11 "testing" 12 "time" 13 14 "github.com/GuanceCloud/cliutils/point" 15 "github.com/prometheus/client_golang/prometheus" 16 dto "github.com/prometheus/client_model/go" 17 "github.com/stretchr/testify/assert" 18 ) 19 20 func TestPlChangeEvent(t *testing.T) { 21 stats := NewRecStats("pl", "test", defaultLabelNames, 100) 22 23 count := 0 24 25 var g sync.WaitGroup 26 g.Add(1) 27 go func() { 28 defer g.Done() 29 for { 30 if len(stats.event.ch) == 0 { 31 time.Sleep(time.Millisecond * 10) 32 } else { 33 break 34 } 35 } 36 for i := 0; i < 299; i++ { 37 select { 38 case <-stats.event.ReadChan(): 39 count++ 40 default: 41 } 42 } 43 }() 44 45 g.Add(1) 46 go func() { 47 defer g.Done() 48 for i := 0; i < 199; i++ { 49 stats.WriteEvent(&ChangeEvent{ 50 Name: fmt.Sprintf("%d.p", i), 51 NS: fmt.Sprintf("%d", i), 52 Op: EventOpAdd, 53 }, nil) 54 } 55 }() 56 g.Wait() 57 58 assert.Less(t, 0, count) 59 stats = NewRecStats("pl", "test", defaultLabelNames, 100) 60 61 for i := 33; i < 256; i++ { 62 tmp := []*ChangeEvent{} 63 for j := 0; j < i%32; j++ { 64 c := ChangeEvent{ 65 Name: fmt.Sprint(i, ".p"), 66 Category: point.Category(i % 32), // for testing only 67 NS: fmt.Sprint(i), 68 Time: time.Now(), 69 } 70 stats.WriteEvent(&c, nil) 71 tmp = append(tmp, &c) 72 } 73 74 events := stats.event.Read(make([]*ChangeEvent, 0, i%32)) 75 assert.Equal(t, tmp, events) 76 } 77 } 78 79 func TestCap(t *testing.T) { 80 var a []string = nil 81 assert.Equal(t, len(a), cap(a)) 82 } 83 84 func TestMetric(t *testing.T) { 85 lb := []string{"name", "extra1", "extra2"} 86 87 // lb = append(lb, defaultLabelNames...) 88 89 stats := NewRecStats("pl", "test", lb, 100) 90 tags := map[string]string{ 91 "ns": "test", 92 "category": point.Metric.String(), 93 "name": "test", 94 "extra1": "test", 95 "extra2": "test", 96 } 97 stats.WriteMetric(tags, 1, 1, 1, time.Millisecond) 98 stats.WriteUpdateTime(tags) 99 100 m := stats.Metrics() 101 ch := [](chan prometheus.Metric){} 102 for i := 0; i < len(m); i++ { 103 ch = append(ch, make(chan prometheus.Metric, 1)) 104 } 105 106 for i, v := range m { 107 v.Collect(ch[i]) 108 } 109 110 for _, c := range ch { 111 select { 112 case c := <-c: 113 m := dto.Metric{} 114 c.Write(&m) 115 assert.Equal(t, len(lb)+2, len(m.Label)) 116 mp := map[string]struct{}{} 117 for _, v := range m.Label { 118 mp[v.GetName()] = struct{}{} 119 } 120 mpExp := map[string]struct{}{} 121 for _, v := range lb { 122 mpExp[v] = struct{}{} 123 } 124 125 mpExp["ns"] = struct{}{} 126 mpExp["category"] = struct{}{} 127 128 assert.Equal(t, mpExp, mp) 129 130 t.Log(m.String()) 131 t.Log(c.Desc()) 132 default: 133 } 134 } 135 }