Python 自動(dòng)創(chuàng)建 Grafana 儀表板
來(lái)源:https://medium.com/swlh/

Grafana 是一個(gè)功能非常強(qiáng)大的圖表可視化工具,可以通過(guò)儀表盤輕松地將多個(gè)數(shù)據(jù)源的指標(biāo)/日志數(shù)據(jù)進(jìn)行可視化。有關(guān)其功能的更多介紹,可以查看官網(wǎng) https://grafana.com/ 的相關(guān)說(shuō)明。創(chuàng)建一個(gè)儀表盤并不是非常困難,但是我們需要手動(dòng)去點(diǎn)擊每個(gè)圖表的設(shè)置項(xiàng)去進(jìn)行配置,這個(gè)過(guò)程比較繁瑣,我們希望有更加工程化的工具來(lái)做這個(gè)事情。
標(biāo)準(zhǔn)的 Dashboard
Grafana 的 Dashboard 是通過(guò) JSON 格式的數(shù)據(jù)提供的,我們大部分都會(huì)創(chuàng)建 Dashboard,然后將其粘貼到保存 Dashboard 的文件夾中,如果你也同樣使用 prometheus-operator 的話,則需要更新到對(duì)應(yīng)的 ConfigMap 中去。

這種復(fù)制粘貼 Dashboard 的過(guò)程中,我們會(huì)經(jīng)常在手動(dòng)去更改 JSON 文件中的一些值的時(shí)候出錯(cuò),如何讓這個(gè)過(guò)程更加方便,減少錯(cuò)誤,增加一些版本記錄呢?
在本文中,我們將使用 Prometheus 數(shù)據(jù)源和 prometheus-operator,你可以通過(guò)一些小的調(diào)整來(lái)適配你的監(jiān)控棧方案。
使用 Grafanalib
Grafanalib 是一個(gè)開源的 Python 庫(kù),我們可以使用這個(gè)庫(kù)來(lái)對(duì) Dashboard 進(jìn)行編碼,編碼后的 Dashboard 會(huì)生成對(duì)應(yīng)的 JSON 數(shù)據(jù)。首先安裝這個(gè)依賴庫(kù):
pip install grafanalib然后獲取一個(gè) Python 編寫的基本 Dashboard:
$ curl -o example-core.dashboard.py \https://gist.githubusercontent.com/KamilSwiech/bd170b3724819fd14531b4bf36fee8da/raw/d705749745ceffefe86ee775c1e135a4aed95d01/example-core.dashboard.py
然后我們查看 example-core.dashboard.py 文件的內(nèi)容:
from grafanalib.core import (Graph,Row,Target, TimeRange, YAxes, YAxis)dashboard = Dashboard(title="Python generated dashboard",rows=[=[Graph(title="Prometheus http requests",dataSource='default',targets=[Target(expr='rate(prometheus_http_requests_total[5m])',legendFormat="{{ handler }}",refId='A',),],yAxes=single_y_axis(format=OPS_FORMAT),),]),],).auto_panel_ids()
其中有兩個(gè)地方值得注意:
dataSource:指定 Grafana 中數(shù)據(jù)源的名稱
expr:查詢表達(dá)式,我們這里使用 Prometheus,也就是對(duì)應(yīng)的 PromQL 語(yǔ)句
如果需要?jiǎng)t調(diào)整相關(guān)的字段,然后使用 Grafanalib 自帶的二進(jìn)制來(lái)創(chuàng)建 JSON 文件:
generate-dashboard -o test.json example-core.dashboard.py這樣我們就有了一個(gè)簡(jiǎn)單的 Dashboard 了,由于我這里使用的是 prometheus-operator,所以還需要做額外的配置,我這里已經(jīng)創(chuàng)建了包含 json 數(shù)據(jù)的 ConfigMap,包含指定的標(biāo)簽和命名空間,并將其保存到 yaml 文件中,因?yàn)槲疫@里使用了 GitOps 來(lái)做持續(xù)部署,所以只需要保存到 yaml 文件而不是直接創(chuàng)建到集群中:
$ kubectl create cm test -n prometheus-operator --from-file=test.json -o yaml --dry-run | \kubectl label -f- --dry-run -o yaml --local grafana_dashboard="1" > test.yaml
得到 yaml 文件后直接提交變更到 git 后,新的 Dashboard 就可以使用了。

使用這種可編程的方式來(lái)生成 Dashboard 顯然更加工程化,而且我們還可以將代碼提交到 git 倉(cāng)庫(kù)中進(jìn)行版本管理,然后再結(jié)合 GitOps 就完成可以將這個(gè)過(guò)程自動(dòng)化了。
- END -
?推薦閱讀? 強(qiáng)大的 iptables 在 K8s 中的應(yīng)用剖析 Python 調(diào)用 Kubernetes API 自動(dòng)化管理資源
30個(gè)Python極簡(jiǎn)代碼,10分鐘get常用技巧!
點(diǎn)亮,服務(wù)器三年不宕機(jī)

