2026 字
约 6 分钟
12
S16-A01 · 可观测性架构:采样、成本、保留与故障域

适用读者:要把"能排障"变成"可持续排障"的架构师/技术负责人。
前置:S16-J04、S17(分布式)、S15(容量与成本)。
覆盖旧文:A-560 → 270 点(什么时候适合/不够、单体是否需要、最大价值、局限、面试口径、Zipkin 与 SkyWalking 选型)。
扩展点:E-S16-009(采样与保留策略矩阵)。
上一篇:S16-J04 · 排障实战:从告警到根因的四步
下一篇:S16-A02 · 质量门禁与发布。


1. 一句话结论

可观测性的架构问题不是"采集什么",而是"在哪一层丢弃什么"。 全量采集在业务量增长后必然崩:先是存储成本,然后是采集链路成为故障源。采样与保留策略是架构决策,不是运维配置。

决策 不决策的后果
采样率与采样点(头部/尾部) 存储成本随流量线性上涨,最终砍掉追踪
保留期分层(热/温/冷) 排障时查不到 7 天前的链路
采集侧故障隔离 Collector 挂掉拖慢业务

2. 适用与局限:什么该上、什么不该上(§2)

原文的判断(任务版整理):

场景 结论
微服务调用多 ✅ 强烈建议上
团队正在学分布式追踪 ✅ Zipkin + 两个服务足够
只需要链路追踪 ✅ Zipkin/Micrometer 即可,不必上 APM
已有 Micrometer/Brave/OTel ✅ 复用现有埋点,只加后端
单体 + 单库 ❌ 结构化日志 + 指标足够;追踪收益 < 维护成本
只在做"技术栈升级" ❌ 追踪解决"跨进程因果",不解决代码质量

局限(必须写在方案里):

局限 说明
采样会丢数据 低频错误可能永远看不到(除非尾部采样)
追踪不等于 profiling 方法级热点要靠 async-profiler / JFR
埋点本身是代码 自研 RPC/私有协议需要手工传播上下文
存储是新的运维面 ES 集群也要容量规划、快照、恢复演练
成本不可忽略 见 §3 估算

3. 容量与成本估算(1 亿 span/天,可直接套)

假设:单 span 平均 500 B(含标签),日 1 亿 span。

项 计算 结果
原始日增 1e8 × 500 B 50 GB/天
压缩后(ES 约 0.4–0.6×) 50 × 0.5 25 GB/天
副本 ×2 25 × 2 50 GB/天
保留 7 天 50 × 7 350 GB
保留 30 天 50 × 30 1.5 TB

采样到 5% 后:原始日增 2.5 GB,7 天 ≈ 17.5 GB(含副本 35 GB)——成本降为 1/20,定位能力基本不变(错误链路强制采样补齐)。

判据:先算"一天有多少条错误链路",再定采样率——错误链路必须 100% 保留,正常链路才适合采样。


4. 采样与保留策略矩阵(E-S16-009)

流量特征 采样策略 保留期 备注
< 100 QPS 100% 头部采样 热 7 天 数据量小,别省
100–5k QPS 5–10% 头部 + 错误强制 热 7 / 冷 30 天 主流选择
> 5k QPS 1% 头部 + 尾部采样(错误/慢/关键业务 100%) 热 3 / 冷 30 天 需 Collector 缓冲
合规/审计要求 关键链路 100%,其余 0.1% 冷 180 天+ 冷存用对象存储
成本敏感 只留指标 + 错误链路 热 3 天 放弃"事后回看正常请求"

尾部采样的两个前提:① 有缓冲(否则决定时 trace 已丢);② 接受"决定延迟"(几秒到几十秒后才落库)。


5. 故障域:可观测性系统自己会坏

故障 表现 隔离手段
Collector/OAP 挂 应用继续跑,但无数据 应用侧异步上报 + 有界队列,满了丢弃而非阻塞
存储打满 写入失败,UI 空白 保留期 + 水位告警 + 只读降级
Agent 拖慢业务 接入后 P95 上升 压测前后对比;只对核心服务开启;开关可动态关闭
采样配置错误 关键期无数据 配置变更走评审;采样率纳入变更记录
时钟漂移 span 时间倒挂、树错乱 NTP 强制同步;UI 侧容忍乱序

架构原则:可观测性链路必须"故障时静默"——它不能成为业务的依赖。任何"上报阻塞业务线程"的实现都是设计缺陷。


6. 选型:Zipkin / SkyWalking / OTel 后端(§3)

维度 Zipkin SkyWalking OTel + 后端(Tempo/Jaeger)
能力 纯追踪 APM 全家桶 追踪为主,指标日志可分流
接入 依赖(Micrometer) Agent(零代码) SDK/Agent
拓扑 ❌ ✅ 需后端支持
运维 低 中 中高(多组件)
迁移成本 低 中(Agent 版本绑定) 中(标准协议,易换后端)
适合 中小/学习 中大型微服务 多语言、想避免厂商锁定

选型判据(三条,按顺序问):

  1. 是否需要"服务拓扑 + 多信号统一"? 是 → SkyWalking 或 OTel+APM 后端;否 → Zipkin 足够。
  2. 是否多语言/多团队? 是 → 优先 OTel(标准协议,后端可换)。
  3. 团队有没有人维护 ES/OAP? 没有 → 用托管服务,不要自建。

"两者能不能一起用"(原文 §23 的问题):可以,但不要双份埋点——用 OTel 作为唯一埋点层,同时导出到两个后端;双 Agent 会重复上报并放大开销。


7. 面试口径(§4)

被问"你怎么做可观测性"时,按决策顺序答,而不是罗列工具:

目标:把 MTTR 从 X 分钟降到 Y 分钟
信号:指标(发现问题)→ 链路(定位哪一跳)→ 日志(解释原因)
采样:头部 5% + 错误/慢请求 100%,尾部采样兜底
成本:日增 2.5GB,7 天热存 + 30 天冷存,约 N 元/月
故障域:上报异步、队列有界、满了丢弃;存储水位告警
验收:抽 10 条历史告警,能否在 10 分钟内定位到具体 span

这条口径的价值:它把"我用了 SkyWalking"变成"我做了可验证的取舍"。


8. 常见误区

误区 纠正
"先全量采集,以后再优化" 成本随流量线性上涨,优化时已积压历史数据
"采样会漏问题" 错误链路强制采样可补;全量反而因成本被整体关掉
"可观测性越全越好" 信号越多,维护面越大;先解决 MTTR 最大的一块
"自建 ES 更可控" 没有专职运维时,自建 ES 是最常见的"可观测性故障源"

9. 自测

  1. 用 §3 的表算出你现在的日增与月成本;如果流量涨 5 倍,还撑得住吗?
  2. 你的采样策略里,错误链路是 100% 吗?
  3. 画一张故障域图:Collector 挂了,业务会不会受影响?

10. 下一篇

S16-A02 · 质量门禁与发布:测试策略、灰度与回滚验收 —— 把前面的测试与观测能力接进发布流程,回答"什么条件下允许发、失败怎么退"。

S16-A01 · 可观测性架构:采样、成本、保留与故障域
https://www.clxhxhhr.top/posts/5414/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。