github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/metrics/opentsdb.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 //</624450099572903936> 11 12 package metrics 13 14 import ( 15 "bufio" 16 "fmt" 17 "log" 18 "net" 19 "os" 20 "strings" 21 "time" 22 ) 23 24 var shortHostName string = "" 25 26 //OpenTSDBConfig为容器提供配置参数 27 //OpenTSDB导出程序 28 type OpenTSDBConfig struct { 29 Addr *net.TCPAddr //要连接到的网络地址 30 Registry Registry //要导出的注册表 31 FlushInterval time.Duration //冲洗间隔 32 DurationUnit time.Duration //持续时间的时间转换单位 33 Prefix string //要加在指标名称前面的前缀 34 } 35 36 //OpenTSDB是一个阻塞导出函数,它在R中报告度量值 37 //到位于addr的tsdb服务器,每隔d段时间刷新一次 38 //并在指标名称前面加前缀。 39 func OpenTSDB(r Registry, d time.Duration, prefix string, addr *net.TCPAddr) { 40 OpenTSDBWithConfig(OpenTSDBConfig{ 41 Addr: addr, 42 Registry: r, 43 FlushInterval: d, 44 DurationUnit: time.Nanosecond, 45 Prefix: prefix, 46 }) 47 } 48 49 //OpenTSDBWithConfig是一个阻塞导出函数,就像OpenTSDB一样, 50 //但是它需要一个OpenTSdbconfig。 51 func OpenTSDBWithConfig(c OpenTSDBConfig) { 52 for range time.Tick(c.FlushInterval) { 53 if err := openTSDB(&c); nil != err { 54 log.Println(err) 55 } 56 } 57 } 58 59 func getShortHostname() string { 60 if shortHostName == "" { 61 host, _ := os.Hostname() 62 if index := strings.Index(host, "."); index > 0 { 63 shortHostName = host[:index] 64 } else { 65 shortHostName = host 66 } 67 } 68 return shortHostName 69 } 70 71 func openTSDB(c *OpenTSDBConfig) error { 72 shortHostname := getShortHostname() 73 now := time.Now().Unix() 74 du := float64(c.DurationUnit) 75 conn, err := net.DialTCP("tcp", nil, c.Addr) 76 if nil != err { 77 return err 78 } 79 defer conn.Close() 80 w := bufio.NewWriter(conn) 81 c.Registry.Each(func(name string, i interface{}) { 82 switch metric := i.(type) { 83 case Counter: 84 fmt.Fprintf(w, "put %s.%s.count %d %d host=%s\n", c.Prefix, name, now, metric.Count(), shortHostname) 85 case Gauge: 86 fmt.Fprintf(w, "put %s.%s.value %d %d host=%s\n", c.Prefix, name, now, metric.Value(), shortHostname) 87 case GaugeFloat64: 88 fmt.Fprintf(w, "put %s.%s.value %d %f host=%s\n", c.Prefix, name, now, metric.Value(), shortHostname) 89 case Histogram: 90 h := metric.Snapshot() 91 ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) 92 fmt.Fprintf(w, "put %s.%s.count %d %d host=%s\n", c.Prefix, name, now, h.Count(), shortHostname) 93 fmt.Fprintf(w, "put %s.%s.min %d %d host=%s\n", c.Prefix, name, now, h.Min(), shortHostname) 94 fmt.Fprintf(w, "put %s.%s.max %d %d host=%s\n", c.Prefix, name, now, h.Max(), shortHostname) 95 fmt.Fprintf(w, "put %s.%s.mean %d %.2f host=%s\n", c.Prefix, name, now, h.Mean(), shortHostname) 96 fmt.Fprintf(w, "put %s.%s.std-dev %d %.2f host=%s\n", c.Prefix, name, now, h.StdDev(), shortHostname) 97 fmt.Fprintf(w, "put %s.%s.50-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[0], shortHostname) 98 fmt.Fprintf(w, "put %s.%s.75-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[1], shortHostname) 99 fmt.Fprintf(w, "put %s.%s.95-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[2], shortHostname) 100 fmt.Fprintf(w, "put %s.%s.99-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[3], shortHostname) 101 fmt.Fprintf(w, "put %s.%s.999-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[4], shortHostname) 102 case Meter: 103 m := metric.Snapshot() 104 fmt.Fprintf(w, "put %s.%s.count %d %d host=%s\n", c.Prefix, name, now, m.Count(), shortHostname) 105 fmt.Fprintf(w, "put %s.%s.one-minute %d %.2f host=%s\n", c.Prefix, name, now, m.Rate1(), shortHostname) 106 fmt.Fprintf(w, "put %s.%s.five-minute %d %.2f host=%s\n", c.Prefix, name, now, m.Rate5(), shortHostname) 107 fmt.Fprintf(w, "put %s.%s.fifteen-minute %d %.2f host=%s\n", c.Prefix, name, now, m.Rate15(), shortHostname) 108 fmt.Fprintf(w, "put %s.%s.mean %d %.2f host=%s\n", c.Prefix, name, now, m.RateMean(), shortHostname) 109 case Timer: 110 t := metric.Snapshot() 111 ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999}) 112 fmt.Fprintf(w, "put %s.%s.count %d %d host=%s\n", c.Prefix, name, now, t.Count(), shortHostname) 113 fmt.Fprintf(w, "put %s.%s.min %d %d host=%s\n", c.Prefix, name, now, t.Min()/int64(du), shortHostname) 114 fmt.Fprintf(w, "put %s.%s.max %d %d host=%s\n", c.Prefix, name, now, t.Max()/int64(du), shortHostname) 115 fmt.Fprintf(w, "put %s.%s.mean %d %.2f host=%s\n", c.Prefix, name, now, t.Mean()/du, shortHostname) 116 fmt.Fprintf(w, "put %s.%s.std-dev %d %.2f host=%s\n", c.Prefix, name, now, t.StdDev()/du, shortHostname) 117 fmt.Fprintf(w, "put %s.%s.50-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[0]/du, shortHostname) 118 fmt.Fprintf(w, "put %s.%s.75-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[1]/du, shortHostname) 119 fmt.Fprintf(w, "put %s.%s.95-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[2]/du, shortHostname) 120 fmt.Fprintf(w, "put %s.%s.99-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[3]/du, shortHostname) 121 fmt.Fprintf(w, "put %s.%s.999-percentile %d %.2f host=%s\n", c.Prefix, name, now, ps[4]/du, shortHostname) 122 fmt.Fprintf(w, "put %s.%s.one-minute %d %.2f host=%s\n", c.Prefix, name, now, t.Rate1(), shortHostname) 123 fmt.Fprintf(w, "put %s.%s.five-minute %d %.2f host=%s\n", c.Prefix, name, now, t.Rate5(), shortHostname) 124 fmt.Fprintf(w, "put %s.%s.fifteen-minute %d %.2f host=%s\n", c.Prefix, name, now, t.Rate15(), shortHostname) 125 fmt.Fprintf(w, "put %s.%s.mean-rate %d %.2f host=%s\n", c.Prefix, name, now, t.RateMean(), shortHostname) 126 } 127 w.Flush() 128 }) 129 return nil 130 } 131