github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/metrics/graphite.go (about) 1 2 //此源码被清华学神尹成大魔王专业翻译分析并修改 3 //尹成QQ77025077 4 //尹成微信18510341407 5 //尹成所在QQ群721929980 6 //尹成邮箱 yinc13@mails.tsinghua.edu.cn 7 //尹成毕业于清华大学,微软区块链领域全球最有价值专家 8 //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620 9 package metrics 10 11 import ( 12 "bufio" 13 "fmt" 14 "log" 15 "net" 16 "strconv" 17 "strings" 18 "time" 19 ) 20 21 //graphiteconfig为容器提供了 22 //石墨出口国 23 type GraphiteConfig struct { 24 Addr *net.TCPAddr //要连接到的网络地址 25 Registry Registry //要导出的注册表 26 FlushInterval time.Duration //冲洗间隔 27 DurationUnit time.Duration //持续时间的时间转换单位 28 Prefix string //要加在指标名称前面的前缀 29 Percentiles []float64 //从计时器和柱状图导出的百分比 30 } 31 32 //石墨是一个阻塞导出函数,报告R中的指标 33 //到位于addr的石墨服务器,每隔d段时间刷新一次 34 //并在指标名称前面加前缀。 35 func Graphite(r Registry, d time.Duration, prefix string, addr *net.TCPAddr) { 36 GraphiteWithConfig(GraphiteConfig{ 37 Addr: addr, 38 Registry: r, 39 FlushInterval: d, 40 DurationUnit: time.Nanosecond, 41 Prefix: prefix, 42 Percentiles: []float64{0.5, 0.75, 0.95, 0.99, 0.999}, 43 }) 44 } 45 46 //graphitewithconfig是一个阻塞导出函数,就像graphite一样, 47 //但它需要一个图形配置。 48 func GraphiteWithConfig(c GraphiteConfig) { 49 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中删除) 50 for range time.Tick(c.FlushInterval) { 51 if err := graphite(&c); nil != err { 52 log.Println(err) 53 } 54 } 55 } 56 57 //graphiteOnce执行对graphite的单个提交,返回 58 //连接失败时出现非零错误。这可以在循环中使用 59 //与用于自定义错误处理的graphitewithconfig类似。 60 func GraphiteOnce(c GraphiteConfig) error { 61 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中删除) 62 return graphite(&c) 63 } 64 65 func graphite(c *GraphiteConfig) error { 66 now := time.Now().Unix() 67 du := float64(c.DurationUnit) 68 conn, err := net.DialTCP("tcp", nil, c.Addr) 69 if nil != err { 70 return err 71 } 72 defer conn.Close() 73 w := bufio.NewWriter(conn) 74 c.Registry.Each(func(name string, i interface{}) { 75 switch metric := i.(type) { 76 case Counter: 77 fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, metric.Count(), now) 78 case Gauge: 79 fmt.Fprintf(w, "%s.%s.value %d %d\n", c.Prefix, name, metric.Value(), now) 80 case GaugeFloat64: 81 fmt.Fprintf(w, "%s.%s.value %f %d\n", c.Prefix, name, metric.Value(), now) 82 case Histogram: 83 h := metric.Snapshot() 84 ps := h.Percentiles(c.Percentiles) 85 fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, h.Count(), now) 86 fmt.Fprintf(w, "%s.%s.min %d %d\n", c.Prefix, name, h.Min(), now) 87 fmt.Fprintf(w, "%s.%s.max %d %d\n", c.Prefix, name, h.Max(), now) 88 fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, h.Mean(), now) 89 fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", c.Prefix, name, h.StdDev(), now) 90 for psIdx, psKey := range c.Percentiles { 91 key := strings.Replace(strconv.FormatFloat(psKey*100.0, 'f', -1, 64), ".", "", 1) 92 fmt.Fprintf(w, "%s.%s.%s-percentile %.2f %d\n", c.Prefix, name, key, ps[psIdx], now) 93 } 94 case Meter: 95 m := metric.Snapshot() 96 fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, m.Count(), now) 97 fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", c.Prefix, name, m.Rate1(), now) 98 fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", c.Prefix, name, m.Rate5(), now) 99 fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", c.Prefix, name, m.Rate15(), now) 100 fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, m.RateMean(), now) 101 case Timer: 102 t := metric.Snapshot() 103 ps := t.Percentiles(c.Percentiles) 104 fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, t.Count(), now) 105 fmt.Fprintf(w, "%s.%s.min %d %d\n", c.Prefix, name, t.Min()/int64(du), now) 106 fmt.Fprintf(w, "%s.%s.max %d %d\n", c.Prefix, name, t.Max()/int64(du), now) 107 fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, t.Mean()/du, now) 108 fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", c.Prefix, name, t.StdDev()/du, now) 109 for psIdx, psKey := range c.Percentiles { 110 key := strings.Replace(strconv.FormatFloat(psKey*100.0, 'f', -1, 64), ".", "", 1) 111 fmt.Fprintf(w, "%s.%s.%s-percentile %.2f %d\n", c.Prefix, name, key, ps[psIdx], now) 112 } 113 fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", c.Prefix, name, t.Rate1(), now) 114 fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", c.Prefix, name, t.Rate5(), now) 115 fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", c.Prefix, name, t.Rate15(), now) 116 fmt.Fprintf(w, "%s.%s.mean-rate %.2f %d\n", c.Prefix, name, t.RateMean(), now) 117 } 118 w.Flush() 119 }) 120 return nil 121 }