监控体系(Observability / Reliability Platform)
目标:看到异常” → “定位问题” → “持续可靠性治理
P0(可观测基础)
├── Metrics(Prometheus)
├── Logging(ELK / Loki)
├── Tracing(Jaeger / Zipkin)
├── Error Tracking(Sentry)
P1(定位与响应)
├── 秒级大盘(Grafana)
├── 告警平台
├── 事件中心(Incident)
P2(可靠性治理)
├── SLA / SLO 评估平台
├── StatusPage
├── 变更 / 发布关联分析
P3(智能化)
├── RCA 根因分析系统
├── 拓扑感知 / 依赖图
├── 智能异常检测(AIOps)
看见信号 → 定位问题 → 控制影响 → 复盘改进 → 可靠性提升
Tracing(Jaeger / Zipkin)
下面我把 Tracing(分布式链路追踪) 从工程本质、数据模型、采集机制、存储分析、平台能力、治理与稳定性工程几个层面系统性拆解。 目标不是“选 Jaeger 还是 Zipkin”,而是搞清楚 Tracing 在现代系统中到底解决什么、怎么规模化、怎么长期可用。
一、Tracing 的真实定位(先定性)
一句话定义:
Tracing 是用“一次请求的因果链”,解释 Metrics 无法解释的问题。
对比三大信号:
| 信号 | 回答的问题 |
|---|---|
| Metrics | 系统“有没有问题” |
| Traces | 问题“发生在哪里、怎么传递” |
| Logs | 问题“最终细节证据” |
👉 Tracing 是 Metrics → Logs 之间的桥梁。
二、Tracing 解决的“工程级问题”
Tracing 不是为了“好看”,而是解决以下问题:
- 跨服务性能瓶颈
- 级联故障(雪崩)
- 慢请求定位
- 上下游责任界定
- 变更影响分析
这些问题,单靠日志或指标都很难系统解决。
三、Tracing 的数据模型(核心中的核心)
1️⃣ Trace / Span / Context
Trace
- 一次完整请求
- 全局唯一 TraceID
Span
- Trace 中的一个操作
- 有开始 / 结束时间
- 可嵌套
Context
- TraceID / SpanID
- 通过 RPC / MQ 传播
Trace
├── Span A(入口)
│ ├── Span B(DB)
│ └── Span C(RPC)
│ └── Span D(下游)
2️⃣ Span 的标准字段(通用模型)
| 字段 | 说明 |
|---|---|
| trace_id | 全局 |
| span_id | 当前 |
| parent_id | 父节点 |
| service | 服务名 |
| name | 操作名 |
| duration | 耗时 |
| status | OK / ERROR |
| attributes | KV |
Span 的属性设计,决定 Tracing 是否“有业务价值”。
四、采集方式(远不止 SDK 打点)
1️⃣ SDK / Agent(最常见)
- OpenTelemetry SDK
- SkyWalking Agent
- Pinpoint Agent
优点:
- 语义完整
- 可定制
缺点:
- 侵入性
- 版本维护成本
2️⃣ 自动化采集(趋势)
Service Mesh / Proxy
- Envoy
- Istio
能力:
- 自动生成 RPC Span
- 无需改业务代码
限制:
- 业务语义弱
- DB / 内部逻辑不可见
3️⃣ 混合模式(企业主流)
自动采集 + 关键业务手工 Span
例如:
- HTTP / RPC:自动
- 下单 / 支付:业务 Span
五、Context 传播(很多系统失败的原因)
1️⃣ 同步调用
- HTTP Header
- gRPC Metadata
2️⃣ 异步场景(难点)
- MQ Message Header
- 延迟队列
- 任务重试
Trace 断裂,90% 出在这里。
3️⃣ 跨语言 / 跨团队
- 统一规范(W3C Trace Context)
- OTel 默认支持
六、采样策略(规模化的生死线)
1️⃣ 为什么必须采样
- 全量 Trace 成本不可控
- 高并发下写入雪崩
2️⃣ 采样类型
| 类型 | 特点 |
|---|---|
| Head Sampling | 请求入口采样 |
| Tail Sampling | 事后决策(更准) |
| Rate | 固定比例 |
| Adaptive | 动态调整 |
3️⃣ 企业级推荐
- 错误 Trace:100%
- 慢请求:高采样
- 正常请求:低采样
七、存储与查询(不止 Jaeger)
1️⃣ 存储模式
| 模式 | 说明 |
|---|---|
| 索引型 | ES |
| 块存储 | Tempo |
| 列式 | ClickHouse |
2️⃣ 关键能力
- Trace 查询
- Span 过滤
- 服务依赖拓扑
- 时序趋势分析
八、分析能力(Tracing 的价值释放点)
1️⃣ 服务拓扑自动发现
- 调用依赖
- 延迟分布
2️⃣ 慢调用分析
- Critical Path
- 瀑布图
3️⃣ 异常传播路径
- Root Span 定位
- 上下游影响
4️⃣ Tracing → Metrics
- RED / USE
- 每个接口自动生成指标
九、Tracing 与 Reliability 的关系
| 稳定性能力 | Tracing 作用 |
|---|---|
| SLO | 请求级别 SLI |
| RCA | 传播路径 |
| 容量规划 | 热点识别 |
| 自愈 | 精确触发 |
十、治理能力(被严重低估)
1️⃣ Span 命名规范
- 语义一致
- 可聚合
2️⃣ Attribute 约束
- 避免高基数
- 统一字段名
3️⃣ 生命周期管理
- 热 / 冷 Trace
- 保留策略
十一、Tracing 成熟度模型
| 阶段 | 特征 |
|---|---|
| L1 | 手工打点 |
| L2 | 自动链路 |
| L3 | Metrics 关联 |
| L4 | SLO 驱动 |
| L5 | 智能 RCA |
