3. OpenTelemetry 管线概述
OpenTelemetry Collector 是 OTel 生态中的核心组件,负责接收、处理并导出遥测数据(Traces、Metrics、Logs)。理解 Collector 的架构与 Pipeline 组成,是构建可靠可观测性基础设施的第一步。本章将深入剖析 Collector 的内部结构、Pipeline 的三大核心组件以及数据流模型。
3.1 OTel Collector 架构
Collector 采用模块化、可插拔的架构设计,核心思想是通过 Pipeline 将数据采集与处理逻辑解耦。一个 Collector 实例可以运行多个 Pipeline,每个 Pipeline 独立处理一种或多种信号类型。
架构核心原则: 单一职责、可组合、无状态(推荐)。每个组件只做一件事,通过配置文件组合成完整的数据处理链路。
下图展示了 OTel Collector 的宏观架构,包含多个 Pipeline 及其与外部系统的交互关系:
3.2 Pipeline 组成:Receiver / Processor / Exporter
每个 Pipeline 由三个核心组件串联而成,形成一条完整的数据处理链路。三者职责清晰,通过配置文件声明式组合。
| 组件 | 职责 | 常见实现 | 可靠性关注点 |
|---|---|---|---|
| Receiver | 接收来自不同来源的遥测数据,将其转换为内部格式(pdata) | OTLP Receiver、Prometheus Receiver、Filelog Receiver、Kafka Receiver、Jaeger Receiver | 连接稳定性、背压处理、认证与授权 |
| Processor | 对数据进行过滤、转换、丰富、批处理、采样等操作 | batch、attributes、filter、transform、span、k8sattributes、memory_limiter | 内存泄漏、处理延迟、数据丢失、幂等性 |
| Exporter | 将处理后的数据发送到指定的后端系统或存储 | OTLP Exporter、Prometheus Exporter、Loki Exporter、Splunk HEC Exporter、Logging Exporter | 网络故障、重试策略、队列积压、数据完整性 |
最佳实践: 每个 Pipeline 至少包含一个
batch Processor 和一个 memory_limiter Processor。前者提升吞吐量,后者防止 OOM,是生产环境可靠性基线。
3.3 数据流模型
数据在 Pipeline 中的流动遵循严格的顺序模型:Receiver → Processor(s) → Exporter。Processor 可以串联多个,形成处理链。数据流模型的核心特征包括:
- 单向流动: 数据从 Receiver 进入,经过 Processor 链,最终由 Exporter 输出,不支持反向流动。
- 扇入与扇出: 多个 Receiver 可以输入到同一个 Pipeline;一个 Pipeline 可以配置多个 Exporter 实现数据复制。
- 背压传播: 当下游 Exporter 处理缓慢时,背压会向上游传播,最终影响 Receiver 的数据接收速率。
- 信号隔离: 不同信号类型(Traces、Metrics、Logs)建议使用独立的 Pipeline,避免相互干扰。
下图展示了单个 Pipeline 内部的数据流模型,以及背压传播路径:
3.4 Pipeline 配置示例
以下是一个生产级 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
attributes:
actions:
- key: environment
value: production
action: upsert
exporters:
otlp:
endpoint: "backend.example.com:4317"
tls:
insecure: false
retry_on_failure:
enabled: true
initial_interval: 5s
max_interval: 30s
max_elapsed_time: 300s
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch, attributes]
exporters: [otlp]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlp]
可靠性陷阱: Processor 的顺序至关重要。例如,
memory_limiter 应放在 Processor 链的最前面,以便在内存超限时尽早拒绝数据,避免后续 Processor 浪费计算资源。将 batch 放在 memory_limiter 之前可能导致批处理后的数据量突增,触发内存限制。
3.5 关键设计决策
在构建 OTel Collector Pipeline 时,以下设计决策直接影响可靠性:
| 决策项 | 推荐方案 | 不推荐方案 | 原因 |
|---|---|---|---|
| 信号隔离 | Traces / Metrics / Logs 使用独立 Pipeline | 所有信号混合在同一个 Pipeline | 避免信号类型相互干扰,便于独立扩缩容和故障隔离 |
| 内存管理 | 始终配置 memory_limiter Processor |
依赖系统 OOM Killer | 主动背压比被动杀死进程更可控,减少数据丢失 |
| 批处理策略 | 使用 batch Processor,设置合理的超时和批次大小 |
逐条发送数据 | 批处理显著提升吞吐量,降低后端压力 |
| 重试与队列 | Exporter 启用 retry_on_failure 和 sending_queue |
无重试、无队列 | 临时故障时保证数据不丢失,队列提供缓冲能力 |
可靠性基线检查清单:
- 每个 Pipeline 是否包含
memory_limiter? - 是否配置了
batchProcessor? - Exporter 是否启用了重试和队列?
- 不同信号类型是否使用独立 Pipeline?
- Processor 顺序是否合理(memory_limiter 在前)?