OpenTelemetry Rust 中 ObservableGauge 指标数据点泄漏问题分析
2025-07-04 12:30:45作者:吴年前Myrtle
问题背景
在 OpenTelemetry Rust 实现中,从 0.24 版本升级到 0.26 版本后,ObservableGauge 及其他异步指标工具出现了一个重要的行为变更。这个变更导致了一个不符合 OpenTelemetry 规范的数据点泄漏问题。
问题现象
在 0.26 版本中,一旦为特定属性组合记录了一个读数,该读数就会在后续的所有收集操作中被持续发送。这意味着:
- 任何曾经出现过的属性组合都会被永久保留
- 无法移除不再存在于当前数据中的旧属性
- 指标数据会随着时间推移不断累积增长
规范要求
根据 OpenTelemetry 规范,对于使用 Delta 或 Cumulative 聚合时间性的异步仪器,MetricReader.Collect 方法应该只接收自上次收集以来记录的测量数据点。这意味着:
- 对于 Delta 时间性:每次收集后应该重置状态
- 对于 Cumulative 时间性:虽然保留历史数据,但对于 Observable 仪器仍应遵循"仅报告当前周期数据"的原则
技术分析
问题的根源在于指标聚合的实现方式。当前实现使用 HashMap 来跟踪所有键值属性组合:
- Cumulative 时间性:HashMap 被读取但不被清空,导致所有曾经出现过的键值属性组合会被永久保留和报告
- Delta 时间性:HashMap 会被清空,只有当前周期报告的键值属性组合会被导出
对于 ObservableCounter 和 ObservableGauge 这类异步仪器,规范明确要求无论使用哪种时间性,都应该只导出当前周期报告的键值属性组合。
影响范围
这个问题主要影响以下场景:
- 使用 Prometheus 导出器(默认强制使用 Cumulative 时间性)
- 动态变化的属性值场景(如用户ID、会话ID等)
- 长时间运行的服务,会导致内存和网络流量持续增长
解决方案
正确的实现应该:
- 对于 Observable 仪器,即使使用 Cumulative 时间性,也应该在收集周期之间进行适当的清理
- 保持 Delta 时间性的现有行为(清空 HashMap)
- 修改 Cumulative 时间性的处理逻辑,使其符合 Observable 仪器的特殊要求
最佳实践建议
在问题修复前,用户可以:
- 考虑切换到 Delta 时间性(注意其与 Cumulative 的不同特性)
- 定期重启服务来清理累积的指标数据
- 避免在高基数维度上使用 Observable 仪器
总结
这个问题的本质是指标聚合逻辑没有正确处理 Observable 仪器的生命周期要求。正确的实现应该区分普通仪器和 Observable 仪器在 Cumulative 时间性下的不同行为,确保符合 OpenTelemetry 规范的语义。对于开发者而言,理解指标时间性的差异和仪器类型的影响,对于构建可靠的观测系统至关重要。
登录后查看全文
热门项目推荐
相关项目推荐
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0214
cann-learning-hubCANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。Jupyter Notebook0138
uni-appA cross-platform framework using Vue.jsJavaScript08
GLM-5.2智谱开源 GLM-5.2,这是针对长文本任务的最新旗舰模型。相较于前代产品 GLM-5.1,它在长文本任务处理能力上实现了显著飞跃,并且首次在稳定的 100 万 token 上下文中提供这一能力。Jinja00
SwanLab⚡️SwanLab - an open-source, modern-design AI training tracking and visualization tool. Supports Cloud / Self-hosted use. Integrated with PyTorch / Transformers / LLaMA Factory / veRL/ Swift / Ultralytics / MMEngine / Keras etc.Python00
tiny-universe《大模型白盒子构建指南》:一个全手搓的Tiny-UniverseJupyter Notebook03
项目优选
收起
deepin linux kernel
C
32
16
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
469
465
暂无描述
Dockerfile
778
5.08 K
Ascend Extension for PyTorch
Python
757
968
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
876
2.03 K
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
697
1.4 K
昇腾LLM分布式训练框架
Python
185
231
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
2.25 K
676
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.1 K
1.14 K
本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于本仓库源码构建支持 OpenHarmony 的 Flutter Engine。
Dart
1.04 K
271