You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确绘制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值。

分析与解决方案

为什么之前的查询出问题

  1. increase[5m]波动问题:increase计算指定时间窗口内计数器的增量,但Prometheus的查询步长(图表采样间隔)如果和15秒拉取间隔、5分钟窗口不匹配,会导致部分窗口覆盖的样本数不足。比如窗口卡在两个拉取周期之间时,可能只包含19个样本(而非5分钟应有的20个),计算出的增量就会小于5,甚至出现0值(窗口内无样本变化)。
  2. sum_over_time[5m]数值过大:这个函数是对窗口内所有样本值求和,而非计算增量,结果是多个时刻的计数器值相加,自然远大于实际增量。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:42:04