Prometheus&Grafana使用increase查询时图例总数与实际值不符问题
问题根因分析
1. increase() 函数默认外推机制误差
你遇到的非整数结果是Prometheus increase() 函数的固有特性导致:该函数在计算计数器增量时,会根据采样点的时间分布做线性外推,匹配你指定的[1m]时间窗口长度。当计数器的跳变点刚好落在窗口边缘、或采样间隔和窗口长度不匹配时,就会出现实际增量为1但计算结果为1.2这类非整数误差。
2. 查询窗口重叠重复计数
你看到的3个值为1.2的点位,是Grafana根据你选定的总时间范围自动拆分的查询步长(step)生成的,相当于总时间范围被拆分为3个连续的1分钟查询窗口。你的那1次任务增量刚好落在这3个窗口的重叠覆盖区间,导致每个窗口的查询结果都计算到了这次增量,最终出现3个重复的1.2点位。
3. 图例统计逻辑偏差
Grafana图例的总数默认是对所有查询点位的数值直接求和,3个1.2累加后就得到了3.6的错误结果,本质是前两个问题叠加的表现。
修复方案
- 若需要保留1分钟粒度的统计,可对
increase()结果取整消除外推小数误差:
sum by (namespace) (round(increase(dbqueue_picked_tasks_total{service="$service", namespace="$environment"}[1m])))
- 若需要统计选定时间范围内的总任务数,直接使用Grafana内置的
$__range变量替换固定的1m窗口,避免窗口拆分导致的重复计数:
sum by (namespace) (increase(dbqueue_picked_tasks_total{service="$service", namespace="$environment"}[$__range]))
- 若使用Prometheus 2.37及以上版本,可开启
--enable-feature=promql-increase-rectangle启动参数,直接关闭increase()的外推逻辑,返回精确的整数增量结果。
内容的提问来源于stack exchange,提问作者Valentina Chumak
相关产品推荐
相关产品推荐

