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 |
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.set_attribute("event.type", "pagerduty"),日志中携带相同 Trace ID。
2.3 Collector 架构
OTel Collector 是一个与厂商无关的代理/网关,负责接收、处理、导出遥测数据。其架构分为三个核心组件:
- Receiver:接收数据(OTLP、Jaeger、Prometheus 等协议)。
- Processor:处理数据(过滤、采样、批处理、属性修改)。
- Exporter:导出数据(发送到后端存储或分析平台)。
Collector 支持两种部署模式:
| 模式 | 部署位置 | 适用场景 |
|---|---|---|
| Agent 模式 | 与业务进程同机部署 | 轻量采集,低延迟,适合值班机器人本地 |
| Gateway 模式 | 独立集群 | 集中处理、多租户、数据脱敏 |
下面展示 Collector 内部数据流水线:
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 处理后发送到不同后端:
service.version),然后分发到对应的后端系统。这种架构使得值班机器人的可观测性数据统一、可关联、可扩展。