2. OpenTelemetry Collector 架构:核心组件与数据流模型

在构建多租户数据管道之前,必须深入理解 OpenTelemetry Collector 的内部架构。Collector 采用高度模块化的设计,其核心由 Receiver、Processor、Exporter 三大组件以及 Pipeline 概念构成。本章将逐一剖析这些组件,并揭示数据在 Collector 内部的流转模型。

2.1 核心组件:Receiver、Processor、Exporter

Collector 的组件设计遵循单一职责原则,每个组件只负责数据生命周期中的一个特定阶段。下表总结了三大组件的核心职责与典型实现:

组件 职责 典型实现(举例) 多租户关注点
Receiver 接收来自不同数据源的遥测数据(traces、metrics、logs) otlp、jaeger、prometheus、kafka 租户身份识别(通过 headers 或资源属性)
Processor 对数据进行过滤、转换、丰富、采样、批处理等 batch、filter、attributes、transform、tailsampling 租户级数据隔离、标签注入、采样策略
Exporter 将处理后的数据发送到后端存储或分析系统 otlp、prometheus、jaeger、elasticsearch、splunk 租户级路由、目标后端隔离、认证凭据管理
架构要点: 在 OpenTelemetry 生态中,otlp 既是 Receiver 也是 Exporter,这使得 Collector 可以级联部署,形成多层数据管道。在多租户场景中,这一特性常用于在边缘 Collector 完成租户识别,在中心 Collector 完成聚合与路由。

2.2 Pipeline 概念:数据管道的编排单元

Pipeline 是 OpenTelemetry Collector 中最重要的编排概念。一个 Pipeline 定义了从数据接收到导出的完整路径,它由三部分组成:

  • Receivers:一个或多个数据接收器,作为管道的入口。
  • Processors:零个或多个处理器,按声明顺序串联执行。
  • Exporters:一个或多个数据导出器,作为管道的出口。

Pipeline 在 Collector 配置文件中通过 service.pipelines 节定义,支持按信号类型(traces、metrics、logs)分别声明。以下是一个典型的 Pipeline 配置片段:

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch, attributes]
      exporters: [otlp]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [prometheus]
关键设计原则: 每个 Pipeline 内部的数据流是单向且线性的。数据从 Receiver 进入,依次经过每个 Processor,最终到达 Exporter。Processor 的执行顺序严格遵循配置中的声明顺序,这一特性对多租户数据隔离策略的设计至关重要。

2.3 数据流模型:从接收到导出的完整路径

理解数据在 Collector 内部的流动模型,是设计多租户隔离方案的基础。下图展示了单个 Pipeline 内部的数据流:

OpenTelemetry Collector 单 Pipeline 数据流模型 Receiver OTLP / Jaeger / ... Processor 1 batch / filter Processor 2 attributes / transform Processor N tailsampling / ... Exporter OTLP / Prometheus 数据流特征: • 单向线性流动,无回环 • Processor 按声明顺序执行 • 每个 Pipeline 独立处理一种信号类型

上图清晰地展示了数据在 Pipeline 中的单向流动特性。数据从左侧的 Receiver 进入,经过中间串联的多个 Processor 依次处理,最终到达右侧的 Exporter 被发送到后端。这种线性模型保证了处理逻辑的可预测性。

2.4 多 Pipeline 与信号类型隔离

OpenTelemetry Collector 支持同时运行多个 Pipeline,每个 Pipeline 可以处理不同的信号类型(traces、metrics、logs)。这种设计天然支持了按信号类型进行的数据隔离。下图展示了多 Pipeline 架构:

多 Pipeline 架构:按信号类型隔离 Traces Pipeline otlp receiver batch attributes otlp exporter Metrics Pipeline prometheus batch filter prometheus Logs Pipeline filelog batch transform elasticsearch
多租户设计启示: 虽然 Collector 原生支持按信号类型隔离 Pipeline,但这并不等同于租户隔离。在多租户场景中,通常需要在单个 Pipeline 内部通过 Processor 实现租户感知逻辑,或者为每个租户部署独立的 Collector 实例。后文将详细讨论这两种策略的权衡。

2.5 组件生命周期与并发模型

理解 Collector 组件的生命周期有助于诊断多租户场景下的资源竞争问题:

  • 启动阶段:Collector 按配置顺序初始化所有组件,Receiver 开始监听端口,Exporter 建立与后端的连接。
  • 运行阶段:每个 Pipeline 独立运行,数据在组件间通过 Go channel 传递,实现高效的并发处理。
  • 关闭阶段:Collector 按逆序关闭组件,先停止 Receiver 接收新数据,等待 Processor 处理完缓冲区数据,最后关闭 Exporter 连接。
性能考量: Collector 的并发模型基于 goroutine 和 channel,每个 Pipeline 内部的数据处理是串行的,但不同 Pipeline 之间完全并行。在多租户场景中,如果某个租户的数据量激增,可能会影响同一 Pipeline 中其他租户的数据处理延迟。解决方案包括:为高负载租户分配独立 Pipeline,或使用 Processor 实现租户级速率限制。