大家好!今天我们将深入探讨OpenTelemetry (OTel) 的核心指标类型之一:Sum。🕵️♂️ 许多人可能认为Sum仅仅是“计算总和的指标”,但您是否知道,有两个重要的属性决定了它的行为方式?
它们就是单调性 (Monotonicity) 和聚合时效性 (Aggregation Temporality)。只有理解了这两个支柱,才能准确地解释和利用Sum指标。那么,现在就让我们详细了解这两个概念吧!

🗺️ 全局视角:Sum 指标的两大支柱
首先理解决定Sum指标行为方式的两个核心要素至关重要。它们并非独立概念,而是相互结合,共同定义了Sum指标的最终特性。
- 单调性 (Monotonicity):这个值是只能增加,还是增加和减少都可以?
- 聚合时效性 (Aggregation Temporality):在报告(导出)指标时,是发送整体累积值,还是只发送最近的变化量?
这两个问题的答案组合,就是您将看到的Sum指标的形态。
The image you are requesting does not exist or is no longer available
1️⃣ 第一个支柱:单调性 (Monotonicity)
单调性是关于值变化方向的规则。
✅ Monotonic: true (单调递增)
这意味着值只能增加或保持不变,绝不会减少。就像汽车的总里程表一样,里程表不会倒退! 🚗
- 特点:只添加零或正值。
- 使用示例:
- 累计API请求数
- 服务启动后发生的总错误数
- 传输的总数据字节数(bytes)
- 相关OTel Instrument:Counter
↕️ Monotonic: false (非单调,可增可减)
这意味着值可以增加,也可以减少。就像房间里的人数一样,有人进来就增加,有人出去就减少。👨👩👧👦
- 特点:可以添加正值或负值。
- 使用示例:
- 当前活跃连接数(连接时+1,断开时-1)
- 消息队列中堆积的项数(发布时+1,消费时-1)
- 内存使用量的变化
- 相关OTel Instrument:UpDownCounter
2️⃣ 第二个支柱:聚合时效性 (Aggregation Temporality)
聚合时效性是一个非常重要的属性,它决定了收集到的指标值将以哪个时间点为基准进行报告。通常,此设置在最终数据导出的Exporter级别确定。
🧱 Cumulative (累积)
Cumulative,顾名思义,是报告从进程(应用程序)启动时到当前时刻的整体累积总和的方式。
- 特点:每次报告时值不会重置,而是持续累积。(但是,如果Monotonic: false,值也可能减少。)
- 为何使用?:像Prometheus这样的监控系统偏爱这种方式。在计算特定时间段内的变化率(rate)时,基于整体累积值进行计算对数据丢失(例如:采集失败)更具鲁棒性。如果只接收变化量,而中间漏掉一次采集,那么该时间段的数据将永远无法得知。
- 报告方式示例(累积请求数):
// 假设每隔1分钟报告一次指标
// T=0: 服务启动
// T=1分钟: 发生100个请求
export({"http.server.requests": 100})
// T=2分钟: 额外发生150个请求
export({"http.server.requests": 250}) // 之前的100 + 新的150
// T=3分钟: 额外发生60个请求
export({"http.server.requests": 310}) // 之前的250 + 新的60
如您所见,该值始终表示整体累积总和。
💧 Delta (增量,变化量)
Delta是只报告自上次报告时间点以来的变化量(增加或减少)的方式。
- 特点:一旦报告完成,内部聚合值将为下一次报告而重置。
- 为何使用?:它与StatsD等重视“每时每刻的变化”的系统非常契合。此外,它也是OTLP (OpenTelemetry Protocol) 的默认值,为采集代理或后端提供了灵活处理数据的空间。
- 报告方式示例(累积请求数):
// 假设每隔1分钟报告一次指标
// T=0: 服务启动
// T=1分钟: 发生100个请求
export({"http.server.requests": 100})
// T=2分钟: 额外发生150个请求
export({"http.server.requests": 150}) // 过去1分钟的变化量
// T=3分钟: 额外发生60个请求
export({"http.server.requests": 60}) // 接下来1分钟的变化量
与Cumulative不同,每次报告仅表示独立时间段内的值。
📊 一目了然的总结
| 特点 | 说明 | 相关Instrument | 主要使用示例 |
|---|---|---|---|
| Monotonicity | 决定值是只增加(true),还是增减皆可(false)。 | Counter (true) | http.server.request.count (累计请求数) |
| UpDownCounter (false) | system.processes.active (活跃进程数) | ||
| Aggregation Temporality | 决定是报告进程启动后的整体累积值(Cumulative),还是只报告上次报告以来的变化量(Delta)。 | (Exporter设置) | Cumulative: Prometheus偏好 Delta: OTLP Exporter默认值 |
—
🚀 结论
现在,您应该已经清楚地认识到,OpenTelemetry的Sum指标并非简单的“总和”。通过Monotonicity定义数据的增减特性,并通过Aggregation Temporality决定如何报告这些数据。
理解这两个核心支柱,您就拥有了在任何监控环境中准确配置指标、清晰解释仪表盘图表的强大武器。现在,开始更深入地观察您的系统吧!
发表回复