Python 自动创建 Grafana 仪表板
来源:https://medium.com/swlh/
Grafana 是一个功能非常强大的图表可视化工具,可以通过仪表盘轻松地将多个数据源的指标/日志数据进行可视化。有关其功能的更多介绍,可以查看官网 https://grafana.com/ 的相关说明。创建一个仪表盘并不是非常困难,但是我们需要手动去点击每个图表的设置项去进行配置,这个过程比较繁琐,我们希望有更加工程化的工具来做这个事情。
标准的 Dashboard
Grafana 的 Dashboard 是通过 JSON 格式的数据提供的,我们大部分都会创建 Dashboard,然后将其粘贴到保存 Dashboard 的文件夹中,如果你也同样使用 prometheus-operator 的话,则需要更新到对应的 ConfigMap 中去。
这种复制粘贴 Dashboard 的过程中,我们会经常在手动去更改 JSON 文件中的一些值的时候出错,如何让这个过程更加方便,减少错误,增加一些版本记录呢?
在本文中,我们将使用 Prometheus 数据源和 prometheus-operator,你可以通过一些小的调整来适配你的监控栈方案。
使用 Grafanalib
Grafanalib
是一个开源的 Python 库,我们可以使用这个库来对 Dashboard 进行编码,编码后的 Dashboard 会生成对应的 JSON 数据。首先安装这个依赖库:
pip install grafanalib
然后获取一个 Python 编写的基本 Dashboard:
$ curl -o example-core.dashboard.py \
https://gist.githubusercontent.com/KamilSwiech/bd170b3724819fd14531b4bf36fee8da/raw/d705749745ceffefe86ee775c1e135a4aed95d01/example-core.dashboard.py
然后我们查看 example-core.dashboard.py
文件的内容:
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()
其中有两个地方值得注意:
dataSource:指定 Grafana 中数据源的名称
expr:查询表达式,我们这里使用 Prometheus,也就是对应的 PromQL 语句
如果需要则调整相关的字段,然后使用 Grafanalib
自带的二进制来创建 JSON 文件:
generate-dashboard -o test.json example-core.dashboard.py
这样我们就有了一个简单的 Dashboard 了,由于我这里使用的是 prometheus-operator,所以还需要做额外的配置,我这里已经创建了包含 json 数据的 ConfigMap,包含指定的标签和命名空间,并将其保存到 yaml 文件中,因为我这里使用了 GitOps 来做持续部署,所以只需要保存到 yaml 文件而不是直接创建到集群中:
$ 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 就可以使用了。
使用这种可编程的方式来生成 Dashboard 显然更加工程化,而且我们还可以将代码提交到 git 仓库中进行版本管理,然后再结合 GitOps 就完成可以将这个过程自动化了。
- END -
推荐阅读 强大的 iptables 在 K8s 中的应用剖析
点亮,服务器三年不宕机