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