OpenTelemetry Delta 时间性与 Datadog

💡 原文英文,约900词,阅读约需4分钟。
📝

内容提要

OpenTelemetry 指标发往 Datadog 时,Delta 时间性可避免容器重启导致的计数器重置伪影。Datadog 内部按增量存储计数器。计数器用 max 聚合防止容器轮换导致减半,.as_count() 查看总量,.as_rate() 需短导出间隔。直方图使用 avg:/p95: 前缀,禁用 .as_rate()/.as_count()。仪表使用累计时间性。

🔎

延伸解读

Delta 时间性如何避免容器重启伪影

当容器重启时,累积计数器会从大值归零,Datadog 必须检测并丢弃负差值,这可能产生虚假尖峰或下跌。而 Delta 时间性下,每个数据点自包含,容器重启对指标不可见。因此,向 Datadog 发送 Delta 计数器能有效避免重置伪影,尤其适合容器化环境。

计数器查询:max 聚合与 .as_count() 的适用场景

在容器轮换时,旧容器可能发出低值数据点,默认 avg 聚合会将其与新容器平均,导致速率减半。使用 max 聚合可反映活跃容器的真实吞吐。.as_count() 查看滚动桶内的总计数,适合发现突发流量;.as_rate() 计算每秒速率,但需短导出间隔(如 10 秒)才有意义,长间隔下仅为粗略估计。

直方图查询:禁用 .as_rate()/.as_count(),使用聚合前缀

直方图导出桶计数、总和、计数、最小值和最大值,Datadog 据此计算百分位数和精确平均值。不要对直方图使用 .as_rate() 或 .as_count(),这些是计数器专用修饰符。应使用聚合前缀如 avg:、p95:、max: 来控制视图。例如,p95: 用于告警最坏情况,avg: 用于典型延迟。

仪表与时间性选择:累计时间性固定

仪表表示时间点状态(如缓冲区深度、队列长度),仅最后一个记录值会导出,且始终使用累计时间性,不受 Delta 选择器影响。查询时使用 avg: 前缀查看时间点值。因此,在配置 TemporalitySelector 时,只需为计数器、直方图和可观察计数器指定 Delta,仪表保持累计即可。

Q&A

OpenTelemetry 的 Delta 时间性和 Cumulative 时间性有什么区别?

Cumulative 每次导出的是自进程启动以来的累计总量,对于单调计数器只增不减;Delta 每次导出的是自上次导出以来的变化量,每次推送后重置。

为什么把 OpenTelemetry 指标以 Delta 时间性发送到 Datadog 可以避免容器重启伪影?

因为 Delta 时间性下每个数据点都是自包含的增量,容器重启不会导致计数器从大值跌到零,Datadog 无需检测和丢弃负差值,从而避免虚假尖峰或下跌。

Datadog 内部是如何存储 OpenTelemetry 计数器数据的?

根据文章经验,Datadog 似乎无论收到哪种时间性,内部都按增量存储计数器数据。发送 Cumulative 时,Datadog 会在摄入时对连续累计点做差分来得到增量。

在 Datadog 中查询 Delta 时间性的计数器时,为什么建议用 max 聚合而不是默认的 avg?

因为容器轮换时,旧容器可能发出最后一个低值数据点,新容器正在爬升,默认 avg 聚合会把它们平均,导致表观速率减半。使用 max 聚合可以取每个时间桶内各容器的最高值,反映活跃容器的真实吞吐量。

在 Datadog 中查询直方图指标时,应该使用哪些聚合前缀?能否使用 .as_rate() 或 .as_count()?

应使用聚合前缀如 avg:、p50:、p95:、max: 来控制视图。不能对直方图使用 .as_rate() 或 .as_count(),因为它们是计数器专用的修饰符。

OpenTelemetry 的仪表(Gauge)指标应该使用哪种时间性?在 Datadog 中如何查询?

仪表始终使用 Cumulative 时间性,因为它们表示时间点状态而非累积量。在 Datadog 中直接用 avg:metric{*} 查询即可看到时间点值。

🏷️

标签

➡️

继续阅读