大家好!今天,我们将深入探讨在监控系统,特别是像Prometheus这样的系统中,经常使用的两种重要指标类型——直方图(Histogram)和摘要(Summary)之间的关键区别。
两者都用于测量请求延迟(request latency)或响应大小(response size)等值的分布,但它们的操作方式存在一个非常重要的差异。那就是,计算在哪里进行!🤔

🚀 核心区别:计算的主体
开门见山地说,两者的最大区别如下:
- 直方图 (Histogram):数据收集和计算在服务器端(Server-side)进行。 🖥️
- 摘要 (Summary):数据计算在客户端(Client-side)进行。 💻
为什么这个简单的区别如此重要?现在让我们详细探讨一下。
🖥️ 直方图 (Histogram):借助服务器的力量!
直方图是一种客户端(您的应用程序)将观测到的值直接发送到服务器(例如:Prometheus服务器)的方式。
它是如何工作的?
- 客户端 (应用程序) 💻:每次收到请求时,测量响应时间(例如:150ms)。
- 传输测量值:将这个150ms的值直接发送到服务器。客户端不进行复杂的计算!
- 服务器 (Prometheus) 🖥️:服务器拥有预定义的“桶(bucket)”。例如,(0-100ms, 100-200ms, 200-300ms, …)这样的区间。
- 服务器端计算:服务器根据从客户端收到的150ms值,将“100-200ms”桶的计数增加1。
- 分位数计算:基于所有收集到的桶数据,服务器直接估算并计算百分位数(Quantile,例如:99%, 95%)。
优点 👍
- 低客户端负载:客户端只需发送测量值,因此几乎没有CPU或内存负担。轻巧快速! 🕊️
- 灵活的聚合(Aggregation):可以将在服务器端从多个客户端(实例)收集到的数据进行汇总,计算整个服务的分位数。您将得到整个(A+B)服务器的99%,而不是A服务器的99% + B服务器的99%。这是直方图最强大的优势! 💯
- 自由查询:基于收集到的数据,服务器可以方便地进行各种条件查询和分析。
缺点 👎
- 精度限制:由于使用预定义的桶,百分位数计算是近似值,而非精确值。桶的范围越宽,误差可能越大。
💻 摘要 (Summary):客户端直接解决!
摘要是一种客户端(应用程序)直接计算分位数,然后将结果值发送到服务器的方式。
它是如何工作的?
- 客户端 (应用程序) 💻:在一定时间内,自行存储所有传入请求的响应时间值。(例如:[120ms, 150ms, 90ms, 210ms, …])
- 自行计算:客户端根据这些数据,直接准确地计算分位数(例如:99%是210ms,50%是135ms)。
- 发送结果:将计算完成的结果值(quantile=”0.99″, value=”210″)发送到服务器。
优点 👍
- 高精度:由于客户端直接使用所有测量值进行计算,百分位数非常准确。 ✅
- 直观结果:可以清晰地设置和查看所需的分位数(p50, p90, p99等)。
缺点 👎
- 高客户端负载:需要在一定时间内将所有测量值保存在内存中,并计算分位数,因此CPU和内存使用量较高。 😥
- 无法聚合(Aggregation):由于每个客户端都已将计算结果发送到服务器,因此无法将多个客户端的数据合并以计算整个服务的分位数。(对A服务器的99%和B服务器的99%取平均值在统计上没有意义。) ❌
🎯 一目了然的比较表
| 区分 | 直方图 (Histogram) | 摘要 (Summary) |
|---|---|---|
| 计算位置 | 服务器端 🖥️ | 客户端 💻 |
| 客户端负载 | 低 (Low) 🕊️ | 高 (High) 🐘 |
| 数据聚合 | 可能 (Possible) ✅ | 不可能 (Impossible) ❌ |
| 分位数精度 | 近似值 (Approximate) | 精确 (Accurate) |
| 主要用途 | 整体服务指标 (例如: API响应时间) | 单个实例的精确性能测量 |
✨ 那么,应该使用哪一个呢?
- 在大多数情况下,推荐使用直方图。 🚀 在微服务架构等运行多个实例的环境中,了解整个服务的性能至关重要。直方图可以灵活地聚合数据,因此在测量SLO/SLA和监控整体服务健康状况方面更为有用。
- 摘要仅在特殊情况下使用。 🎯 当绝对需要精确的分位数计算,并且多个实例之间的数据聚合不重要时,摘要是合适的。例如,当您想准确了解单个批处理(batch)作业的执行时间分布时,它会很有用。
现在,您是否清楚地理解了直方图和摘要之间的区别?在构建监控系统时,请根据您的情况选择正确的指标类型,以实现更有效的可观测性(Observability)!
发表回复