上一篇, 我們會很基本的透過畫面去新增了一個data source與一個dashboard內的一個panel.
今天來聊聊這兩個比較進階一點的存儲面.
如果什麼都要透過UI一個一個重新拉, 也不好管理.
如果想快速建立令一個Grafana站台, reuse原站台的配置, 也不可能人工手動從UI操作建立.
這時Grafana有提供了Provision這功能
在建立管理儀表板前, Grafana有一篇文章給方向希望我們思考的
Best practices for creating dashboards
Dashboard要告訴我們什麼故事或幫忙回答什麼問題呢?
我的真實案例, 我現在任職公司, 是個40年以上的傳產.
在公司介紹Grafana後, 有系統想使用看看.
但我會先問對方, 你想看到什麼?或解決什麼問題呢?
因為我要是把全部的遙測資料都倒出來顯示數值給你看, 很是容易.
但會陷入文章內的另一點
Dashboards should reduce cognitive load, not add to it
一堆沒分析整理過的數值, 只會造成看得人的認知負擔.
我給了沒用的分析結果, 也沒法真正幫對方解決問題.
Ask yourself:
- Can I tell what exactly each graph represents? Is it obvious, or do I have to think about it?
- If I show this to someone else, how long will it take them to figure it out? Will they get lost?
這兩個問題我們能反問自己.
就跟程式設計與命名一樣的困難, 但就是需要設計才好傳承.
所以要先制定好監控或排查的策略,
也能先假設可能有這問題, 那我們就把數值給作分析後呈現, 推斷是不是有這問題發生.
這點在昨天有提到, 像是USE/RED method 或者four golden signal.
第一個地震儀表板 :Grafana Datasource+DashBoard
儀錶板的設定上也有一些簡單的規範.
若是實驗或測試用的Dashboard, 能在Dashboard名字尾字加上TEST
或TMP
; 這類的儀表板, 也能在名稱中註明你的名字, 才知道這Dashboard是誰在用.
如果你的背後資料一小時才更新一次, 你就不用每10秒就瘋狂更新Dashboard, 徒勞增加Grafana與資料存儲端的存取壓力
嘗試在Dashboard, 加入一點document說明這Dashboard的故事.
管理儀表板上也有些要注意的部份.
要避免儀表板蔓生, 雖然儀表板很好被複製, 按個右鍵就能.
But! 你看過列表頁數百個Dashboard的長度嘛?
要找到一個跟大海撈針一樣. 這沒資料庫沒index, 人腦也記不了哪個系統在哪個dashboard上.
更何況是infra team member, 它們通常也不熟業務系統.
會狂生的原因跟上面有點規細, 一堆實驗測試用的dashboard就蔓生, 但沒被刪除.
複製一個沒在變化的dashboard, 這不是一個好主意, 盡量使用dashbaord variable來配置; 像昨天的測量站儀表板, 我也沒每個測量站就一個dashboard :)
Dashboard其實能給tags, 複製人家的dashboard, 連tags都會被複製, 但你倆真的一樣的tag?
能善用Dahboard links來link到共用的dashboard
Dashboard看來很容易蔓生, 如果要把這些設定備份到另一台, 或者設定匯入到這一台, 能怎做呢?
就來到Provision
都透過UI來設定Dashboard與Data sources, 就表示都是透過API在存取配置Dashboard與Data source的.
Grafana 5.0開始, 提供一個方法能透過document file來配置這些.
且有了document file, 484就能版本控制它了!
先來簡單演示一下, provision的用法
將Dashboard的名稱設定, 目錄設定等, 儀表板內容要讀取哪個資料夾的配置, 寫到demoDashboard.yml
再把本來手動拉好的panels進到下圖的畫面, 把JSON MODEL的內容存在demoDashboard.json內
基本上我們就把Dashboard相關的兩份檔案都給文件化了, 接著就啟動Grafana來讓它讀取.
folder layout
docker-compose.yaml
provisioning/
dashboards/
- demoDashboard.yml
- demoDashboard.json
docker-compose.yaml
version: '3'
services:
grafana:
image: grafana/grafana:latest
ports:
- 3000:3000
volumes:
- ./provisioning:/etc/grafana/provisioning
demoDashboard.yaml
apiVersion: 1
providers:
- name: 'Prometheus'
orgId: 1
folder: ''
folderUid: ''
type: file
disableDeletion: false
updateIntervalSeconds: 10
editable: true
allowUiUpdates: true
options:
path: /etc/grafana/provisioning/dashboards # path to dashboard files on disk. Required when using the 'file' type
foldersFromFilesStructure: true
demoDashboard.json
{
"annotations": {
"list": [
{
"builtIn": 1,
"datasource": {
"type": "grafana",
"uid": "-- Grafana --"
},
"enable": true,
"hide": true,
"iconColor": "rgba(0, 211, 255, 1)",
"name": "Annotations & Alerts",
"target": {
"limit": 100,
"matchAny": false,
"tags": [],
"type": "dashboard"
},
"type": "dashboard"
}
]
},
"editable": true,
"fiscalYearStartMonth": 0,
"graphTooltip": 0,
"id": 2,
"links": [],
"liveNow": false,
"panels": [
{
"datasource": {
"type": "datasource",
"uid": "grafana"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"axisLabel": "",
"axisPlacement": "auto",
"barAlignment": 0,
"drawStyle": "line",
"fillOpacity": 0,
"gradientMode": "none",
"hideFrom": {
"legend": false,
"tooltip": false,
"viz": false
},
"lineInterpolation": "linear",
"lineWidth": 1,
"pointSize": 5,
"scaleDistribution": {
"type": "linear"
},
"showPoints": "auto",
"spanNulls": false,
"stacking": {
"group": "A",
"mode": "none"
},
"thresholdsStyle": {
"mode": "off"
}
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
},
{
"color": "red",
"value": 80
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 9,
"w": 12,
"x": 0,
"y": 0
},
"id": 2,
"options": {
"legend": {
"calcs": [],
"displayMode": "list",
"placement": "bottom"
},
"tooltip": {
"mode": "single",
"sort": "none"
}
},
"targets": [
{
"datasource": {
"type": "datasource",
"uid": "grafana"
},
"queryType": "randomWalk",
"refId": "A"
}
],
"title": "DemoPanel",
"type": "timeseries"
}
],
"schemaVersion": 36,
"style": "dark",
"tags": [],
"templating": {
"list": []
},
"time": {
"from": "now-6h",
"to": "now"
},
"timepicker": {},
"timezone": "",
"title": "Prometheus",
"uid": "DGIDfAnVk",
"version": 1,
"weekStart": ""
}
好把上面的東西都用好了, 執行
docker-compose up -d
然後登入localhost:3000
來到Dashboards Browse
就能看到本來事先配置好的dasboards與panel了
細節明天再聊, 明天見!
Dashboard在設計前多思考一下要描述什麼故事.
在管理上也多參考一下官方文件的說明.
能做成yaml跟匯出成json檔案的部份, 就匯出方便板控.