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