Prometheus监控系统Histogram和Summary

业务系统设计了 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,并结合滑动窗口查询来动态分析系统的性能表现。

金融IT程序员的瞎折腾、日常生活的碎碎念
使用 Hugo 构建
主题 StackJimmy 设计