github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/metrics/graphite.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  //</624450098813734912>
    11  
    12  package metrics
    13  
    14  import (
    15  	"bufio"
    16  	"fmt"
    17  	"log"
    18  	"net"
    19  	"strconv"
    20  	"strings"
    21  	"time"
    22  )
    23  
    24  //graphiteconfig为容器提供了
    25  //石墨出口国
    26  type GraphiteConfig struct {
    27  Addr          *net.TCPAddr  //要连接到的网络地址
    28  Registry      Registry      //要导出的注册表
    29  FlushInterval time.Duration //冲洗间隔
    30  DurationUnit  time.Duration //持续时间的时间转换单位
    31  Prefix        string        //要加在指标名称前面的前缀
    32  Percentiles   []float64     //从计时器和柱状图导出的百分比
    33  }
    34  
    35  //石墨是一个阻塞导出函数,报告R中的指标
    36  //到位于addr的石墨服务器,每隔d段时间刷新一次
    37  //并在指标名称前面加前缀。
    38  func Graphite(r Registry, d time.Duration, prefix string, addr *net.TCPAddr) {
    39  	GraphiteWithConfig(GraphiteConfig{
    40  		Addr:          addr,
    41  		Registry:      r,
    42  		FlushInterval: d,
    43  		DurationUnit:  time.Nanosecond,
    44  		Prefix:        prefix,
    45  		Percentiles:   []float64{0.5, 0.75, 0.95, 0.99, 0.999},
    46  	})
    47  }
    48  
    49  //graphitewithconfig是一个阻塞导出函数,就像graphite一样,
    50  //但它需要一个图形配置。
    51  func GraphiteWithConfig(c GraphiteConfig) {
    52  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中删除)
    53  	for range time.Tick(c.FlushInterval) {
    54  		if err := graphite(&c); nil != err {
    55  			log.Println(err)
    56  		}
    57  	}
    58  }
    59  
    60  //graphiteOnce执行对graphite的单个提交,返回
    61  //连接失败时出现非零错误。这可以在循环中使用
    62  //与用于自定义错误处理的graphitewithconfig类似。
    63  func GraphiteOnce(c GraphiteConfig) error {
    64  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中删除)
    65  	return graphite(&c)
    66  }
    67  
    68  func graphite(c *GraphiteConfig) error {
    69  	now := time.Now().Unix()
    70  	du := float64(c.DurationUnit)
    71  	conn, err := net.DialTCP("tcp", nil, c.Addr)
    72  	if nil != err {
    73  		return err
    74  	}
    75  	defer conn.Close()
    76  	w := bufio.NewWriter(conn)
    77  	c.Registry.Each(func(name string, i interface{}) {
    78  		switch metric := i.(type) {
    79  		case Counter:
    80  			fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, metric.Count(), now)
    81  		case Gauge:
    82  			fmt.Fprintf(w, "%s.%s.value %d %d\n", c.Prefix, name, metric.Value(), now)
    83  		case GaugeFloat64:
    84  			fmt.Fprintf(w, "%s.%s.value %f %d\n", c.Prefix, name, metric.Value(), now)
    85  		case Histogram:
    86  			h := metric.Snapshot()
    87  			ps := h.Percentiles(c.Percentiles)
    88  			fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, h.Count(), now)
    89  			fmt.Fprintf(w, "%s.%s.min %d %d\n", c.Prefix, name, h.Min(), now)
    90  			fmt.Fprintf(w, "%s.%s.max %d %d\n", c.Prefix, name, h.Max(), now)
    91  			fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, h.Mean(), now)
    92  			fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", c.Prefix, name, h.StdDev(), now)
    93  			for psIdx, psKey := range c.Percentiles {
    94  				key := strings.Replace(strconv.FormatFloat(psKey*100.0, 'f', -1, 64), ".", "", 1)
    95  				fmt.Fprintf(w, "%s.%s.%s-percentile %.2f %d\n", c.Prefix, name, key, ps[psIdx], now)
    96  			}
    97  		case Meter:
    98  			m := metric.Snapshot()
    99  			fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, m.Count(), now)
   100  			fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", c.Prefix, name, m.Rate1(), now)
   101  			fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", c.Prefix, name, m.Rate5(), now)
   102  			fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", c.Prefix, name, m.Rate15(), now)
   103  			fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, m.RateMean(), now)
   104  		case Timer:
   105  			t := metric.Snapshot()
   106  			ps := t.Percentiles(c.Percentiles)
   107  			fmt.Fprintf(w, "%s.%s.count %d %d\n", c.Prefix, name, t.Count(), now)
   108  			fmt.Fprintf(w, "%s.%s.min %d %d\n", c.Prefix, name, t.Min()/int64(du), now)
   109  			fmt.Fprintf(w, "%s.%s.max %d %d\n", c.Prefix, name, t.Max()/int64(du), now)
   110  			fmt.Fprintf(w, "%s.%s.mean %.2f %d\n", c.Prefix, name, t.Mean()/du, now)
   111  			fmt.Fprintf(w, "%s.%s.std-dev %.2f %d\n", c.Prefix, name, t.StdDev()/du, now)
   112  			for psIdx, psKey := range c.Percentiles {
   113  				key := strings.Replace(strconv.FormatFloat(psKey*100.0, 'f', -1, 64), ".", "", 1)
   114  				fmt.Fprintf(w, "%s.%s.%s-percentile %.2f %d\n", c.Prefix, name, key, ps[psIdx], now)
   115  			}
   116  			fmt.Fprintf(w, "%s.%s.one-minute %.2f %d\n", c.Prefix, name, t.Rate1(), now)
   117  			fmt.Fprintf(w, "%s.%s.five-minute %.2f %d\n", c.Prefix, name, t.Rate5(), now)
   118  			fmt.Fprintf(w, "%s.%s.fifteen-minute %.2f %d\n", c.Prefix, name, t.Rate15(), now)
   119  			fmt.Fprintf(w, "%s.%s.mean-rate %.2f %d\n", c.Prefix, name, t.RateMean(), now)
   120  		}
   121  		w.Flush()
   122  	})
   123  	return nil
   124  }
   125