如何绘制忽略重启的Prometheus计数器图表?
问题描述
我有一个带标签的Prometheus计数器应用,应用重启时计数器会被重置(不会在运行间保存值)。我希望在Grafana中绘制出仿佛应用从未重启的计数器图表。目前使用sum by (label) (increase(counter_total[$__range]))能接近效果,但会系统性丢失重启后的第一个样本,同时初始样本值也无法体现。
举个例子:
| 应用计数器值 | 期望结果 | sum (increase (...)) |
|---|---|---|
| 5 | 5 | -- |
| 7 | 7 | 2 |
| 11 | 11 | 6 |
| 重启 | 11 | 6 |
| 3 | 14 | 6 |
| 8 | 19 | 11 |
可以看到,初始值5和重启后的3都没有在sum (increase (...))的结果中体现。另外,应用无法从0初始化计数器——必须先获取标签信息,此时计数器已经是非零值。
解决方案
要实现忽略重启、完整呈现累计计数的效果,可以使用以下两种PromQL查询方案:
方案1:针对单次重启场景
sum by (label) ( counter_total + sum by (label) ( last_over_time(counter_total[$__range]) * resets(counter_total[$__range]) ) )
原理
counter_total:当前时刻的计数器原始值;last_over_time(counter_total[$__range]):获取整个时间范围内计数器重启前的最后累计值;resets(counter_total[$__range]):统计时间范围内的计数器重置次数(重启一次返回1,无重启返回0);- 两者相乘后与当前计数器值相加,自动将重启前的累计值叠加到重启后的数值上,模拟“从未重启”的效果。
方案2:支持多次重启的通用场景
sum by (label) ( counter_total + sum_over_time( increase(counter_total[$__interval])[$__range:-$__interval] ) )
原理
increase(counter_total[$__interval]):计算每个查询间隔内的计数器增量;sum_over_time(...)[$__range:-$__interval]:累加当前时刻之前所有间隔的增量总和;- 与当前计数器值相加后,得到从时间范围起始到当前时刻的完整累计值,自动适配所有重启场景。
补充优化
如果使用Grafana可视化,还可以配合面板的变换功能简化操作:
- 先使用基础查询
sum by (label) (increase(counter_total[$__interval])); - 在面板的「Transform」选项中添加「Cumulative sum」变换,实现增量的累计叠加,同时需注意在查询中额外处理初始样本值的补充。
内容的提问来源于stack exchange,提问作者Jmb
相关产品推荐
相关产品推荐

