2. OpenTelemetry 概述:项目背景、核心组件与数据模型

OpenTelemetry(简称 OTel)是 CNCF 的毕业级可观测性标准,旨在统一指标、链路与日志三大信号的采集、处理与导出。本章从项目起源、核心组件到数据模型,建立对 OTel 的全局认知。

2.1 项目背景与演进

在 OTel 出现之前,可观测性领域存在两大痛点:

  • 厂商锁定:每个 APM 厂商(Datadog、New Relic、Jaeger、Prometheus)都有自己的 SDK 和协议,切换成本极高。
  • 信号割裂:链路追踪用 OpenTracing,指标用 OpenMetrics,日志用标准库,三者无法关联。

OTel 合并了 OpenTracing 与 OpenCensus 两大项目,于 2019 年正式进入 CNCF 孵化,2023 年成为毕业项目。其核心承诺是:一次埋点,任意后端。

关键里程碑:OTel 目前是 CNCF 中仅次于 Kubernetes 的第二活跃项目,已被 AWS、Azure、Google Cloud、Datadog、Grafana 等主流厂商原生支持。

2.2 核心组件架构

OTel 由三大核心组件构成,形成“采集 → 处理 → 导出”的管道:

OpenTelemetry 核心组件架构图 OTel 核心组件架构 Instrumentation 自动/手动埋点 SDK 信号生成与上下文传播 Collector 接收/处理/导出 自动 Instrumentation Java Agent / Python 钩子 零代码接入 HTTP、gRPC、DB 手动 Instrumentation API 创建 Span / 添加属性 自定义业务逻辑埋点 SDK 核心能力 SpanProcessor Sampler(采样决策) Exporter(导出协议) Context Propagation Baggage 传递 资源属性注入 Collector 管道 Receivers(OTLP/HTTP/gRPC) Processors(过滤/采样/批处理) Exporters(OTLP/Prometheus/ Jaeger/CloudWatch) Extensions(健康检查/pprof) Connectors(管道间桥接)

2.3 组件职责详解

组件 职责 部署形态 典型场景
Instrumentation 在应用中插入埋点代码,自动或手动生成 Span/Metric/Log 库/Agent/代码注入 Java Agent 自动拦截 Servlet 请求
SDK 提供 API 实现、采样、上下文传播、导出 应用内依赖 配置基于概率的头采样
Collector 接收多源信号,执行处理管道,导出到后端 独立进程/sidecar 边缘节点做 tail-based 采样
最佳实践:生产环境推荐 SDK 直连 Collector,由 Collector 统一做采样、过滤和重试,避免应用直接暴露后端地址。

2.4 数据模型:三大信号

OTel 定义了三种核心信号类型,每种都有独立但可关联的数据模型:

2.4.1 Traces(链路)

  • Span:最小工作单元,包含名称、开始/结束时间、属性、事件、状态。
  • Trace:由多个 Span 组成的树形结构,通过 TraceId 关联。
  • SpanContext:包含 TraceId、SpanId、TraceFlags、TraceState,用于跨进程传播。

2.4.2 Metrics(指标)

  • Counter:单调递增计数器(如请求总数)。
  • Histogram:分布统计(如延迟分位数)。
  • Gauge:可增可减的瞬时值(如内存使用率)。
  • UpDownCounter:可增可减的计数器(如活跃连接数)。

2.4.3 Logs(日志)

  • OTel 不重新定义日志格式,而是定义 LogRecord 结构,支持将已有日志(如 JSON 格式)桥接到 OTel 管道。
  • 日志可通过 TraceId / SpanId 字段与链路关联。

2.5 数据模型关联:信号关联机制

三大信号通过以下字段实现关联:

OTel 三大信号关联机制 三大信号关联机制 Traces TraceId / SpanId Span 属性 + 事件 Metrics Attributes 标签 Exemplar 关联 Span Logs TraceId / SpanId 字段 SeverityText / Body 关联核心:Resource + Attributes 所有信号共享 Resource(服务名、版本、环境) 通过 TraceId 实现链路→日志关联,通过 Exemplar 实现指标→链路关联

2.6 OTLP 协议

OTel 原生使用 OTLP(OpenTelemetry Protocol) 进行信号传输,支持 gRPC 和 HTTP/JSON 两种传输方式:

特性 gRPC HTTP/JSON
性能 高(Protobuf 编码) 中(JSON 编码)
流式支持 原生双向流 需轮询或长连接
调试友好 低(二进制) 高(可读)
推荐场景 生产环境 Collector 间通信 开发调试 / 浏览器端
注意:OTLP 是 OTel 的推荐协议,但 Collector 也支持接收 Jaeger、Zipkin、Prometheus 等非 OTLP 格式,实现向后兼容。

2.7 本章小结

OTel 通过 Instrumentation → SDK → Collector 的三层架构,实现了可观测性信号的标准化采集与处理。其数据模型以 Trace、Metric、Log 三大信号为核心,通过 Resource 和 TraceId 实现跨信号关联。理解这些基础概念,是后续学习采样策略和 Runbook 门禁的前提。