4. OpenTelemetry 架构:Collector、Exporter、Processor、Pipeline 组件详解

OpenTelemetry(OTel)是 CNCF 孵化的可观测性标准,其架构核心围绕 数据采集、处理、导出 三个环节展开。在值班台分布式追踪场景中,理解 Collector、Exporter、Processor 和 Pipeline 的协作关系,是构建稳定、低延迟、高吞吐追踪基础设施的前提。

核心原则:OpenTelemetry 架构强调“供应商无关”与“管道化处理”。所有组件均可插拔,通过 Pipeline 串联,实现数据流的灵活编排。

4.1 整体架构与数据流

下图展示了 OpenTelemetry 在典型分布式追踪部署中的核心组件及其数据流转路径。SDK 负责在应用中生成 Span,通过 OTLP 协议发送至 Collector;Collector 内部通过 Pipeline 串联 Receiver、Processor、Exporter,最终将数据路由至后端存储或分析平台。

OpenTelemetry 核心架构与数据流 OpenTelemetry 核心架构与数据流 应用服务 A OTel SDK / Instrumentation 应用服务 B OTel SDK / Instrumentation OTLP OpenTelemetry Collector Receiver Pipeline Processor Exporter 后端存储 Jaeger / Tempo / Datadog 说明: SDK 通过 OTLP 将 Span 发送至 Collector;Collector 内部由 Pipeline 串联 Receiver → Processor → Exporter,完成数据接收、处理与导出。

4.2 核心组件详解

4.2.1 Collector(收集器)

Collector 是 OpenTelemetry 的网关组件,负责接收、处理和导出遥测数据。它支持两种部署模式:Agent(与应用同进程或同节点部署)和 Gateway(独立集群部署)。值班台场景通常采用 Gateway 模式,实现中心化策略管理与数据路由。

部署模式 典型场景 优势 注意事项
Agent 轻量级采集,与应用同主机 低延迟,减少网络开销 资源占用随应用数量线性增长
Gateway 中心化数据汇聚与策略下发 统一管理、弹性伸缩、数据过滤 需考虑单点故障与网络带宽

4.2.2 Exporter(导出器)

Exporter 负责将处理后的数据发送至指定的后端系统。OpenTelemetry 支持多种 Exporter,常见的有 OTLP gRPC/HTTP、Jaeger、Prometheus、Datadog 等。每个 Exporter 可独立配置认证、压缩、重试与超时策略。

最佳实践:在值班台部署中,建议至少配置两个 Exporter:一个用于主存储(如 Jaeger),另一个用于日志或告警系统(如 Loki + Alertmanager),实现数据冗余与故障隔离。

4.2.3 Processor(处理器)

Processor 是 Pipeline 中的数据处理单元,可对 Span 进行过滤、修改、聚合或采样。Processor 的执行顺序决定了数据变换的最终结果。常用 Processor 包括:

  • batch:将多个 Span 合并为一批,减少网络请求次数,提升吞吐量。
  • memory_limiter:防止 Collector 内存溢出,当内存达到阈值时主动丢弃数据。
  • filter:根据属性或资源标签过滤 Span,仅保留关键业务链路。
  • attributes:添加、删除或修改 Span 的标签(Attributes),用于统一命名规范。
  • span:对 Span 进行重命名、修改状态或添加自定义属性。
  • tail_sampling:基于尾部采样策略,保留高价值链路(如错误链路、慢链路)。

4.2.4 Pipeline(管道)

Pipeline 是 Collector 内部的数据处理流水线,由 Receiver → Processor(s) → Exporter(s) 组成。一个 Collector 实例可同时运行多个 Pipeline,每个 Pipeline 独立处理不同类型的数据(traces、metrics、logs)。Pipeline 的配置决定了数据流的拓扑结构。

Pipeline 内部处理流程 Pipeline 内部处理流程 Receiver batch memory_limiter filter Exporter 说明: Processor 按配置顺序执行,每个 Processor 可对 Span 进行变换或过滤。Exporter 将最终数据发送至后端。Pipeline 支持串联多个 Processor 实现复杂处理逻辑。

4.3 组件配置示例

以下是一个典型的 Collector 配置文件片段,展示了 Pipeline 如何串联 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
    spike_limit_mib: 128
  filter:
    traces:
      span:
        - 'attributes["http.method"] == "OPTIONS"'

exporters:
  otlp:
    endpoint: "jaeger-collector:4317"
    tls:
      insecure: true
  logging:
    loglevel: debug

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch, filter]
      exporters: [otlp, logging]
配置陷阱:Processor 的顺序至关重要。例如,memory_limiter 应放在 batch 之前,以防止批处理导致的内存积压。同时,filter 应尽早执行,避免无效数据进入后续处理环节。

4.4 组件选型与值班台场景适配

组件 值班台推荐配置 说明
Receiver OTLP gRPC + HTTP 兼容多种 SDK 与语言,gRPC 优先用于高性能场景
Processor memory_limiter → batch → tail_sampling 先限流防 OOM,再批量提升吞吐,最后采样保留关键链路
Exporter OTLP (Jaeger) + Logging (调试) 主数据流向 Jaeger,Logging 用于本地调试与告警
Pipeline 单 Pipeline 处理 traces 值班台初期建议单一 Pipeline,后续可按服务拆分多 Pipeline

4.5 常见问题与排查思路

  • 数据丢失:检查 memory_limiter 是否触发丢弃;确认 Exporter 网络连通性与认证配置。
  • 高延迟:调整 batch 的 timeout 与 send_batch_size;考虑增加 Collector 副本数。
  • 采样策略不生效:确认 tail_sampling 的 decision_wait 与 num_traces 参数是否匹配业务流量。
  • 配置错误:使用 otelcol --validate 命令校验配置文件语法。
值班台实战建议:在部署初期,先使用 logging Exporter 输出调试日志,确认数据格式与字段完整性,再切换至生产后端。同时,为 Collector 配置 Prometheus 指标暴露端口,监控其内存、CPU 与数据吞吐量。