两者的根本差别
两种类型都在解决耗时分布问题,差别在于分位在哪里计算:直方图把原始分布以桶的形式带到服务端,在查询时按需算出分位;摘要类型在客户端算好分位再上报,服务端拿到的已经是结果值。
为什么摘要不能聚合
分位数不是可加量:两个实例各自的 P99 求平均,得不到整体 P99。直方图保留的是可相加的桶计数,因此能跨实例与跨分区合并;摘要上报的是算完的结果,合并时只能做没有意义的平均,这是选择类型时最关键的一条。
基本信息
| 分位位置 | 直方图在查询时计算,摘要在采集时计算 |
|---|---|
| 跨实例聚合 | 直方图支持,摘要不支持 |
| 序列构成 | 直方图按桶生成,摘要按分位标签生成 |
| 精度 | 直方图受桶边界影响,摘要在其窗口内较精确 |
典型使用场景
- 微服务延迟看板:跨多个实例看整体 P95,只有直方图能给出正确结果
- 按接口下钻:直方图可按任意标签重新聚合分位
- 客户端开销敏感:摘要把计算放在客户端,可减少服务端负担
- 数据结构简单:摘要产生的序列数由分位数量决定,易于预估
- 需要超阈值比例:直方图可用桶相减直接算出比例
取舍对照
| 维度 | Histogram | Summary |
|---|---|---|
| 分位计算位置 | 查询时,由表达式计算 | 采集时,由客户端计算 |
| 跨实例聚合 | 支持,按桶求和后再算 | 不支持,分位不能平均 |
| 精度来源 | 受桶边界影响 | 滑动窗口内较精确 |
| 序列成本 | 由桶数量决定 | 由分位数量决定 |
场景推荐
| 场景 | 推荐 | 原因 |
|---|---|---|
| 多实例服务整体分位 | Histogram | 需要跨实例合并 |
| 单机自算且不聚合 | Summary | 省掉服务端计算 |
| 要与 SLO 阈值比对 | Histogram | 可在阈值附近加密桶 |
直方图查询与平均值
直方图查询与平均值
# P90 与 P99:先按 le 聚合桶,再计算分位
histogram_quantile(0.90, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket[5m])))
# 平均耗时等于总和除以计数
sum(rate(http_request_duration_seconds_sum[5m]))
/ sum(rate(http_request_duration_seconds_count[5m]))桶边界要覆盖业务关注点,例如 100 毫秒、300 毫秒、1 秒附近:边界过粗会让分位误差集中在最需要判断的区间。
对多个实例的摘要分位做平均或求和没有数学意义:需要聚合分位时只能改用直方图,事后无法补救。