如何用PromQL将Prometheus累积直方图转换为普通直方图?
将Prometheus累积直方图转换为普通直方图的PromQL方法
已知Prometheus中的http_access_bucket是累积直方图指标,示例原始数据如下:
http_access_bucket{node="aaa",le="5"} 20 http_access_bucket{node="aaa",le="10"} 30 http_access_bucket{node="aaa",le="20"} 35 http_access_bucket{node="aaa",le="50"} 38 http_access_bucket{node="aaa",le="100"} 40 http_access_bucket{node="aaa",le="+Inf"} 40
需要将其转换为普通直方图(每个le区间内的独立计数),预期输出:
temp_bucket{node="aaa",le="5"} 20 temp_bucket{node="aaa",le="10"} 10 temp_bucket{node="aaa",le="20"} 5 temp_bucket{node="aaa",le="50"} 3 temp_bucket{node="aaa",le="100"} 2 temp_bucket{node="aaa",le="+Inf"} 0
实现PromQL语句
可以用以下简洁的PromQL完成转换:
http_access_bucket - ignoring(le) group_left sort(http_access_bucket)[1:]
语句解释
sort(http_access_bucket):按le标签从小到大排序所有bucket,保证区间顺序正确。[1:]:截取排序后除第一个bucket外的所有项,作为当前区间的前序累积值。ignoring(le) group_left:忽略le标签进行匹配,确保每个bucket能准确减去前一个更小区间的累积值。- 对于
le="+Inf"的bucket,由于是排序后的最后一项,没有后续匹配项,计算结果自动为0,符合预期。
如果需要计算时间区间内的增量(而非瞬时值),可以结合increase()函数:
increase(http_access_bucket[5m]) - ignoring(le) group_left sort(increase(http_access_bucket[5m]))[1:]
其中5m可根据实际监控需求调整为合适的时间窗口。
内容的提问来源于stack exchange,提问作者progquester
相关产品推荐
相关产品推荐

