3. OpenTelemetry Collector 架构:Receiver、Processor、Exporter、Pipeline 配置
OpenTelemetry Collector 是整个可观测性数据管道的核心引擎。在值班机器人故障诊断场景中,Collector 负责接收微服务、基础设施发出的遥测数据,对其进行过滤、增强、路由,最终发送到后端分析平台。理解 Collector 的四大组件——Receiver、Processor、Exporter 和 Pipeline——是构建可靠诊断链路的第一步。
3.1 整体架构概览
下图展示了单个 Collector 实例的内部数据流。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 数据(如重命名) | 统一服务名、操作名,便于关联分析 |
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 场景下的组件共享关系:
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)。
from_context 从请求上下文提取 x-incident-id,可以确保故障诊断全链路数据携带同一事件 ID,值班机器人据此聚合所有相关 Trace、Log、Metric,实现一键式故障根因分析。