指標統計是實現APM(Application performance management)的基礎,一般經過一些指標的統計以及上報,咱們能夠了解程序的運行情況,及時發現程序的問題,提早預估系統瓶頸.
指標(metric)目前的實現有metrics,這是java的實現,能夠直接引入程序做爲庫使用.go語言的實現見go-metrics.
另外,這裏只是將指標在內存中進行處理及計算,若是咱們想要展現,須要將數據拋出來,這裏能夠拋到日誌裏,也能夠拋到時序數據庫,最簡單的作法就是直接拋到監控系統進行繪圖或者報警.所以本文後面將講解各指標的含義以及如何將計算好的數據拋到監控open-falconjava
用於計算一段時間內的計量,一般用於計算接口調用頻率,如QPS(每秒的次數),主要分爲rateMean,Rate1/Rate5/Rate15等指標.git
單位時間內發生的次數,如一分鐘發送100次,則該值爲100/60.github
1分鐘/5分鐘/15分鐘內的滑動平均值(moving average),數據庫
用於對瞬時值的測量,如咱們能夠過一段時間就對內存的使用量進行統計,並上報,那麼全部的數據點集就是對應時間點的內存值,Gauges只有value指標.也就是上報的是什麼就是什麼.json
計數類統計,能夠進行加或減,也能夠進行歸零操做,全部的操做都是在舊值的基礎上進行的.這裏能夠經過天天歸零,而後新增註冊用戶時加1來統計天天的註冊用戶.spa
主要用於對數據集中的值分佈狀況進行統計,典型的應用場景爲接口耗時,接口每次調用都會產生耗時,記錄每次調用耗時來對接口耗時狀況進行分析顯然不現實.所以將接口一段時間內的耗時看作數據集,並採集Count,Min, Max, Mean, Median, 75%, 95%, 99%等指標.以相對較小的資源消耗,來儘量反應數據集的真實狀況.日誌
距離上次清理後產生的樣本數量.code
樣本中的最小值orm
樣本中的最大值blog
全部樣本的求得的平均值
樣本中的中間位置的值.
樣本中的%75位置的值.
樣本中的%95位置的值.
樣本中的%99位置的值.
對某個代碼模塊同時進行統計調用頻率以及調用耗時統計.指標就是Histograms以及Meters兩種統計方式的合集.
更對詳細用法見go-metric文檔
c := metrics.NewCounter() metrics.Register("foo", c) //進行加操做 c.Inc(47) //進行減操做 c.Dec(1) //獲取出值 c.Count()
g := metrics.NewGauge() metrics.Register("bar", g) //更新瞬時值 g.Update(47) //獲取出瞬時值 g.Value()
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()
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]
t := metrics.NewTimer() metrics.Register("bang", t) t.Time(func() { //do some thing }) t.Update(47) //獲取方式同meter以及Histograms
代碼及使用方式見 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: 指標上報的時間戳,單位秒.
如圖,輸入endpoint, 而後在counter部分輸入項目名就能夠過濾出該項目上報的全部指標.
點擊指標,進入查詢該指標的大圖.
同時咱們能夠對指標設置監控,具體見open-falcon文檔.