Prometheus 中的 Bucket(桶)是什么?
Bucket 是 Histogram 指标的分桶区间,每个桶记录"小于等于 le 边界的观测数",暴露为 xxx_bucket{le="0.5"} 序列。本文讲清桶的累积语义、histogram_quantile 计算原理与桶边界设计方法。
Bucket 是直方图(Histogram)的分桶:你定义一组上界(le),Prometheus 自动为每个上界维护一个累计计数——request_duration_seconds_bucket{le="0.5"} 的值表示耗时 ≤0.5 秒的请求总数。
桶是怎么工作的
定义桶边界 [0.1, 0.5, 1, 5] 后,客户端暴露这样的序列:
request_duration_seconds_bucket{le="0.1"} 105
request_duration_seconds_bucket{le="0.5"} 480 ← 含 ≤0.1 的 105
request_duration_seconds_bucket{le="1"} 760
request_duration_seconds_bucket{le="5"} 799
request_duration_seconds_bucket{le="+Inf"} 800 ← 总是等于总数
桶是累积的——每个桶包含前面所有桶的计数,le="+Inf" 兜底等于观测总数。
为什么这样设计
累积结构让分位数可以插值计算:
histogram_quantile(0.95, sum(rate(request_duration_seconds_bucket[5m])) by (le))
Prometheus 找到 P95 落在哪个桶,在桶内线性插值出近似值。误差取决于桶的疏密——关键区间桶越密,分位越准。
桶边界设计原则
- 围绕 SLO 布点:SLO 是 500ms,就在 300/400/500/600/800ms 附近加密;
- 覆盖全量程:最小桶别漏掉大量样本,最大也别漏;
- 数量适中:每桶 = 一条序列 × 标签组合数,10-20 个桶通常够用。
观测云对照
观测云完全兼容 Prometheus Histogram 数据;在 APM 中,接口延迟的分布、分位数由链路数据直接计算,精度不依赖预设桶边界。
常见问题(FAQ)
Q:桶定错了能改吗? 可以改代码里的边界,但历史数据桶结构不变,变更前后分位数会有跳变。
Q:bucket 序列能直接画图吗? 一般不直接画,配 rate + histogram_quantile 或 heatmap 面板使用。