github.com/tirogen/go-ethereum@v1.10.12-0.20221226051715-250cfede41b6/metrics/metrics_test.go (about) 1 package metrics 2 3 import ( 4 "fmt" 5 "sync" 6 "testing" 7 "time" 8 ) 9 10 const FANOUT = 128 11 12 func TestReadRuntimeValues(t *testing.T) { 13 var v runtimeStats 14 readRuntimeStats(&v) 15 t.Logf("%+v", v) 16 } 17 18 func BenchmarkMetrics(b *testing.B) { 19 r := NewRegistry() 20 c := NewRegisteredCounter("counter", r) 21 g := NewRegisteredGauge("gauge", r) 22 gf := NewRegisteredGaugeFloat64("gaugefloat64", r) 23 h := NewRegisteredHistogram("histogram", r, NewUniformSample(100)) 24 m := NewRegisteredMeter("meter", r) 25 t := NewRegisteredTimer("timer", r) 26 RegisterDebugGCStats(r) 27 b.ResetTimer() 28 ch := make(chan bool) 29 30 wgD := &sync.WaitGroup{} 31 /* 32 wgD.Add(1) 33 go func() { 34 defer wgD.Done() 35 //log.Println("go CaptureDebugGCStats") 36 for { 37 select { 38 case <-ch: 39 //log.Println("done CaptureDebugGCStats") 40 return 41 default: 42 CaptureDebugGCStatsOnce(r) 43 } 44 } 45 }() 46 //*/ 47 48 wgW := &sync.WaitGroup{} 49 /* 50 wgW.Add(1) 51 go func() { 52 defer wgW.Done() 53 //log.Println("go Write") 54 for { 55 select { 56 case <-ch: 57 //log.Println("done Write") 58 return 59 default: 60 WriteOnce(r, io.Discard) 61 } 62 } 63 }() 64 //*/ 65 66 wg := &sync.WaitGroup{} 67 wg.Add(FANOUT) 68 for i := 0; i < FANOUT; i++ { 69 go func(i int) { 70 defer wg.Done() 71 //log.Println("go", i) 72 for i := 0; i < b.N; i++ { 73 c.Inc(1) 74 g.Update(int64(i)) 75 gf.Update(float64(i)) 76 h.Update(int64(i)) 77 m.Mark(1) 78 t.Update(1) 79 } 80 //log.Println("done", i) 81 }(i) 82 } 83 wg.Wait() 84 close(ch) 85 wgD.Wait() 86 wgW.Wait() 87 } 88 89 func Example() { 90 c := NewCounter() 91 Register("money", c) 92 c.Inc(17) 93 94 // Threadsafe registration 95 t := GetOrRegisterTimer("db.get.latency", nil) 96 t.Time(func() { time.Sleep(10 * time.Millisecond) }) 97 t.Update(1) 98 99 fmt.Println(c.Count()) 100 fmt.Println(t.Min()) 101 // Output: 17 102 // 1 103 }