
文章目錄
-
數值類型的常用指標含義
- 總量誤區
- 誤差
-
模板變量
- 模板變量的寫法
- 新建模板變量
- 模板變量的隱藏玩法
-
grafana 面板編輯器
- Metrcis
- Legend
- Display
-
高級函數
- 聚合單個查詢的多條匹配曲線的總量 Combine -> sumSeries
- 時間線遷移 Transform -> timeShift
- 去除異常值 Filter -> removeAboveValue
- 重命名函數
- 多條曲線數值的聚合 Special -> groupByNode
- 計算多個 Query 組成的成功率 Calculate -> asPercent
-
其他
- 報警
- statsd 打點的限制
- 后端查詢 grafana 數據
- 匿名模式
- 最后
grafana 是一個開源的時序性統計和監控平台,支持例如 elasticsearch、graphite、influxdb 等眾多的數據源,並以功能強大的界面編輯器著稱。我們在前端監控方面引入 grafana 后取得了一些不錯的反饋,但是很多用戶由於之前沒有接觸過 grafana 經常會來詢問 grafana 的相關問題,因此希望本文對大家在 grafana 使用方面有所幫助。
grafana 的權限分為三個等級:Viewer、Editor 和 Admin,Viewer 只能查看 grafana 已經存在的面板而不能編輯,Editor 可以編輯面板,Admin 則擁有全部權限例如添加數據源、添加插件、增加 API KEY。
對於普通用戶來說,Viewer 權限已經足夠,本文接下來的內容主要和 Editor 權限有關。由於篇幅有限,本文作為范例的數據源為 graphite,同時也只介紹最常用的 Graph 圖表的配置方法。
數值類型的常用指標含義
-
count_ps
- 每秒的數量
-
count
- 每十秒的數量
-
mean_90
- 去除最高10%的數據后的平均值
-
upper_90
- 去除最高10%的數據后的最高值
總量誤區
這里有一個常見的 grafana 誤區,因為經常有用數值類型的 count_ps 來順便獲取每秒打點數量的情況,注意在這種情況下,一段時間內的打點總量需要使用 count_ps 的 avg 平均值來乘以這段時間的秒數來計算,而不是通過界面上的 Total 直接讀取。
這是因為,在界面上一條曲線能夠展示的點的數量是有限的,grafana 會根據你的窗口寬度來決定返回的點數,因為像一天
這樣的時間段肯定沒辦法在界面上展示每一秒的點,畢竟總量為86400個點就算帶魚屏也不可能擠得下。對於無法展示的點,grafana 默認是使用 avg 平均值的行為來修正返回點的值,舉個栗子,如下圖:
上圖時間范圍是一天,上部分為曲線面板的值,下部分為 面餅圖表的值,並且上部分圖標的曲線為 count 類型(十秒聚一次),可以看到 avg 平均值為 683,那么總量應該為 682 乘以 6 (如果是count_ps 這里則是60) 乘以 60 (一小時60分鍾)再乘以 24 (一天24小時)得到589萬,與圖片中下部分的582萬相近,因此上部分 total 的117萬是一個完完全全讓人誤解的值,可以認為它毫無意義進而直接無視掉。
誤差
上文中我們計算出來的589萬和界面上的582萬其實也有一點誤差,不過這是可以接受的,因為 statsd 一般情況下是 UDP 的形式(它其實有 TCP 的形式),所以如果想要完全正確的數據,那么最好把打點相關的數據也入庫,從數據庫里后置查詢出來的才是完全可靠。
模板變量
模板變量能夠動態地控制面板中的查詢語句,是十分重要的功能。經常可以在面板的左上角發現它們,如下圖:
模板變量的寫法
模板變量支持 $name
和 [[name]]
的寫法,針對 graphite 數據源主要使用前者,例如:stats.timers.fe.test.$key.count_ps
新建模板變量
grafana 界面上齒輪按鈕 -> Templating -> 點擊 New,即可出現類似如下的界面:
本段主要介紹 Query 類型的寫法。
-
Name
- 該變量的名稱,不支持特殊字符例如$
-
Refresh
- 可選
Never
,On Dashboard Load
和On Time Range Change
- 如果該變量的值經常動態增加的話則選
On Time Range Change
,否則On Dashboard Load
就足夠了,Query 類型千萬不要選 Never,否則變量只會在你點進來編輯變量時才會更新
- 可選
-
Query
- 查詢語句,例如 stats.timers.fe.test.*
- 編寫時 grafana 不會觸發請求,需要在輸入框外面點擊一下,查詢到的值就會顯示在下邊了
模板變量中的 Query 其實也支持模板變量,例如stats.timers.fe.test.$key.*
這樣的語句,會在 $key 變量變化時自動刷新值,是不是有一點 MVVM 的感覺。這個功能用來聯動多個模板變量可以大幅度減少 grafana 一次查詢的時間。
模板變量的隱藏玩法
模板變量甚至可以用在 grafana 的跳轉中,這是連文檔中都沒有提及的一個隱藏玩法,在 Link
或者 Dashboard
里 URL 中任意位置填入 $name ,那么在用戶點擊該鏈接跳轉時 grafana 同樣會替換該變量來讓你跳到正確的鏈接去。這和其他系統整合起來能夠做到很不錯的用戶體驗,例如跳轉到 kibana 那邊去查詢日志。
kibana 和 grafana 的時間范圍格式並不一樣,可以使用這篇文章 中的 chrome 插件來解決。
另外,Custom 模板變量可以允許用戶在變量下拉框中自行輸入值,也是一個經常用到的值,配合模板變量會和當前鏈接中的 querystring 部分的var-${name}
同步,配合起來可以輕松地從第三方系統中跳轉到正確的 grafana 面板中來
grafana 面板編輯器
以 Editor 權限的賬號進入到任意面板中,點擊某個圖表繼而點擊小彈窗中的 Edit 按鈕,即可進入圖表的編輯器界面。對於編輯器本文只介紹圖表的重要配置,Metrics,Legend 和 Display
Metrcis
-
編輯模式
- 上圖箭頭指向的
toggle editor mode
可以控制編輯模式,關閉則需要手動輸入查詢語句,開啟則是如上圖的可以在界面上動態增刪改的模式。
- 上圖箭頭指向的
-
數據源
Panel data source
一定要選對,否則查不到對應的路徑,並且很有可能冒出來 Mock 數據讓人一臉懵逼。
開啟動態編輯模式時可以在點擊上圖中每個框框,這時 grafana 會自動加載該位置在數據源中的值,並且你也可以在這里選擇模板變量來動態控制。
點擊尾巴上的加號,會冒出來對應數據源的函數,可以做一些高級的功能,這個也是本文下半部分的重點,稍后再做介紹。graphite 的函數比較多,其他數據源會少一些。
Legend
Legend 主要控制曲線的名稱和值的展示,比較簡單,這里列出一下他們的含義
-
As Table
- 是否以表格形式展示
-
To the right
- 是展示在圖表右邊還是在下面
-
Width
- 默認不填會自動伸縮,否則強制限定寬度
-
Min
- 面板時間段內的最小值
-
Avg
- 面板時間段內的平均值
-
Total
- 面板時間段內的值的總量,如上文所說獲取數值類型的總量時這個 Total 是一個很讓人誤解的參數
-
Max
- 面板時間段內的最大值
-
Current
- 面板時間段內的當前值
Display
Display 控制圖表的點和線的展示,有一些比較重要的參數
-
Draw Modes -> Lines
- 是否繪制點之間的線段
-
Draw Modes -> Points
- 是否繪制點
-
Hover info -> Mode
- 懸浮面板上展示的方式,值為
All serires
(展示該時間點的所有線段的值)和single
(只展示鼠標指着的那一條線段)
- 懸浮面板上展示的方式,值為
-
Hover info -> Sort Order
- 懸浮面板上線條的排序,一般選擇 Decreasing
-
Stacking & Null value -> Null value
- 這個比較重要,需要根據點的密度來動態決定,如果點少很容易讓人誤解兩個點中間也存在點。
- 點多時,選擇 connected
- 點少時,選擇 null
高級函數
以 graphite 為例子,打點路徑中的 KEY 只支持大小寫字母、數字、中划線和下划線,這會導致前端的路徑(經常包含 # 和 :path)存不下來,因此我們只能提前轉譯,例如將 # 轉譯為 ANCHOR,將 :path 轉譯為 PATH ,再將 / 轉譯為 -,這樣在變量模板中展示的就是比較怪異的前端路徑,不過好在我們有函數,可以在界面上把它替換回來。
點擊編輯界面 Metrics 面板中編輯模式的加號,添加 aliaSub
函數,並依此填入上圖的三種的替換規則,在界面上就可以看到如下圖的正常路徑了:
aliaSub 只是其中一個簡單的 alias 函數,用來處理曲線的名稱,更多的函數是被用來處理單個查詢的聚合、多條曲線的聚合、展示不同時間線、計算和過濾,本節會介紹其中一些經常用到的函數。
聚合單個查詢的多條匹配曲線的總量 Combine -> sumSeries
例如,假設 stats_count.fe.test.*
有幾十個匹配值,那么這個查詢就會在圖表中展示幾十條曲線,此時如何獲取所有曲線的總值呢?不需要在打點時多打一份總量數據,直接使用 sumSeries
函數即可,sumSeries(stats_count.fe.test.*)
時間線遷移 Transform -> timeShift
想要在這個時間段內同時展示前一天的的曲線?timeShift(Query, '-1d')
即可
去除異常值 Filter -> removeAboveValue
如果數值類型中出現了異常的值,例如平均為 1秒 的情況下出現了幾百萬秒的情況,那么就可以通過眾多的過濾函數在界面上直接過濾掉而不是去修改打點代碼,removeAboveValue(Query, 10000)
即可
重命名函數
-
alias
- 直接重命名該曲線,參數為曲線名稱
-
aliasByNode(4, 5, 6)
- 將曲線命名為原名稱的第4、5、6段
-
aliasSub
- 正則替換名稱中的某一段
多條曲線數值的聚合 Special -> groupByNode
sumSeries 函數只能簡單地將多條數據的最終值加起來,如果不是末尾位置的就不行了,而且也不支持除了 sum 外的功能,例如 avg 平均,使用 groupByNode 就可以動態地對指定位置的多個數值類型進行聚合了,如下圖:
計算多個 Query 組成的成功率 Calculate -> asPercent
假設我們有如下幾條打點:
stats.timers.fe.test.error1.count stats.timers.fe.test.error2.count stats.timers.fe.test.error3.count stats.timers.fe.test.success.count
此時想要計算 success 的成功比例,如何做呢?
在這種相較復雜的情況下,就不能只靠一個 Query 來解決了,首先我們創建兩個 Query,如下:
stats.timers.fe.test.*.count (Query 序列號為 #A) stats.timers.fe.test.success.count (Query 序列號為 #B)
再創建第三個 Query,值為 asPercent(#B, sumSeries(#A)
,顧名思義,首先將 #A 的查詢聚合起來得到總值,再用 asPercent 來進行除法即可。
通過如上的幾個例子,可以看到函數強大的功能,即使是很復雜的在以前需要用后端代碼來實現的部分,都可以通過多條Query和多個函數的互相嵌套來在界面上簡單地實現。
每個數據源都有對應的函數開發文檔,例如 graphite。grafana 正是憑借着對眾多數據源以及函數的支持,才能在一個網頁界面上完成這么多強大的功能。
其他
報警
grafana 在 4.0 版本后增加了報警功能,不過 grafana 的報警屬於數據源的后置查詢,實時性不大能滿足需求,我們公司有一個開源的 banshee ,就是為了解決這個問題。
banshee 使用了三西格馬定律,支持基於閾值和趨勢的報警,同時提供開放的 API 和 webhook 並默認集成了 Slack。banshee 和數據源位於同一個位置(statsd 的后端),因此可以保證時效性,也因為報警的獨立性質所以對 grafana 版本沒有任何要求。
statsd 打點的限制
grafana 依賴的如果是時序性數據庫,那么每一個 KEY 都會對應一個文件來存儲數據,例如 stats.timers.fe.test.*
相當於 stats/timers/fe/test
文件夾下的所有文件,因此必須注意打點路徑不要有過多的組合,比如將省份和市作為 KEY 時的組合很容易就能占到 1G 以上的數據導致磁盤爆掉。
為了避免組合過多導致路徑污染,請盡量保證每個 KEY 中格式化掉點,例如替換成下划線,另外打點路徑可以盡量多加一點前綴,例如將stats.timers.fe.test.*
改為 stats.timers.fe.test.v1.*
,這樣一旦污染后,清理數據時可以直接把 v1 整個文件夾刪除而不是刪除 test 這個根路徑,用以保留你的歷史正常的打點數據。
后端查詢 grafana 數據
一般推薦使用 API KEY 來查詢 grafana 的數據,Admin 權限賬號可以在界面中生成上文三種權限的 API KEY,不過 grafana 默認會開啟 Basic Auth,使用賬號密碼即可通過 grafana 的鑒權,例如http://${account}:${password}@${grafana_host}/api/org
。
當然,最好是擁有數據源的讀權限來直接讀取數據。
匿名模式
有時候用戶確實沒有 grafana 的賬號,但他就是想看面板,怎么辦?此時就得 grafana 的匿名模式出馬了。
grafana 配置文件中有 auth.anonymous
配置段,enabled
控制開關,org_name
控制開啟匿名模式的組織,org_role
控制匿名者的權限。組織開啟匿名意味着非登錄用戶能夠直接跳過 grafana 無權限地查詢數據源,因此請保證數據源的安全,例如限定內網訪問。
最后
本文介紹了 grafana 相對高級的一些使用技巧,除了可以看到 grafana 的強大功能以外,也應該注意到 grafana 只是一個時序性很強的統計監控平台,一些非時序性質的功能例如報錯的聚合和報錯的日志等應該交給更專業的去做,例如 sentry 和 ELK。