1. 概述
指标统计是实现APM(Application performance management)的基础,通常通过一些指标的统计以及上报,我们可以了解程序的运行状况,及时发现程序的问题,提前预估系统瓶颈.
指标(metric)目前的实现有metrics,这是java的实现,可以直接引入程序作为库使用.go语言的实现见go-metrics.
另外,这里只是将指标在内存中进行处理及计算,如果我们想要展示,需要将数据抛出来,这里可以抛到日志里,也可以抛到时序数据库,最简单的做法就是直接抛到监控系统进行绘图或者报警.因此本文后面将讲解各指标的含义以及如何将计算好的数据抛到监控open-falcon
2.指标统计方式
2.1 Meters
用于计算一段时间内的计量,通常用于计算接口调用频率,如QPS(每秒的次数),主要分为rateMean,Rate1/Rate5/Rate15等指标.
- RateMean
单位时间内发生的次数,如一分钟发送100次,则该值为100/60.
- Rate1/Rate5/Rate15
1分钟/5分钟/15分钟内的滑动平均值(moving average),
2.2 Gauges
用于对瞬时值的测量,如我们可以过一段时间就对内存的使用量进行统计,并上报,那么所有的数据点集就是对应时间点的内存值,Gauges只有value指标.也就是上报的是什么就是什么.
2.3 Counter
计数类统计,可以进行加或减,也可以进行归零操作,所有的操作都是在旧值的基础上进行的.这里可以通过每天归零,然后新增注册用户时加1来统计每天的注册用户.
2.4 Histograms
主要用于对数据集中的值分布情况进行统计,典型的应用场景为接口耗时,接口每次调用都会产生耗时,记录每次调用耗时来对接口耗时情况进行分析显然不现实.因此将接口一段时间内的耗时看做数据集,并采集Count,Min,Max,Mean,Median,75%,95%,99%等指标.以相对较小的资源消耗,来尽可能反应数据集的真实情况.
- Count
距离上次清理后产生的样本数量.
- Min
样本中的最小值
- Max
样本中的最大值
- Mean
所有样本的求得的平均值
- Median
样本中的中间位置的值.
- 75%
样本中的%75位置的值.
- 95%
样本中的%95位置的值.
- 99%
样本中的%99位置的值.
1.5 Timers
对某个代码模块同时进行统计调用频率以及调用耗时统计.指标就是Histograms以及Meters两种统计方式的合集.
3.使用方式
更对详细用法见go-metric文档
3.1 Counter
c := metrics.NewCounter() metrics.Register("foo",c) //进行加操作 c.Inc(47) //进行减操作 c.Dec(1) //获取出值 c.Count()
3.2 Gauge
g := metrics.NewGauge() metrics.Register("bar",g) //更新瞬时值 g.Update(47) //获取出瞬时值 g.Value()
3.3 Meters
m := metrics.NewMeter() metrics.Register("quux",m) //写入数据集 m.Mark(47) //获取数据集只读快照 m := metric.Snapshot() //数据集大小 m.Count() //1分钟滑动平均值 m.Rate1() //5分钟滑动平均值 m.Rate5() //15分钟滑动平均值 m.Rate15() //平均值 m.RateMean()
3.4 Histograms
h := metrics.NewHistogram(s) metrics.Register("baz",h) //写入数据集 h.Update(47) //获取数据集只读快照 h := metric.Snapshot() //数据集大小 h.Count() //最小值 h.Min() //最大值 h.Max() //平均值 h.Mean() ps := h.Percentiles([]float64{0.5,0.75,0.95,0.99}) //中位数 ps[0] //75%的数 ps[1] //95%的数 ps[2] //99%的数 ps[3]
3.5 Timer
t := metrics.NewTimer() metrics.Register("bang",t) t.Time(func() { //do some thing }) t.Update(47) //获取方式同meter以及Histograms
4. 指标上报到open-falcon
4.1 上报方式
代码及使用方式见 go-metrics-falcon
实现数据上报open-falcon,只需要将所有数据取出,按open-falcon格式上报即可,这里有涉及到上报json的定义,具体如下.
{ "endpoint": "$endpoint","metric": "$name","value": 2.2,"step": 60,"counterType": "GAUGE","tags": "project=$projectName,metricType=meter,valueType=ratemean","timestamp": 1524724608 }
endpoint: 这一个一般是主机hostname,用于标注是哪台机器.
metric: 指标名,由用户定义
value: 指标的值
step: 上报的时间周期
counterType: 上报的类型,这里open-falcon只支持GAUGE以及COUNTER,因此统一使用GAUGE.
tags: 标签,用于却别指标,包含指标类型,值类型,项目名三项.
timestamp: 指标上报的时间戳,单位秒.
4.2 效果
如图,输入endpoint,然后在counter部分输入项目名就可以过滤出该项目上报的所有指标.
点击指标,进入查询该指标的大图.
同时我们可以对指标设置监控,具体见open-falcon文档.