github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/19metrics/example/main.go (about) 1 package main 2 3 import ( 4 "github.com/rcrowley/go-metrics" 5 "log" 6 "os" 7 "time" 8 ) 9 10 /* 11 五种 Metrics 类型 12 13 Gauges :最简单的度量指标,只有一个简单的返回值,或者叫瞬时状态 14 Counters:Counter 就是计数器,Counter 只是用 Gauge 封装了 AtomicLong 15 Meters:Meter度量一系列事件发生的速率(rate),例如TPS。Meters会统计最近1分钟,5分钟,15分钟,还有全部时间的速率。 16 Histograms:Histogram统计数据的分布情况。比如最小值,最大值,中间值,还有中位数,75百分位, 90百分位, 95百分位, 98百分位, 99百分位, 和 99.9百分位的值(percentiles)。 17 Timer其实是 Histogram 和 Meter 的结合, histogram 某部分代码/调用的耗时, meter统计TPS。 18 19 */ 20 21 func gauges() { 22 g := metrics.NewGauge() 23 metrics.Register("bar", g) 24 g.Update(1) 25 26 var j int64 27 j = 1 28 for { 29 time.Sleep(time.Second * 1) 30 g.Update(j) 31 j++ 32 } 33 } 34 35 // counters 与gauges 类似 只不过在操作上 gauges 是 update 而 36 // counter 是 inc 做加法 增加参数市值 dec 做减法 37 func counters() { 38 c := metrics.NewCounter() 39 //c := metrics.NewGaugeFloat64() 40 metrics.Register("foo", c) 41 42 for i := 0; i < 10; i++ { 43 go func() { 44 for { 45 c.Dec(19) 46 time.Sleep(300e6) 47 } 48 }() 49 go func() { 50 for { 51 c.Inc(47) 52 time.Sleep(400e6) 53 } 54 }() 55 } 56 time.Sleep(50 * time.Second) 57 } 58 59 func meters() { 60 m := metrics.NewMeter() 61 metrics.Register("quux", m) 62 var j int64 63 j = 1 64 for { 65 time.Sleep(time.Second * 1) 66 j++ 67 m.Mark(j) 68 } 69 } 70 71 func histogram() { 72 s := metrics.NewExpDecaySample(1028, 0.015) 73 //s := metrics.NewUniformSample(1028) 74 h := metrics.NewHistogram(s) 75 metrics.Register("bang", h) 76 go func() { 77 for { 78 h.Update(47) 79 time.Sleep(400e6) 80 } 81 }() 82 for { 83 h.Update(19) 84 time.Sleep(300e6) 85 } 86 } 87 88 func timer() { 89 t := metrics.NewTimer() 90 metrics.Register("hooah", t) 91 92 go func() { 93 for { 94 t.Time(func() { time.Sleep(400e6) }) 95 } 96 }() 97 98 for { 99 t.Time(func() { time.Sleep(300e6) }) 100 } 101 102 } 103 104 func main() { 105 // 结果输出 106 output() 107 108 //gauges() 109 //counters() 110 //meters() 111 //histogram() 112 timer() 113 } 114 115 func output() { 116 // 输出到控制台 117 go metrics.Log(metrics.DefaultRegistry, 1*time.Second, 118 log.New(os.Stdout, "metrics: ", log.Lmicroseconds)) 119 120 //输出到influxdb 121 /*go influxdb.InfluxDB( 122 metrics.DefaultRegistry, 123 time.Second*10, 124 "http://127.0.0.1:8086", 125 "mydb", 126 "", 127 "", 128 "", 129 true)*/ 130 131 }