如何精简 Prometheus 的指标和存储占用
本文最后更新于:2024年7月25日 下午
前言
随着 Prometheus 监控的组件、数量、指标越来越多,Prometheus 对计算性能的要求会越来越高,存储占用也会越来越多。
在这种情况下,要优化 Prometheus 性能,优化存储占用。第一时间想到的可能是各种 Prometheus 的兼容存储方案,如 Thanos 或 VM、Mimir 等。但是实际上虽然集中存储、长期存储、存储降采样及存储压缩可以一定程度解决相关问题,但是治标不治本。
- 真正的本,还是在于指标量(series)过于庞大。
- 治本之法,应该是减少指标量。有 2 种办法:
- Prometheus 性能调优 - 解决高基数问题
- 根据实际使用情况,只保留(keep)展示(Grafana Dashboards)和告警(prometheus rules)会用到的指标。
本次重点介绍第二种办法:如何根据实际的使用情况精简 Prometheus 的指标和存储占用?
思路
- 分析当前 Prometheus 中存储的所有的 metric name(指标项);
- 分析展示环节用到的所有 metric name,即 Grafana 的 Dashboards 用到的所有指标;
- 分析告警环节用到的所有 metric name,即 Prometheus Rule 配置中用到的所有指标;
- (可选)分析诊断环境用到的所有 metric name,即经常在 Prometheus UI 上 query 的指标;
- 通过
relabel
在metric_relabel_configs
或write_relabel_configs
仅keep
2-4 中的指标,以此大幅减少 Prometheus 需要存储的指标量.
要具体实现这个思路,可以通过 Grafana Labs 出品的 mimirtool 来搞定.
我这里有个前后的对比效果,可供参考这样做效果有多惊人:
- 精简前: 270336 活动 series
- 精简后: 61055 活动 series
- 精简效果:将近 5 倍的精简率!
Grafana Mimirtool
Grafana Mimir 是一款以对象存储为存储方式的 Prometheus 长期存储解决方案,从 Cortex 演化而来。官方号称支持亿级别的 series 写入存储和查询.
Grafana Mimirtool 是 Mimir 发布的一个实用工具,可单独使用.
Grafana Mimirtool 支持从以下方面提取指标:
- Grafana 实例中的 Grafana Dashboards (通过 Grafana API)
- Mimir 实例中的 Prometheus alerting 和 recording rules
- Grafana Dashboards JSON 文件
- Prometheus 记 alerting 和 recording rules 的 YAML 文件
然后,Grafana Mimirtool 可以将这些提取的指标与 Prometheus 或 Cloud Prometheus 实例中的活动 series 进行比较,并输出一个 used
指标和 unused
指标的列表。
Prometheus 精简指标实战
假设
假定:
- 通过 kube-prometheus-stack 安装 Prometheus
- 已安装 Grafana 且作为展示端
- 已配置相应的 告警规则
- 除此之外,无其他需要额外保留的指标
前提
- Grafana Mimirtool 从 releases 中找到 mimirtool 对应平台的版本下载即可使用;
- 已创建 Grafana API token
- Prometheus 已安装和配置.
第一步:分析 Grafana Dashboards 用到的指标
通过 Grafana API
具体如下:
1 |
|
📝说明:
http://172.16.0.20:32651
是 Grafana 地址--key=eyJr
是 Grafana API Token. 通过如下界面获得:
获取到的是一个 metrics-in-grafana.json
, 内容概述如下:
1 |
|
(可选) 通过 Grafana Dashboards json 文件
如果无法创建 Grafana API Token, 只要有 Grafana Dashboards json 文件,也可以用来分析,示例如下:
1 |
|
得到的 json 结构和上一节类似,就不赘述了.
第二步:分析 Prometheus Alerting 和 Recording Rules 用到的指标
具体操作如下:
1 |
|
结果如下 metrics-in-ruler.json
:
1 |
|
第三步:分析没用到的指标
具体如下:
1 |
|
📝说明:
--address=http://172.16.0.20:30090/
为 prometheus 地址--grafana-metrics-file="metrics-in-grafana.json"
为第一步得到的 json 文件--ruler-metrics-file="kube-prometheus-stack-metrics-in-ruler.json"
为第二步得到的 json 文件
输出结果 prometheus-metrics.json
如下:
1 |
|
第四步:仅 keep
用到的指标
在 write_relabel_configs
环节配置
如果你有使用 remote_write
, 那么直接在 write_relabel_configs
环节配置 keep
relabel 规则,简单粗暴.
可以先用 jp
命令得到所有需要 keep
的 metric name:
1 |
|
输出结果类似如下:
1 |
|
然后直接在 write_relabel_configs
环节配置 keep
relabel 规则:
1 |
|
在 metric_relabel_configs
环节配置
如果没有使用 remote_write
, 那么只能在 metric_relabel_configs
环节配置了.
以 etcd job 为例: (以 prometheus 配置为例,Prometheus Operator 请自行按需调整)
1 |
|
不用 keep
而使用 drop
同样滴,不用 keep
而改为使用 drop
也是可以的。这里不再赘述.
🎉🎉🎉
总结
本文中,介绍了精简 Prometheus 指标的需求,然后说明如何使用 mimirtool analyze
命令来确定 Grafana Dashboards 以及 Prometheus Rules 中用到的指标。然后用 analyze prometheus
分析了展示和告警中 used
和 unused
的活动 series,最后配置了 Prometheus 以仅 keep
用到的指标。
结合这次实战,精简率可以达到 5 倍左右,效果还是非常明显的。推荐试一试. 👍️👍️👍️