第 6 部分导论 · OpenTelemetry 与 Collector
OTel 最大的价值不是任何一个软件,而是「标准」——它让埋点和后端解耦。这一章讲清 OTel 的三层(标准/SDK/Collector)、Collector 存在的 N×M 理由,以及它和 Prometheus 是什么关系(不是竞品)。
第 6 部分导论 · OpenTelemetry 与 Collector
Prometheus 那条线讲完了。现在换主角:OpenTelemetry。
但开始前必须先破除一个极常见的混淆。
OTel 不是一个软件
“我们上了 OpenTelemetry”这句话,几乎总是含糊的——因为 OTel 是三层东西**,说的人往往指其中一层。**
| 层 | 是什么 | 形态 |
|---|---|---|
| ① 标准 | 三大支柱的数据模型 + 语义约定 + 传输协议(OTLP) | 纸面规范 |
| ② SDK | 各语言的埋点库(Java/Go/Python/...) | 你 import 的库 |
| ③ Collector | 独立进程,接收/加工/导出 | 一个二进制 |
本部分读的源码是 ③ Collector(opentelemetry-collector-v0.156.0),但你必须知道:OTel 最大的价值其实是 ①。
最大的价值:标准
OTel 真正解决的问题是:埋点和后端的耦合。
OTel 之前的世界:
你用 Jaeger → 代码里 import jaeger-client,按 Jaeger 的 API 埋点
想换 Zipkin? → 改所有埋点代码
想换某云厂商? → 再改一遍埋点是最贵的投资(它散布在你所有业务代码里、几百上千处),而它被锁死在一个后端上。换后端 = 重新埋点 = 没人愿意做 = 厂商锁定。
OTel 之后:
代码里 import OTel SDK,按标准埋点(一次)
想换后端? → 改一行配置(改 exporter)埋点这笔投资,和后端解耦了。 这是个巨大的转变——它把可观测性后端从“一辈子的婚姻”变成了“可以随时换的供应商”。
语义约定(semantic conventions)是标准里被低估的一半: 它规定了“HTTP 请求该用哪些属性名”(http.request.method 而不是 httpMethod/method/http_verb)。没有它,即使数据格式统一了,各家吐出的字段名还是五花八门,照样没法通用分析。 这和 Prometheus 的命名规范是同一类东西——约定比机制更难,但更有价值。
Collector 为什么存在:N×M → N+M
Collector 解决的是个朴素的工程问题:
没有 Collector:
N 个数据源 × M 个后端 = N×M 种对接
(每个应用都要知道所有后端的地址、认证、格式)
有 Collector:
N 个源 → Collector → M 个后端 = N+M但“减少对接”只是表面收益。Collector 真正的价值在于它是一个可以插手的地方:
- 加工数据 —— 脱敏(去掉手机号)、改标签、采样、丢弃无用数据。这些事在应用里做要改所有应用,在 Collector 里做改一处。
- 批量与重试 —— 应用只管把数据吐给本地 Collector(极快),由 Collector 负责批量、压缩、重试、缓冲。应用不用关心后端慢不慢。
- 解耦运维 —— 后端要换、要加一个、要做灰度?改 Collector 配置,应用零改动、零重启。
- 统一治理 —— 想给所有数据加个
env=prod标签?一处配置。
一句话:Collector 是可观测性数据的“网关”——和 API 网关的价值主张几乎一模一样(集中处理横切关注点)。
它和 Prometheus 是什么关系
这是最常见的问题:“有了 OTel,还要 Prometheus 吗?”
它们不是竞品,是链条上的不同段:
典型的现代架构是两者配合:OTel SDK 埋点 → Collector 加工 → remote write 到 Prometheus/Mimir 存储 → PromQL 查询 → Grafana 展示。
有意思的是它们互相“抄”了对方:
- Collector 有 prometheus receiver(它能像 Prometheus 一样去抓
/metrics)和 prometheusremotewrite exporter。 - Prometheus 3.x 支持原生接收 OTLP。
两个生态在互相靠拢——这对用户是好事:你不用二选一。指标的事实标准还是 Prometheus 的模型和 PromQL(第 0 部分说过),而 OTel 提供了统一的埋点和运输。
这一部分怎么安排
- Collector 架构 —— 五类组件、以及那个反直觉的事实:管道是个 DAG。
- pdata —— 三大支柱在内存里长什么样。
- 组件生命周期 ——
Component接口与工厂模式。 - consumer 与背压 —— 数据怎么在组件间传,以及
MutatesData这个精妙的契约。 - 配置 —— confmap 与部署形态。
- 自定义组件 —— 怎么扩展它。
小结与下一章
OTel 是三层:标准(数据模型 + 语义约定 + OTLP)、SDK(各语言埋点库)、Collector(独立进程)——“上了 OTel”这句话必须说清是哪层。最大的价值是标准:它把埋点(最贵的投资,散布在几百处业务代码里)和后端解耦,从“一辈子的婚姻”变成“可换的供应商”;语义约定是被低估的一半(统一字段名,否则格式统一了也没法通用分析)。Collector 把 N×M 变 N+M,但真正的价值是“它是一个可以插手的地方”——脱敏 / 改标签 / 采样 / 批量重试 / 换后端零改应用,本质是可观测性数据的网关。它和 Prometheus 不是竞品:OTel 管产生与运输、Prometheus 管存储与查询,典型架构是两者配合;而且两个生态在互相靠拢(Collector 有 prometheus receiver,Prometheus 3.x 原生收 OTLP)。
Collector 的内部长什么样?下一章打开它——你会发现管道并不是一条“线”。👉 Collector 架构。
参考资料
- [1] OpenTelemetry 官方文档:Specification、Semantic Conventions、OTLP。
- [2] OTel Collector 源码
docs/vision.md、README.md、distributions.yaml。 - [3] 关联三大支柱、三个主角、Prometheus 架构。