2. OpenTelemetry 基础:项目背景、核心概念(Trace、Span、Metric、Log)
2.1 OpenTelemetry 项目背景
OpenTelemetry(简称 OTel)是 CNCF(Cloud Native Computing Foundation)旗下的可观测性框架,由 OpenTracing 和 OpenCensus 两个项目合并而来。其目标是提供一套统一、厂商中立的 API、SDK 和工具,用于生成、采集和导出遥测数据(Traces、Metrics、Logs)。
为什么需要 OpenTelemetry? 在微服务架构中,一个请求会穿越多个服务、中间件和基础设施。传统监控工具各自为政,导致 Trace、Metric、Log 数据割裂,难以关联分析。OTel 通过统一的数据模型和采集管道,解决了“三张皮”问题。
| 时间线 | 事件 | 说明 |
|---|---|---|
| 2019 | OpenTracing + OpenCensus 合并 | 两大社区决定合并,避免标准分裂 |
| 2021 | OTel 成为 CNCF 毕业项目 | 达到生产就绪成熟度,被主流云厂商采纳 |
| 2023+ | Logs Bridge API 稳定 | 三大信号(Trace、Metric、Log)全部进入稳定阶段 |
2.2 核心概念:Trace 与 Span
Trace(追踪) 代表一个端到端请求在分布式系统中的完整路径。它由多个 Span(跨度) 组成,每个 Span 代表一次具名、定时的操作单元(如 HTTP 请求、数据库查询、消息队列发送)。
- Trace ID:全局唯一标识,贯穿整个请求生命周期。
- Span ID:每个 Span 的唯一标识。
- Parent Span ID:指向父 Span,形成树状层级关系。
- Span Context:携带 Trace ID、Span ID 等元数据,通过 W3C Trace Context 协议在服务间传播。
关键理解: Trace 是“森林”,Span 是“树”。一个 Trace 由一棵 Span 树构成,根 Span 代表入口请求,子 Span 代表内部调用。
2.3 核心概念:Metric(指标)
Metric 是聚合后的数值型数据,用于描述系统在时间维度上的状态变化。OTel 定义了三种基本 Metric 类型:
| Metric 类型 | 说明 | 典型场景 |
|---|---|---|
| Counter | 单调递增计数器,只增不减 | 请求总数、错误总数 |
| Histogram | 对观测值进行分桶统计 | 请求延迟分布、响应大小分布 |
| Gauge | 可增可减的瞬时值 | CPU 使用率、内存使用量、队列长度 |
注意: Metric 是聚合数据,不保留单个请求的细节。如果需要排查具体请求的异常,必须结合 Trace 和 Log 进行下钻分析。
2.4 核心概念:Log(日志)
Log 是带有时间戳的文本记录,描述系统中发生的离散事件。OTel 通过 Logs Bridge API 将日志与 Trace 关联起来,核心字段包括:
- Timestamp:事件发生时间。
- Severity:日志级别(TRACE、DEBUG、INFO、WARN、ERROR、FATAL)。
- Body:日志正文内容。
- Trace ID / Span ID:关联到对应的 Trace 和 Span,实现“日志链路化”。
- Attributes:键值对形式的上下文信息(如 service.name、http.method)。
2.5 三大信号的关系
Trace、Metric、Log 三者并非孤立,而是互补关系。OTel 通过 Context Propagation 和 Resource Attributes 将它们关联起来:
2.6 数据模型与采集架构
OTel 的数据采集遵循 Agent → Collector → Backend 的三层架构:
- Instrumentation(插桩):通过 SDK 或自动插桩库在应用中生成 Trace、Metric、Log。
- OTel Collector:接收、处理、导出遥测数据。支持批处理、采样、过滤、重试等能力。
- Backend(后端):存储和可视化平台,如 Jaeger、Prometheus、Grafana、Datadog 等。
课程关联: 在后续章节中,我们将为值班机器人接入 OTel SDK,通过 Collector 将链路数据发送到 Jaeger 和 Prometheus,实现“告警触发 → 自动拉取 Trace → 定位故障根因”的闭环。
2.7 本章小结
| 概念 | 一句话总结 | 在值班机器人中的用途 |
|---|---|---|
| Trace | 请求的完整调用链 | 告警时自动拉取关联 Trace,定位故障服务 |
| Span | 调用链中的单个操作单元 | 分析每个服务的耗时和错误状态 |
| Metric | 聚合后的数值指标 | 触发告警的阈值依据(如 P99 延迟 > 500ms) |
| Log | 带时间戳的事件记录 | 补充 Trace 无法覆盖的异常详情 |