3. OpenTelemetry 标准:OTel 架构、数据模型、Collector 组件介绍

OpenTelemetry(简称 OTel)是 CNCF 的第二个毕业级可观测性项目,它统一了指标、日志、链路三大信号的采集、关联与导出标准。本章聚焦 OTel 的顶层架构、核心数据模型以及 Collector 组件的部署模式,为后续“标准模板驱动”的接入设计奠定基础。

3.1 OTel 整体架构

OTel 采用 Instrumentation → Collector → Backend 的三层架构。应用通过 SDK 或自动注入生成信号,Collector 负责接收、处理、转发,后端负责存储与可视化。

OTel 三层架构 应用 / 服务 OTel SDK / 自动注入 生成 Traces / Metrics / Logs OTel Collector Receiver → Processor → Exporter 批处理 / 采样 / 过滤 / 重试 可观测性后端 Prometheus / Jaeger / Loki Grafana / Datadog / 自研平台 传输协议:OTLP (gRPC / HTTP) | 支持 Pull / Push 两种模式 SDK 通过 OTLP 上报 Collector,Collector 通过 OTLP 或其他协议导出到后端 Traces(链路) Span / TraceId / SpanId Metrics(指标) Counter / Gauge / Histogram Logs(日志) LogRecord / Severity / Body 三大信号通过 Resource 属性(service.name、host.id 等)实现关联
关键设计原则:OTel 不绑定任何特定后端,Collector 作为中间层实现协议转换、数据富化与流量控制,使应用层与存储层解耦。

3.2 数据模型:三大信号的标准定义

OTel 为每种信号定义了独立但可关联的数据模型,所有模型均以 Protobuf 序列化,支持 gRPC 和 HTTP 传输。

信号类型 核心数据结构 关键字段 关联方式
Traces Span TraceId, SpanId, ParentSpanId, StartTime, EndTime, Attributes, Events TraceId 串联整条链路,SpanId 标识单个操作
Metrics Metric (DataPoint) Name, Description, Unit, AggregationTemporality, Attributes, Value 通过 Resource 和 InstrumentationScope 关联到服务
Logs LogRecord Timestamp, SeverityText, SeverityNumber, Body, Attributes, TraceId, SpanId 可嵌入 TraceId/SpanId 实现日志与链路关联
语义约定(Semantic Conventions):OTel 定义了标准化的属性键名(如 http.method、db.system),确保不同语言 SDK 生成的信号具有一致的字段结构,这是模板驱动接入的核心前提。

3.3 Collector 组件详解

OTel Collector 是一个可插拔的二进制组件,核心由 Receiver → Processor → Exporter 三个管道阶段组成。每个阶段均可通过配置文件声明式定义。

3.3.1 管道阶段与职责

阶段 职责 常用组件示例
Receiver 接收来自 SDK 或其他源的信号 otlp、jaeger、prometheus、filelog
Processor 数据加工:批处理、采样、过滤、重命名、属性修改 batch、memory_limiter、filter、attributes、tailsampling
Exporter 将处理后的数据发送到后端存储或分析平台 otlp、prometheus、loki、datadog、logging

3.3.2 部署模式

Collector 支持两种主流部署拓扑,根据规模与管控粒度选择:

  • Agent 模式(Sidecar / DaemonSet):每个节点或 Pod 部署一个 Collector 实例,负责本地信号采集与预处理,降低网络开销。
  • Gateway 模式(集中式):独立部署 Collector 集群,接收所有 Agent 转发来的数据,执行全局策略(如采样、路由、脱敏),再导出到后端。
Collector 部署模式:Agent + Gateway Agent 模式(每个节点一个) App A App B Collector batch / filter memory_limiter 本地采集 → 直接导出到后端 低延迟,适合边缘节点 Gateway 模式(集中式集群) Agent 1 Agent 2 Gateway Collector tailsampling / filter attributes / routing 全局策略管控 → 统一导出到后端 适合大规模集群,集中治理

3.3.3 配置文件示例

以下是一个典型的 Collector 配置,展示如何定义 Receiver、Processor、Exporter 并组装为管道:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

processors:
  batch:
    timeout: 1s
    send_batch_size: 1024
  memory_limiter:
    check_interval: 1s
    limit_mib: 512
  attributes:
    actions:
      - key: environment
        value: "production"
        action: upsert

exporters:
  otlp:
    endpoint: "backend.example.com:4317"
    tls:
      insecure: false
  logging:
    loglevel: debug

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch, attributes]
      exporters: [otlp, logging]
    metrics:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [otlp]
    logs:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [otlp]
生产注意事项:务必配置 memory_limiter 和 batch 处理器,防止 Collector 因流量突发导致 OOM;Gateway 模式下建议启用 tailsampling 处理器实现头部采样与尾部采样策略。

3.4 标准模板驱动的接入切入点

OTel 的标准化数据模型和可插拔 Collector 架构,为“标准模板驱动”提供了天然基础:

  • 数据模型统一:三大信号使用相同的 Protobuf 定义,模板只需关注属性映射规则,无需关心底层序列化差异。
  • Collector 配置可模板化:Receiver、Processor、Exporter 的声明式配置可以抽象为 YAML 模板,通过参数化注入环境变量、后端地址、采样率等变量。
  • 语义约定可复用:标准化的属性键名(如 http.status_code)使模板可以在不同服务间直接复用,只需替换 service.name 等资源属性。