github.com/qiuhoude/go-web@v0.0.0-20220223060959-ab545e78f20d/prepare/19metrics/example/main.go (about)

     1  package main
     2  
     3  import (
     4  	"github.com/rcrowley/go-metrics"
     5  	"log"
     6  	"os"
     7  	"time"
     8  )
     9  
    10  /*
    11  五种 Metrics 类型
    12  
    13  Gauges :最简单的度量指标,只有一个简单的返回值,或者叫瞬时状态
    14  Counters:Counter 就是计数器,Counter 只是用 Gauge 封装了 AtomicLong
    15  Meters:Meter度量一系列事件发生的速率(rate),例如TPS。Meters会统计最近1分钟,5分钟,15分钟,还有全部时间的速率。
    16  Histograms:Histogram统计数据的分布情况。比如最小值,最大值,中间值,还有中位数,75百分位, 90百分位, 95百分位, 98百分位, 99百分位, 和 99.9百分位的值(percentiles)。
    17  Timer其实是 Histogram 和 Meter 的结合, histogram 某部分代码/调用的耗时, meter统计TPS。
    18  
    19  */
    20  
    21  func gauges() {
    22  	g := metrics.NewGauge()
    23  	metrics.Register("bar", g)
    24  	g.Update(1)
    25  
    26  	var j int64
    27  	j = 1
    28  	for {
    29  		time.Sleep(time.Second * 1)
    30  		g.Update(j)
    31  		j++
    32  	}
    33  }
    34  
    35  // counters 与gauges 类似 只不过在操作上 gauges 是 update 而
    36  // counter 是 inc 做加法 增加参数市值 dec 做减法
    37  func counters() {
    38  	c := metrics.NewCounter()
    39  	//c := metrics.NewGaugeFloat64()
    40  	metrics.Register("foo", c)
    41  
    42  	for i := 0; i < 10; i++ {
    43  		go func() {
    44  			for {
    45  				c.Dec(19)
    46  				time.Sleep(300e6)
    47  			}
    48  		}()
    49  		go func() {
    50  			for {
    51  				c.Inc(47)
    52  				time.Sleep(400e6)
    53  			}
    54  		}()
    55  	}
    56  	time.Sleep(50 * time.Second)
    57  }
    58  
    59  func meters() {
    60  	m := metrics.NewMeter()
    61  	metrics.Register("quux", m)
    62  	var j int64
    63  	j = 1
    64  	for {
    65  		time.Sleep(time.Second * 1)
    66  		j++
    67  		m.Mark(j)
    68  	}
    69  }
    70  
    71  func histogram() {
    72  	s := metrics.NewExpDecaySample(1028, 0.015)
    73  	//s := metrics.NewUniformSample(1028)
    74  	h := metrics.NewHistogram(s)
    75  	metrics.Register("bang", h)
    76  	go func() {
    77  		for {
    78  			h.Update(47)
    79  			time.Sleep(400e6)
    80  		}
    81  	}()
    82  	for {
    83  		h.Update(19)
    84  		time.Sleep(300e6)
    85  	}
    86  }
    87  
    88  func timer() {
    89  	t := metrics.NewTimer()
    90  	metrics.Register("hooah", t)
    91  
    92  	go func() {
    93  		for {
    94  			t.Time(func() { time.Sleep(400e6) })
    95  		}
    96  	}()
    97  
    98  	for {
    99  		t.Time(func() { time.Sleep(300e6) })
   100  	}
   101  
   102  }
   103  
   104  func main() {
   105  	// 结果输出
   106  	output()
   107  
   108  	//gauges()
   109  	//counters()
   110  	//meters()
   111  	//histogram()
   112  	timer()
   113  }
   114  
   115  func output() {
   116  	// 输出到控制台
   117  	go metrics.Log(metrics.DefaultRegistry, 1*time.Second,
   118  		log.New(os.Stdout, "metrics: ", log.Lmicroseconds))
   119  
   120  	//输出到influxdb
   121  	/*go influxdb.InfluxDB(
   122  	metrics.DefaultRegistry,
   123  	time.Second*10,
   124  	"http://127.0.0.1:8086",
   125  	"mydb",
   126  	"",
   127  	"",
   128  	"",
   129  	true)*/
   130  
   131  }