github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/metrics/graphite.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:40</date> 10 //</624450098813734912> 11 12 package metrics 13 14 import ( 15 "bufio" 16 "fmt" 17 "log" 18 "net" 19 "strconv" 20 "strings" 21 "time" 22 ) 23 24 //graphiteconfig为容器提供了 25 //石墨出口国 26 type GraphiteConfig struct { 27 Addr *net.TCPAddr //要连接到的网络地址 28 Registry Registry //要导出的注册表 29 FlushInterval time.Duration //冲洗间隔 30 DurationUnit time.Duration //持续时间的时间转换单位 31 Prefix string //要加在指标名称前面的前缀 32 Percentiles []float64 //从计时器和柱状图导出的百分比 33 } 34 35 //石墨是一个阻塞导出函数,报告R中的指标 36 //到位于addr的石墨服务器,每隔d段时间刷新一次 37 //并在指标名称前面加前缀。 38 func Graphite(r Registry, d time.Duration, prefix string, addr *net.TCPAddr) { 39 GraphiteWithConfig(GraphiteConfig{ 40 Addr: addr, 41 Registry: r, 42 FlushInterval: d, 43 DurationUnit: time.Nanosecond, 44 Prefix: prefix, 45 Percentiles: []float64{0.5, 0.75, 0.95, 0.99, 0.999}, 46 }) 47 } 48 49 //graphitewithconfig是一个阻塞导出函数,就像graphite一样, 50 //但它需要一个图形配置。 51 func GraphiteWithConfig(c GraphiteConfig) { 52 log.Printf("WARNING: This go-metrics client has been DEPRECATED! It has been moved to https://github.com/cyberdelia/go-metrics-graphite,将于2015年8月12日从rcrowley/go metrics中删除) 53 for range time.Tick(c.FlushInterval) { 54 if err := graphite(&c); nil != err { 55 log.Println(err) 56 } 57 } 58 } 59 60 //graphiteOnce执行对graphite的单个提交,返回 61 //连接失败时出现非零错误。这可以在循环中使用 62 //与用于自定义错误处理的graphitewithconfig类似。 63 func GraphiteOnce(c GraphiteConfig) error { 64 log.Printf("WARNING: This go-metrics client has been DEPRECATED! It has been moved to https://github.com/cyberdelia/go-metrics-graphite,将于2015年8月12日从rcrowley/go metrics中删除) 65 return graphite(&c) 66 } 67 68 func graphite(c *GraphiteConfig) error { 69 now := time.Now().Unix() 70 du := float64(c.DurationUnit) 71 conn, err := net.DialTCP("tcp", nil, c.Addr) 72 if nil != err { 73 return err 74 } 75 defer conn.Close() 76 w := bufio.NewWriter(conn) 77 c.Registry.Each(func(name string, i interface{}) { 78 switch metric := i.(type) { 79 case Counter: 80 fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, metric.Count(), now) 81 case Gauge: 82 fmt.Fprintf(w, "%s.%s.value %d %d\n", c.Prefix, name, metric.Value(), now) 83 case GaugeFloat64: 84 fmt.Fprintf(w, "%s.%s.value %f %d\n", c.Prefix, name, metric.Value(), now) 85 case Histogram: 86 h := metric.Snapshot() 87 ps := h.Percentiles(c.Percentiles) 88 fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, h.Count(), now) 89 fmt.Fprintf(w, "%s.%s.min %d %d\n", c.Prefix, name, h.Min(), now) 90 fmt.Fprintf(w, "%s.%s.max %d %d\n", c.Prefix, name, h.Max(), now) 91 fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, h.Mean(), now) 92 fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", c.Prefix, name, h.StdDev(), now) 93 for psIdx, psKey := range c.Percentiles { 94 key := strings.Replace(strconv.FormatFloat(psKey*100.0, 'f', -1, 64), ".", "", 1) 95 fmt.Fprintf(w, "%s.%s.%s-percentile %.2f %d\n", c.Prefix, name, key, ps[psIdx], now) 96 } 97 case Meter: 98 m := metric.Snapshot() 99 fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, m.Count(), now) 100 fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", c.Prefix, name, m.Rate1(), now) 101 fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", c.Prefix, name, m.Rate5(), now) 102 fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", c.Prefix, name, m.Rate15(), now) 103 fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, m.RateMean(), now) 104 case Timer: 105 t := metric.Snapshot() 106 ps := t.Percentiles(c.Percentiles) 107 fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, t.Count(), now) 108 fmt.Fprintf(w, "%s.%s.min %d %d\n", c.Prefix, name, t.Min()/int64(du), now) 109 fmt.Fprintf(w, "%s.%s.max %d %d\n", c.Prefix, name, t.Max()/int64(du), now) 110 fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, t.Mean()/du, now) 111 fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", c.Prefix, name, t.StdDev()/du, now) 112 for psIdx, psKey := range c.Percentiles { 113 key := strings.Replace(strconv.FormatFloat(psKey*100.0, 'f', -1, 64), ".", "", 1) 114 fmt.Fprintf(w, "%s.%s.%s-percentile %.2f %d\n", c.Prefix, name, key, ps[psIdx], now) 115 } 116 fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", c.Prefix, name, t.Rate1(), now) 117 fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", c.Prefix, name, t.Rate5(), now) 118 fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", c.Prefix, name, t.Rate15(), now) 119 fmt.Fprintf(w, "%s.%s.mean-rate %.2f %d\n", c.Prefix, name, t.RateMean(), now) 120 } 121 w.Flush() 122 }) 123 return nil 124 } 125