如何正确绘制Prometheus计数器的5分钟增量图表?
问题
我的代码每分钟将计数器app_test_metric_counter_total递增1,附带color标签(可选值:green、yellow、red),当前暴露的指标如下:
# HELP app_test_metric_counter_total Test metric counter # TYPE app_test_metric_counter_total counter app_test_metric_counter_total{color="green",job="app.playcocola.com"} 1 app_test_metric_counter_total{color="yellow",job="app.playcocola.com"} 2
Prometheus每15秒拉取一次该指标,我需要绘制展示5分钟增量的图表,但多次尝试均不符合预期:
- 使用
sum(increase(app_test_metric_counter_total[5m])),预期得到值为5的平直线,实际图表上下波动,出现小数甚至0值; - 改用1分钟时间范围
sum(increase(app_test_metric_counter_total[1m])),结果相对稳定但仍有小数和0值; - 尝试
sum_over_time(app_test_metric_counter_total[5m])得到了过大的数值; - 使用
sum(rate(app_test_metric_counter_total[5m])) * 60 * 5,依然出现波动值和0值。
分析与解决方案
为什么之前的查询出问题
increase[5m]波动问题:increase计算指定时间窗口内计数器的增量,但Prometheus的查询步长(图表采样间隔)如果和15秒拉取间隔、5分钟窗口不匹配,会导致部分窗口覆盖的样本数不足。比如窗口卡在两个拉取周期之间时,可能只包含19个样本(而非5分钟应有的20个),计算出的增量就会小于5,甚至出现0值(窗口内无样本变化)。sum_over_time[5m]数值过大:这个函数是对窗口内所有样本值求和,而非计算增量,结果是多个时刻的计数器值相加,自然远大于实际增量。rate[5m]*300波动:rate计算窗口内的平均每秒增长率,5分钟窗口若遇到计数器刚好在窗口边缘更新,会导致速率计算不准,乘以300后结果就会波动。
正确的查询方式
方式1:用匹配更新周期的rate计算增量
因为计数器是每分钟固定递增1,选1分钟作为rate的时间窗口最匹配,再乘以5分钟的秒数(300)得到总增量:
sum(rate(app_test_metric_counter_total[1m])) * 60 * 5
如果需要按color标签拆分查看,加上by (color):
sum(rate(app_test_metric_counter_total[1m])) by (color) * 60 * 5
解释:rate[1m]会计算每分钟的平均增长率(刚好是1/60 per second),乘以300后就是5分钟的总增量5,结果会非常稳定。
方式2:调整increase的查询步长
如果坚持用increase,需要确保查询步长等于或大于拉取间隔(15秒),且窗口完整覆盖计数器更新周期。比如将查询步长设为1分钟,使用:
sum(increase(app_test_metric_counter_total[5m]))
此时每个查询窗口都会覆盖完整的5分钟周期,增量稳定为5。
额外注意事项
- 确保计数器没有被重置(比如进程重启导致计数器归零),若有重置需用
counter_reset函数处理,或在查询中加offset规避。 - 图表采样间隔(步长)不要设置太小,建议设为15秒或1分钟,避免窗口拆分导致的计算误差。
内容的提问来源于stack exchange,提问作者fguillen
相关产品推荐
相关产品推荐

