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  }