2. OpenTelemetry Collector 架构:Receiver、Processor、Exporter、Pipeline 的概念与数据流

在深入上下文传播之前,必须理解 OpenTelemetry Collector 的核心架构。Collector 是一个高度模块化的数据管道,由四个基本组件构成:Receiver、Processor、Exporter 和 Pipeline。这些组件协同工作,实现了从数据采集、处理到导出的完整生命周期。

2.1 核心组件与职责

下表总结了每个组件的核心职责与典型用途:

组件 职责 典型用途
Receiver 接收来自各种来源的遥测数据(Trace、Metric、Log) OTLP gRPC/HTTP、Jaeger、Prometheus、Kubernetes Events
Processor 对接收到的数据进行过滤、转换、增强、批处理等操作 属性修改、采样、批处理、内存限制、上下文传播注入
Exporter 将处理后的数据发送到后端存储或分析系统 OTLP、Prometheus Remote Write、Jaeger、Splunk、Datadog
Pipeline 定义数据流路径:Receiver → Processor(s) → Exporter 按信号类型(traces/metrics/logs)隔离管道,支持多管道并行

2.2 Pipeline 数据流与上下文传播

Pipeline 是 Collector 的数据流骨架。每个 Pipeline 绑定一个信号类型,并串联一组组件。数据在 Pipeline 中流动时,上下文(Context) 会随数据一起传递,这是实现上下文传播的基础。

关键概念: 在 Collector 内部,上下文不仅包含请求的 Trace/Span 信息,还包含与数据关联的元数据(如资源属性、服务名称、环境标签)。Processor 可以读取、修改或注入这些上下文信息,从而实现跨组件的传播。
Pipeline 数据流与上下文传播 Receiver OTLP / Jaeger / ... Processor 1 过滤 / 采样 Processor 2 上下文注入 Exporter OTLP / Prometheus 上下文(Context)随数据流传递 包含 TraceID、SpanID、资源属性、服务名称等元数据 Processor 可以读取、修改或注入上下文信息 实现跨组件的上下文传播

2.3 组件间的数据模型

Collector 内部使用统一的 pdata(Pipeline Data) 模型来表示遥测数据。pdata 是高度优化的 Protobuf 结构,支持 Traces、Metrics、Logs 三种信号类型。每个数据点都携带一个 Context 对象,用于存储传播所需的元数据。

实践提示: 在配置同步场景中,Processor 可以通过修改 Context 中的资源属性(如 service.name、deployment.environment)来标记数据来源,Exporter 再根据这些属性路由到不同的后端。

2.4 配置示例:一个完整的 Pipeline

以下是一个典型的 Collector 配置片段,展示了如何定义 Pipeline 并串联组件:

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
  attributes:
    actions:
      - key: environment
        value: "production"
        action: upsert

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

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch, attributes]
      exporters: [otlp]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp]

2.5 上下文传播在 Pipeline 中的关键作用

在自助目录的配置同步场景中,上下文传播扮演着以下关键角色:

  • 数据溯源: 通过 Context 携带的 source_service、config_version 等属性,可以追踪每条配置变更的来源。
  • 条件路由: Processor 根据 Context 中的环境标签(如 staging vs production)决定数据流向哪个 Exporter。
  • 关联分析: 将配置变更事件与对应的 Trace 关联,便于排查同步失败的原因。
上下文传播在配置同步中的应用 配置变更事件 service.yaml v3 Processor: 注入上下文 source=git, env=prod Processor: 条件路由 env=prod → exporter A Exporter A Exporter B Context 携带的元数据驱动路由决策 例如:env=production → Exporter A(生产后端),env=staging → Exporter B(测试后端) 通过上下文传播,配置同步系统可以实现精细化的数据路由和溯源 每个 Processor 都可以读取或修改 Context,形成灵活的管道逻辑

2.6 最佳实践与注意事项

注意: 上下文传播虽然强大,但过度使用会导致数据膨胀。建议只传播必要的元数据,避免将整个请求体或大型对象放入 Context。在 Processor 中及时清理不再需要的上下文键,以保持管道性能。
  • 最小化上下文大小: 只保留路由和溯源所需的关键属性,如 service.name、environment、config_version。
  • 使用批处理 Processor: 在导出前使用 batch Processor 合并数据,减少网络开销。
  • 监控管道健康: 通过 Collector 内置的 prometheus Exporter 暴露管道指标,如 otelcol_receiver_accepted_spans、otelcol_exporter_sent_spans。
  • 测试上下文传播: 在开发环境中使用 logging Exporter 验证上下文是否正确传递。