OpenTelemetry 基础:项目背景、三大信号与 Collector 架构

OpenTelemetry(简称 OTel)是 CNCF 旗下的可观测性标准框架,由 OpenTracing 与 OpenCensus 合并而来,旨在为分布式系统提供统一的遥测数据采集、处理与导出规范。本章围绕 OTel 的诞生动机、三大信号(Traces / Metrics / Logs)以及 Collector 核心架构展开,为后续值班机器人链路追踪与事件触发调优奠定基础。

2.1 项目背景与设计目标

在 OTel 出现之前,可观测性领域存在多个互不兼容的 SDK 和协议(Jaeger、Zipkin、Prometheus、StatsD 等),导致以下痛点:

  • 厂商锁定:切换后端(如从 Jaeger 换到 Datadog)需要重写埋点代码。
  • 信号割裂:Trace、Metric、Log 使用不同 SDK,关联困难。
  • 运维复杂:Agent 和 Exporter 版本碎片化严重。

OTel 的核心设计目标:

目标 说明
统一 API / SDK 一套接口覆盖 Trace、Metric、Log,语言无关
厂商中立 通过 OTLP 协议 + Exporter 机制,后端可插拔
自动埋点 提供 Instrumentation 库,零侵入接入主流框架
上下文传播 W3C TraceContext 标准,跨服务传递 Trace ID
值班机器人场景映射:值班机器人需要同时追踪告警触发链路、采集事件处理延迟指标、记录异常日志。OTel 的三信号统一模型恰好满足这一需求,避免维护三套独立采集管道。

2.2 三大信号:Traces / Metrics / Logs

OTel 将可观测性数据抽象为三种信号,它们既独立又可通过 属性(Attributes) 和 资源(Resource) 关联。

2.2.1 Traces(链路追踪)

Trace 记录请求在分布式系统中的完整路径,由 Span 组成。每个 Span 包含名称、开始/结束时间、状态、属性及父子关系。

  • Span 上下文:Trace ID + Span ID,通过 W3C TraceContext 传播。
  • 典型场景:值班机器人收到告警 → 查询 CMDB → 触发 Webhook → 记录处理结果。

2.2.2 Metrics(指标)

Metrics 是聚合后的数值型数据,用于监控系统健康度与性能趋势。OTel 支持三种基本 Instrument:

  • Counter:累计值,如“事件处理总数”。
  • Histogram:分布统计,如“告警处理延迟 P99”。
  • Gauge:瞬时值,如“当前队列深度”。

2.2.3 Logs(日志)

Logs 是带时间戳的结构化文本记录。OTel 将 Log 视为 LogRecord,支持与 Trace 关联(通过 Trace ID / Span ID 字段)。

信号 数据模型 典型用途 关联方式
Traces Span(树状结构) 请求路径、延迟分解 Trace ID / Span ID
Metrics DataPoint(时间序列) 聚合统计、告警阈值 Resource + Attributes
Logs LogRecord(结构化) 错误详情、审计 Trace ID / Span ID 字段
最佳实践:在值班机器人的关键处理节点(如告警去重、通知发送)同时创建 Span、记录 Log 并更新 Counter,实现三信号联动。例如在 Span 结束时设置 span.set_attribute("event.type", "pagerduty"),日志中携带相同 Trace ID。

2.3 Collector 架构

OTel Collector 是一个与厂商无关的代理/网关,负责接收、处理、导出遥测数据。其架构分为三个核心组件:

  • Receiver:接收数据(OTLP、Jaeger、Prometheus 等协议)。
  • Processor:处理数据(过滤、采样、批处理、属性修改)。
  • Exporter:导出数据(发送到后端存储或分析平台)。

Collector 支持两种部署模式:

模式 部署位置 适用场景
Agent 模式 与业务进程同机部署 轻量采集,低延迟,适合值班机器人本地
Gateway 模式 独立集群 集中处理、多租户、数据脱敏

下面展示 Collector 内部数据流水线:

OTel Collector 内部流水线 Receiver OTLP Receiver Jaeger Receiver Prometheus Receiver Filelog Receiver (支持多种协议) Processor Batch Processor Sampling Processor Attributes Processor Filter Processor (可串联多个) Exporter OTLP Exporter Prometheus Exporter Loki Exporter Splunk Exporter (可配置多个) Pipeline 配置:receivers → processors → exporters,数据按顺序流经每个阶段

2.4 Collector 配置示例

以下是一个适用于值班机器人的 Collector 配置片段,接收 OTLP 数据,进行采样和批处理,然后导出到本地控制台和远程后端:

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
  probabilistic_sampler:
    sampling_percentage: 50

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

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch, probabilistic_sampler]
      exporters: [otlp, logging]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp, logging]
    logs:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp, logging]
注意:生产环境中建议关闭 logging Exporter 的 debug 级别,避免日志爆炸。对于值班机器人的高吞吐场景,合理设置 batch.timeout 和 send_batch_size 可显著降低后端写入压力。

2.5 三大信号与 Collector 的协同关系

下图展示值班机器人如何通过 OTel SDK 产生三信号,经 Collector 处理后发送到不同后端:

值班机器人三信号采集与流转 值班机器人 OTel SDK Traces: 告警处理链路 Metrics: 延迟/计数 Logs: 异常/审计 Collector Receiver: OTLP Processor: Batch Processor: Filter Exporter: 多后端 后端存储 Jaeger (Traces) Prometheus (Metrics) Loki (Logs) (通过 Exporter 解耦)
值班机器人集成要点:通过 OTel SDK 在 Python/Go 代码中创建 Span、记录 Metric 和 Log,所有数据通过 OTLP 协议发送到本地 Collector。Collector 负责采样(减少存储成本)、添加环境标签(如 service.version),然后分发到对应的后端系统。这种架构使得值班机器人的可观测性数据统一、可关联、可扩展。