如何统计Prometheus Histogram指定时间范围各桶的观测数量
Prometheus直方图桶计数统计正确方案
原有查询的问题说明
- 第一种查询
sum(operation_x_bucket{operationType="TypeA"}) by (le)
该查询返回的是服务启动到当前时刻的累积桶计数,不是你指定时间范围内的增量数据,如果服务在时间范围内有重启,计数还会被重置,结果必然不符合预期。 - 第二种查询
sum(increase(operation_x_bucket{operationType="TypeA"}[$__range])) by (le)
逻辑本身符合时间范围增量统计的要求,结果偏低通常是配置、使用细节问题导致的。
正确统计方式
场景1:统计时间范围内累积桶的增量(即所有<=对应桶边界的总观测数)
直接使用调整后的查询即可:
sum by (le) (increase(operation_x_bucket{operationType="TypeA"}[$__range]))
如果结果仍然偏低,按以下顺序排查:
- 确认是否遗漏了
le="+Inf"桶的统计:所有耗时超过你配置的最大桶边界625000的请求,只会被计入该桶,未纳入展示的话总计数会明显低于实际值。 - 确认标签匹配正确性:
operationType="TypeA"的取值需要和上报的标签值完全一致,大小写、特殊字符的差异都会导致过滤结果缺失。 - 确认耗时单位和桶配置匹配:如果桶配置单位是毫秒,但上报耗时用了微秒/秒,会导致大部分请求被归入边界最大的桶甚至
+Inf桶,统计分布不符合预期。 - 对于短时间范围查询误差,可以替换为rate乘以时间秒数的写法,减少外推误差:
sum by (le) (rate(operation_x_bucket{operationType="TypeA"}[$__range])) * $__range_s
场景2:统计时间范围内非累积的独立区间观测数(即1000<耗时<=5000、5000<耗时<=25000这类区间的独立数量)
不需要手动写PromQL做差值计算,直接开启Grafana热力图组件的转换累积直方图为梯度直方图开关,喂入上述累积桶增量的查询结果即可,组件会自动计算每个区间的独立计数。
内容的提问来源于stack exchange,提问作者Jose S
相关产品推荐
相关产品推荐

