业务系统设计了 Summary 类型的监控指标,计算平均耗时:request_duration_milliseconds_sum / request_duration_milliseconds_count。
查看数据,发现某个接口平均耗时很高,翻看时序图,平均耗时是突然增加的,等于就是某次请求耗时很高,拉高了平均值,想查具体是什么时候发生的请求,由于时段内的请求太少,查出来的数据一直空。
答疑
✅ 为什么 _sum
和 _count
有数据
_sum
和_count
是 Summary 类型的核心指标,Prometheus 始终会采集并记录这两个值;- 它们是累积型的 counter,适合用
rate()
或increase()
; - 无论请求延迟如何变化,只要有请求,就一定会有
_sum
和_count
数据;
❌ 为什么 {quantile="0.99"}
可能无法在时序图中展示
哪怕 Summary 配置了 quantile=“0.99”,这个时间序列也可能不存在或缺失:
指标肯定是配置了,数据也没有过期,📉 请求量太小,quantile 无法计算,滑动窗口机制,过了这段时间,就不会再纳入统计范围。
分位数(如 p99)是通过采样统计计算的:
- 如果某段时间内请求数太少(如 1~2 个请求),p99 的计算是不稳定或没有代表意义;
- Prometheus 客户端 SDK 会选择不暴露该 quantile 时间序列,以避免误导;
- 所以你会看到
_sum
、_count
正常累加,但quantile="0.99"
没数据。
Histogram 和 Summary 的区别
Histogram
-
工作原理:
Histogram 会将数据分桶(buckets),记录每个桶中落入的样本数量。
例如,定义的桶为[10ms, 50ms, 100ms, 500ms, 1s]
,每次请求的耗时会被归入对应的桶中。 -
优点:
- 可以在 Prometheus 中聚合多个实例的数据(例如多个服务节点的请求耗时分布)。
- 适合计算分位数(如 P50、P95、P99)和观察耗时分布。
- 提供了灵活的查询能力,支持通过 PromQL 动态计算分位数。
-
缺点:
- 需要预定义桶的范围,选择不当可能导致数据分布不均(例如,所有请求都落在一个桶中)。
- 桶的数量越多,存储和计算的开销越大。
-
适用场景:
- 需要聚合多个实例的数据。
- 需要动态调整分位数或分析耗时分布。
Summary
-
工作原理:
Summary 会在客户端直接计算分位数(如 P50、P95、P99),并将结果上报到 Prometheus。
它还会记录样本的总数和总和,用于计算平均值。 -
优点:
- 不需要预定义桶,直接提供分位数结果。
- 适合单实例的精确分位数计算。
-
缺点:
- 分位数的计算是在客户端完成的,无法在 Prometheus 中聚合多个实例的数据。
- 如果需要调整分位数(如从 P95 改为 P99),需要修改代码并重新部署。
-
适用场景:
- 单实例监控,且对分位数的精确性要求较高。
- 不需要聚合多个实例的数据。
主要区别对比
特性 | Histogram | Summary |
---|---|---|
分位数计算 | 在 Prometheus 中动态计算 | 在客户端直接计算 |
多实例聚合 | 支持 | 不支持 |
桶的定义 | 需要预定义 | 不需要 |
存储开销 | 取决于桶的数量 | 固定开销 |
灵活性 | 高(可动态调整分位数) | 低(需修改代码调整分位数) |
总结
- 如果需要聚合多个实例的数据,或者需要灵活调整分位数,选择 Histogram。
- 如果只需要单实例的精确分位数,且分位数固定,选择 Summary。
在你的场景中,由于服务是分布式的,建议优先使用 Histogram,这样可以在 Prometheus 中聚合所有实例的数据,并动态计算分位数和耗时分布。
滑动窗口的概念及其与 Histogram 和 Summary 的关系
滑动窗口的概念
滑动窗口是一种时间窗口机制,用于统计一段时间内的数据变化。它通过不断移动的时间范围,动态反映系统的实时状态。滑动窗口的特点是:
- 固定时间范围:窗口的长度是固定的,例如最近 1 分钟、5 分钟。
- 实时更新:随着时间的推移,窗口会滑动,旧的数据被移出窗口,新数据被加入窗口。
- 常见用途:用于计算实时指标(如请求速率、平均值、分位数等)。
在 Prometheus 中,滑动窗口通常通过查询函数(如 rate()
、avg_over_time()
)实现。
滑动窗口与 Histogram 的关系
-
Histogram 的数据结构:
Histogram 会将样本数据分桶,并记录每个桶的计数。Prometheus 会周期性地抓取这些计数值。 -
滑动窗口的实现:
在 Prometheus 中,可以通过查询语句对 Histogram 的数据应用滑动窗口。例如:rate(http_request_duration_seconds_bucket[5m])
:计算过去 5 分钟内每个桶的请求速率。histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
:计算过去 5 分钟内的 P95 分位数。
-
优点:
- 滑动窗口可以动态反映最近一段时间的请求耗时分布。
- Histogram 的分桶机制与滑动窗口结合,可以高效计算分位数和分布。
滑动窗口与 Summary 的关系
-
Summary 的数据结构:
Summary 会在客户端直接计算分位数,并上报到 Prometheus。它还会记录样本总数和总和。 -
滑动窗口的实现:
在 Prometheus 中,可以通过查询语句对 Summary 的数据应用滑动窗口。例如:rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m])
:计算过去 5 分钟内的平均请求耗时。
-
限制:
- Summary 的分位数是客户端计算的,无法在 Prometheus 中重新计算分位数,因此滑动窗口对分位数的支持有限。
- 如果需要聚合多个实例的数据,滑动窗口无法直接作用于 Summary 的分位数。
滑动窗口的适用场景
- 实时监控:滑动窗口适合用于监控系统的实时状态,例如最近 1 分钟的请求速率、耗时分布等。
- 异常检测:通过滑动窗口,可以快速发现短时间内的异常情况(如请求耗时突然增加)。
- 动态分析:滑动窗口可以动态反映系统的变化趋势,而不是静态的全局统计。
总结
- Histogram 与滑动窗口结合,可以动态计算分位数(如 P95、P99)和请求耗时分布,适合分布式系统的监控。
- Summary 与滑动窗口结合,可以计算平均值等简单指标,但分位数的灵活性较差,且不支持多实例聚合。
在你的场景中,由于需要监控极端请求耗时(如 P99)和大部分请求的平均值,建议使用 Histogram,并结合滑动窗口查询来动态分析系统的性能表现。