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  }