Prometheus高查询间隔下sum查询数据丢失 如何获取正确求和结果
问题根本原因
你遇到的结果偏差本质是Grafana范围查询时,随时间范围扩大自动调大step(查询间隔)导致的:Prometheus会按step把时间轴切分为多个窗口,每个窗口仅取单个采样点执行sum(my_metrics)计算,窗口越大漏算的原始采样点越多,最终结果就越小。
解决方案
根据你的使用场景选择对应方案即可:
场景1:需要统计整个时间范围内的累计总和
直接使用PromQL的over_time类聚合函数搭配Grafana内置变量$__range,完全不受查询步长影响:
- 若
my_metrics是Gauge类型(当前值快照,比如在线人数、内存使用率),统计全时间范围所有采样点总和:
sum(sum_over_time(my_metrics[$__range]))
- 若
my_metrics是Counter类型(只增不减的累计值,比如请求数、调用次数),统计全时间范围的增量总和:
sum(increase(my_metrics[$__range]))
$__range会自动替换为你当前面板选择的时间范围(比如24h),会拉取该范围内所有原始采样点做计算,不会出现漏算。
场景2:需要展示每个时间点的瞬时sum趋势
如果是要做趋势图,需要保留每个时间点的sum值,可固定查询步长避免自动调大:
- 打开Grafana对应面板的查询选项(Query options)
- 找到
Min step参数,设置为你的指标实际采样间隔的整数倍(比如指标每15s上报一次就设为15s)
设置后无论你选择多大的时间范围,查询步长都不会超过该阈值,保证每个窗口的采样点不会漏算。
场景3:大时间范围查询性能优化
如果经常需要查询7天以上的大范围数据,固定步长会导致查询卡顿,可提前配置Prometheus Recording Rule预聚合:
在Prometheus配置文件中添加如下规则:
groups: - name: my_metrics_aggregate rules: - record: my_metrics:sum expr: sum(my_metrics) interval: 15s # 按你需要的精度设置采样间隔
后续查询直接使用预聚合后的指标my_metrics:sum,既可以保证精度,也能大幅提升查询速度。
内容的提问来源于stack exchange,提问作者Ronaldo Lanhellas
相关产品推荐
相关产品推荐

