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文件.