3. OpenTelemetry Collector 架构:Receiver、Processor、Exporter、Pipeline 配置

OpenTelemetry Collector 是整个可观测性数据管道的核心引擎。在值班机器人故障诊断场景中,Collector 负责接收微服务、基础设施发出的遥测数据,对其进行过滤、增强、路由,最终发送到后端分析平台。理解 Collector 的四大组件——Receiver、Processor、Exporter 和 Pipeline——是构建可靠诊断链路的第一步。

核心要点: Collector 采用“管道+处理器”的插件化架构。每个 Pipeline 由一组 Receiver、一组 Processor 和一个 Exporter 串联而成,数据流单向、有序、可组合。

3.1 整体架构概览

下图展示了单个 Collector 实例的内部数据流。Receiver 作为入口,Processor 作为中间处理层,Exporter 作为出口;Pipeline 定义了这三者的连接关系。

OpenTelemetry Collector 内部架构 Receiver OTLP / Jaeger / Prometheus Receiver Kafka / Zipkin / Filelog Processor batch / filter / attributes Processor memory_limiter / transform Exporter OTLP / Prometheus / Loki Exporter Splunk / Elasticsearch Pipeline 定义:receivers: [otlp, kafka] → processors: [batch, filter] → exporters: [otlp, prometheus] 数据流方向 数据流方向 Receiver 负责数据接入,Processor 负责数据加工,Exporter 负责数据发送 Pipeline 将三者串联为一条完整的数据处理链路

3.2 四大组件详解

3.2.1 Receiver — 数据入口

Receiver 负责从各种数据源接收遥测数据。每个 Receiver 对应一种协议或数据源类型。Collector 支持同时启用多个 Receiver,实现多源数据汇聚。

Receiver 名称 数据源类型 典型端口/协议 故障诊断场景
otlp gRPC / HTTP 4317 (gRPC) / 4318 (HTTP) 微服务直接上报 Trace/Metric/Log
jaeger Jaeger Thrift / Proto 14250 / 14268 兼容遗留 Jaeger Agent 上报
prometheus Prometheus 拉取 — 抓取 Prometheus 指标端点
kafka Kafka 消息队列 9092 从 Kafka Topic 消费遥测数据
filelog 日志文件 — 采集容器 Stdout / 应用日志文件
实战建议: 在值班机器人场景中,建议至少启用 otlp 和 filelog 两个 Receiver。前者接收微服务主动上报的结构化数据,后者兜底采集容器日志,确保故障现场数据不遗漏。

3.2.2 Processor — 数据处理引擎

Processor 是 Collector 最灵活的组件,负责在数据发送前执行过滤、采样、增强、路由等操作。Processor 按配置顺序串联执行,形成处理链。

Processor 名称 功能 故障诊断价值
batch 将多条数据合并为一批发送 降低 Exporter 连接开销,提升吞吐
memory_limiter 限制 Collector 内存使用 防止 OOM,保障 Collector 稳定性
filter 按条件丢弃或保留数据 只保留故障相关 Trace/Log,减少噪音
attributes 添加/修改/删除属性 注入故障标签、环境标识、值班分组
transform 使用 OTTL 语言转换数据 复杂字段提取、格式标准化
span 处理 Span 数据(如重命名) 统一服务名、操作名,便于关联分析
避坑提醒: Processor 的执行顺序直接影响数据结果。例如,filter 应放在 batch 之前,避免先合批再过滤导致无效数据占用内存。建议按“过滤→增强→采样→合批”的顺序排列。

3.2.3 Exporter — 数据出口

Exporter 将处理后的数据发送到一个或多个后端系统。Collector 支持同时配置多个 Exporter,实现数据扇出(Fan-out)到不同平台。

Exporter 名称 目标系统 传输协议 故障诊断用途
otlp 另一个 Collector / 后端 gRPC / HTTP 数据转发到集中式 Collector 集群
prometheus Prometheus Server HTTP Push 指标数据持久化与告警
loki Grafana Loki HTTP 日志存储与检索
elasticsearch Elasticsearch HTTP Bulk 日志与 Trace 全文搜索
splunk_hec Splunk HTTP 企业级日志分析平台对接

3.2.4 Pipeline — 组件编排器

Pipeline 是 Collector 配置的核心,它定义了哪些 Receiver、Processor、Exporter 组合在一起,以及数据在它们之间的流动顺序。一个 Collector 可以定义多个 Pipeline,每个 Pipeline 处理一种数据类型(traces / metrics / logs)。

以下是一个典型的 Pipeline 配置示例,用于故障诊断场景:

receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
  filelog:
    include: [ /var/log/containers/*.log ]

processors:
  memory_limiter:
    check_interval: 1s
    limit_mib: 512
  filter:
    error_mode: ignore
    traces:
      span:
        - 'attributes["http.status_code"] >= 400'
  attributes:
    actions:
      - key: environment
        value: "production"
        action: upsert
      - key: incident_id
        from_context: x-incident-id
        action: upsert
  batch:
    timeout: 1s
    send_batch_size: 1024

exporters:
  otlp:
    endpoint: "collector-central:4317"
    tls:
      insecure: true
  loki:
    endpoint: "http://loki:3100/loki/api/v1/push"

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, filter, attributes, batch]
      exporters: [otlp]
    logs:
      receivers: [otlp, filelog]
      processors: [memory_limiter, attributes, batch]
      exporters: [loki]
配置要点解读:
• traces Pipeline:只接收 OTLP Trace,经过内存限制→过滤 4xx/5xx 状态码→注入环境标签和故障 ID→合批,最终转发到中央 Collector。
• logs Pipeline:同时接收 OTLP Log 和文件日志,注入标签后发送到 Loki,用于值班机器人日志检索。
• 两个 Pipeline 共享 memory_limiter 和 batch Processor,体现组件复用。

3.3 组件复用与数据路由

Collector 允许同一个 Receiver、Processor、Exporter 被多个 Pipeline 引用。这种复用机制减少了配置冗余,同时支持灵活的数据路由。下图展示了多 Pipeline 场景下的组件共享关系:

多 Pipeline 组件复用与数据路由 otlp Receiver filelog Receiver memory_limiter attributes batch traces Pipeline logs Pipeline otlp Exporter loki Exporter memory_limiter、attributes、batch 被 traces 和 logs 两个 Pipeline 共享 otlp Receiver 只接入 traces Pipeline;filelog Receiver 只接入 logs Pipeline

3.4 故障诊断场景下的 Pipeline 设计原则

  • 数据隔离原则: Trace、Metric、Log 分别使用独立 Pipeline,避免不同类型数据互相干扰。每个 Pipeline 可独立配置 Processor 和 Exporter。
  • 就近过滤原则: 在 Pipeline 入口处(Receiver 之后)立即执行 filter Processor,丢弃无关数据,减少后续处理压力。
  • 故障标签注入: 使用 attributes Processor 在 Pipeline 中注入 incident_id、severity、team 等标签,便于值班机器人关联分析。
  • 内存安全优先: 每个 Pipeline 的第一个 Processor 必须是 memory_limiter,防止突发流量导致 Collector OOM。
  • 扇出与扇入: 使用多个 Exporter 实现数据扇出(一份数据发送到多个后端);使用多个 Receiver 实现数据扇入(多个数据源汇聚到同一 Pipeline)。
值班机器人集成提示: 在 attributes Processor 中通过 from_context 从请求上下文提取 x-incident-id,可以确保故障诊断全链路数据携带同一事件 ID,值班机器人据此聚合所有相关 Trace、Log、Metric,实现一键式故障根因分析。