入门:OpenTelemetry 与可观测性三支柱
基于 OpenTelemetry 1.x(2026-05 CNCF 毕业) · 核于 2026-08
速查
- OpenTelemetry(OTel)定义:CNCF 主导的可观测性开放标准与工具包——统一 Metrics/Logs/Traces 三支柱的数据模型、API、SDK、传输协议(OTLP),让应用埋点一次,发任意后端,终结厂商锁定。它本身不是后端——不存储数据、不画图,只负责生产与传输遥测数据。
- 可观测性(Observability):从系统外部输出(遥测数据)推断内部状态的能力。三支柱:①Metrics 指标——时序数值(CPU/请求量/延迟),聚合后看趋势;②Logs 日志——离散事件的结构化文本,看具体发生了什么;③Traces 追踪——请求在分布式系统中的完整路径(span 树),看请求流经哪些服务、每段耗时。
- 三支柱统一的价值:以前 Metrics 用 Prometheus client、Logs 用 Logstash、Traces 用 Jaeger client——三套 SDK 三套协议,换后端要重埋点。OTel 用**一套 API/SDK/协议(OTLP)**统一三者,埋点一次,数据可发任意后端(Prometheus/Jaeger/Tempo/ELK/Datadog……)。
- OTLP(OpenTelemetry Protocol):OTel 定义的遥测数据传输协议,是三支柱统一的传输根基。定义了数据「长什么样」(Metrics/Logs/Traces 的统一数据模型)和「怎么传」(gRPC 或 HTTP)。后端只要支持 OTLP 接收,就能消费 OTel 数据——这是后端无关的关键。
- Instrumentation(埋点):让代码产生遥测数据的过程。两种:①自动埋点——零代码改动,加载 instrumentation library 自动接入主流框架(HTTP/gRPC/Express/Kafka/DB 驱动);②手动埋点——用 OTel API 在业务代码里自定义 span/metric/log(如「下单业务逻辑」的 span、业务计数器)。
- Collector(采集器):OTel 提供的数据代理——接收应用的遥测数据(receivers)→ 处理(processors,如采样、批处理、重标记)→ 导出(exporters)到一个或多个后端。解耦应用与后端:应用只发 OTLP 给 Collector,Collector 负责扇出到多后端、做采样/聚合。
- Resource(资源):描述遥测数据来源的属性(如 host.name、service.name、service.version、deployment.environment),附加在所有数据上,标识「这是哪个服务哪个版本产生的」。
- Context Propagation(上下文传播):追踪上下文(trace_id/span_id)跨服务跨进程传递——W3C Trace Context(
traceparentheader)是标准。A 调 B 时把 trace_id 传给 B,B 的 span 才能挂到 A 的 trace 树上,形成完整链路。 - 2026-05 CNCF 毕业:继 Kubernetes、Prometheus、Envoy 之后,OTel 成为 CNCF 最高成熟度项目。过去 12 个月下载量超 26 亿次,采用率约 76%~79%(Grafana 2025 调查),确立「可观测性事实标准」地位。
- 历史:OTel 由 OpenTracing(CNCF,追踪 API)和 OpenCensus(Google,追踪+指标)于 2019 年合并而来——结束两套标准的分裂,统一为 OpenTelemetry。
- 进阶顺序:三支柱与 OTLP 详解 → Collector 与生态采用 → 参考。
一、为什么需要 OpenTelemetry:可观测性的三支柱难题
分布式/微服务系统的可观测性比单体难得多——一个请求要经过多个服务,出了问题怎么定位?传统做法是堆工具:Metrics 用 Prometheus、Logs 用 ELK、Traces 用 Jaeger,每个后端有自己的 client SDK。这带来三个痛点:
- 标准碎片化:Metrics/Logs/Traces 三套 SDK、三套协议、三套数据模型。开发者要学三套,运维要部署三套。
- 厂商锁定:埋点代码绑死某个后端的 client(如 Datadog client),换后端要重埋一遍——迁移成本巨大。
- 上下文不统一:追踪的 trace_id 没法和 logs/metrics 关联——看 trace 时点不进对应日志,看 metric 异常时跳不到 trace。
OpenTelemetry 的解法:一套标准统一三支柱——统一的 API、统一的 SDK、统一的数据模型、统一的传输协议(OTLP)。应用只埋点一次,数据通过 OTLP 发给 Collector,Collector 再扇出到任意后端:
应用代码(OTel SDK 埋点)
│
│ OTLP(统一协议,三支柱一起传)
▼
Collector(接收 → 处理 → 导出)
│
├─→ Prometheus(Metrics 存储)
├─→ Jaeger / Tempo(Traces 存储)
├─→ Loki / ELK(Logs 存储)
└─→ Datadog / Honeycomb / New Relic(商业 SaaS)核心价值:埋点一次,后端随便换——这是「你拥有自己的数据」(You own your data)的体现。
二、三支柱:Metrics、Logs、Traces
| 支柱 | 数据形态 | 回答什么 | 典型场景 | OTel 成熟度 |
|---|---|---|---|---|
| Metrics(指标) | 时序数值(带时间戳的数字) | 系统整体表现如何?(趋势/聚合) | CPU 使用率、QPS、P99 延迟、错误率 | 稳定(GA) |
| Logs(日志) | 结构化事件记录 | 具体发生了什么?(离散事件) | 错误堆栈、用户行为、调试信息 | 趋于稳定(2024-2025 各语言陆续 GA) |
| Traces(追踪) | span 树(请求路径) | 请求流经了哪里?每段耗时? | 分布式调用链、性能瓶颈定位 | 稳定(GA) |
- Metrics:聚合数据,回答「好不好」(如错误率 5%、「P99 200ms」)。擅长告警与趋势,但不告诉「为什么」。
- Logs:详细事件,回答「发生了什么」(如「用户 123 下单失败,原因库存不足」)。信息量大但量也大,要检索。
- Traces:请求路径,回答「卡在哪」(如「请求在 DB 查询耗时 800ms」)。串联多个服务的完整链路。
- 三支柱联动:OTel 的精髓是三者共享 trace_id——从 metric 异常跳到对应 trace,从 trace 的 span 跳到对应 log,形成完整排障链路。
三、OTLP:统一传输协议
OTLP(OpenTelemetry Protocol)是 OTel 定义的遥测数据传输协议,是三支柱统一的根基:
- 统一数据模型:Metrics/Logs/Traces 有规范的 protobuf 数据结构(如 Span 有 trace_id/span_id/parent_span_id/name/start_time/end_time/attributes)。
- 传输方式:默认 gRPC(OTLP/gRPC),也支持 HTTP(OTLP/HTTP,POST protobuf 或 JSON)。后端只要实现 OTLP 接收端,就能消费 OTel 数据。
- 后端无关:应用只发 OTLP,不关心后端是 Prometheus 还是 Jaeger——Collector 负责转成各后端的格式(如 Prometheus 的 exposition format、Jaeger 的 thrift)。
四、埋点:自动 vs 手动
让代码产生遥测数据叫「埋点(Instrumentation)」,OTel 提供两种方式:
- 自动埋点(Automatic Instrumentation):加载 instrumentation library(如
@opentelemetry/instrumentation-express),自动拦截主流框架的调用,零代码改动产生 span/metric。适合快速接入、覆盖通用调用(HTTP/gRPC/DB/Kafka)。 - 手动埋点(Manual Instrumentation):用 OTel API 在业务代码里显式创建 span、记录 metric、写 log。适合埋业务语义(如「处理支付」span、「订单数」counter)——这些自动埋点覆盖不到。
// 手动埋点示例(Node.js)
const tracer = trace.getTracer('my-app');
const meter = metrics.getMeter('my-app');
const orderCounter = meter.createCounter('orders.total');
// 业务 span(自动埋点覆盖不到的业务逻辑)
const span = tracer.startSpan('process_payment');
try {
await processPayment(order);
span.setAttribute('payment.amount', order.amount);
orderCounter.add(1, { status: 'success' });
} catch (e) {
span.recordException(e);
span.setStatus({ code: 2 }); // ERROR
orderCounter.add(1, { status: 'failed' });
} finally {
span.end();
}五、Collector:数据代理
Collector 是 OTel 的数据中转站,解耦应用与后端:
- Receivers(接收):从应用收数据(OTLP 是主要的,也兼容 Jaeger/Prometheus/Zipkin 格式)。
- Processors(处理):批处理、采样、重标记、过滤、 обогащение(加 Resource 属性)。
- Exporters(导出):发到一个或多个后端(Prometheus/Jaeger/Tempo/Loki/Datadog……)。
应用只需配一个 OTLP 导出器指向 Collector,Collector 负责扇出——这样换后端只改 Collector 配置,应用不动。
六、CNCF 毕业与采用现状
OpenTelemetry 于 2026 年 5 月正式从 CNCF 毕业(Graduated)——继 Kubernetes(2018)、Prometheus(2018)、Envoy(2018)之后,成为 CNCF 最高成熟度的项目。
- 毕业意义:确认项目「广泛采用、治理成熟、社区活跃、生态完整」——正式确立「可观测性事实标准」。
- 采用数据:过去 12 个月下载量超 26 亿次;Grafana 2025 可观测性调查显示 79% 组织使用 OpenTelemetry(采用率约 76%~79%);71% 同时用 Prometheus + OTel。
- 历史脉络:2019 年 OpenTracing + OpenCensus 合并成立 OTel → 2021 年进入孵化 → 2026 年毕业。
下一步
理解了 OTel 的三支柱与基础后,下一步深入三支柱与 OTLP 详解(数据模型、OTLP 协议细节、埋点机制、Context 传播),以及Collector 与生态采用(Collector 架构、与 Prometheus/Jaeger 关系、毕业与采用)。