Java

故障时间线怎么记,才能在 30 分钟后还原判断过程?

真正容易从事故现场丢掉的,不只是截图和日志,而是“为什么那时先看这个、先做那个”。把时间线记成证据、判断、动作和结果的连续变化,30 分钟后才有机会还原现场,而不是只剩一串零散操作。

  • 故障排查
  • 时间线
  • 复盘
  • 稳定性
  • 方法论
12 分钟阅读

我第一次真正意识到“时间线会记废”,是在一次已经做过回滚的事故里。

现场刚结束时,大家都觉得记录还算完整:

  • 群里留了很多截图
  • 回滚时间有
  • 限流时间有
  • 谁拉了 DBA、谁暂停了任务,也都找得到

可 40 分钟后复盘草记一摊开,最关键的问题一个都回答不上来:

  • 为什么 20:11 先回撤灰度,而不是先关重试?
  • 为什么 20:17 又补了一次限流?
  • 为什么 20:23 明明错误率降了,还没有立刻恢复入口?

也就是说,动作都在,理由不在。

从那以后我才越来越确定:

时间线最怕的,不是漏记某个时间点,而是把现场记成了一串“发生了什么”,却没记下“当时为什么这么判断”。

这篇不是给复盘写模板,也不是教秘书怎么做会议纪要。它只处理一个非常现场的问题:当事故还在继续时,怎样把判断过程留下来,别让 30 分钟后的自己完全失忆。

那次事故里,真正救场的不是补截图,而是补“决策理由”

后来我们重新整理那场事故时,发现最值钱的不是监控图本身,而是一个同学临时在群里留下的几行短句:

  • “20:08,只有灰度实例 queue 抬头,先按局部实例 / 变更链看。”
  • “20:11,回撤一半灰度,观察 queue 和 timeout 是否同步回落。”
  • “20:17,queue 回落但 pending 仍高,先不恢复流量,继续看连接获取耗时。”

这几句当时看起来很随手,后面却成了整条时间线里最硬的骨架。

因为它同时留下了四样东西:

  • 时间
  • 证据
  • 判断
  • 动作后的观察点

反过来,很多截图虽然也留着,但离开当时的上下文以后,别人根本不知道它为什么会在那个时间点被贴出来。

所以后来我们不再把时间线记成流水账,而是记成“证据推动动作”的链

我现在更推荐的时间线长相,不是:

  • 20:03 告警响
  • 20:11 回滚
  • 20:17 限流
  • 20:25 恢复

而是每一条都至少带下面这几个意思:

当时看到了什么

不是笼统写“系统变慢了”,而是尽量写成现场证据。

例如:

  • submitOrder 的 P99 从 300ms 升到 4s
  • 只有灰度 4 台实例 queue 抬高
  • 连接池 pending 连续 3 分钟没回落

时间线里第一值钱的不是感受,而是证据。

因此更像什么,不像什么

这一句特别重要,因为它会留下当时的判断路径。

例如:

  • 更像局部实例 / 变更链,不像全局数据库先坏
  • 更像等待在放大,不像 CPU 计算突然打满
  • 更像止血动作还没打中压力点,不像已经自然恢复

少了这句,后面别人只能看到你做了什么,却不知道为什么不是另一种做法。

所以做了什么动作

动作本身当然要记,但别只记动词。

比起“回滚了”,更有用的是:

  • 回撤一半灰度,保留一半实例继续观察差异
  • 暂停补偿任务,观察 queue 和 pending 是否一起回落
  • 关闭同步重试,确认实际调用量倍率是否下降

动作如果不带目的,时间线还是会重新变成流水账。

动作后准备盯什么

很多时间线之所以后来没法复原,不是因为没写动作,而是没有写“预期验证点”。

例如:

  • 如果 queue 不降,说明回撤灰度没打中
  • 如果 timeout 降了但 pending 不降,说明压力只是换了个出口
  • 如果调用量倍率先降,说明重试确实是放大器

这一句一旦写上,时间线就不只是记录过去,还会变成现场接下来 5 分钟的工作台。

真正该更新时间线的,往往不是每次告警,而是每次判断变化

很多人记时间线会卡在一个问题上:是不是所有细节都要记?

我后来越来越觉得,不用。

真正必须更新的时刻,通常是下面几种:

  • 第一次切清影响面时
  • 第一次形成方向判断时
  • 每次关键动作前后
  • 判断被新证据推翻时

尤其最后一种最值钱。

因为现场最容易被复盘误解的地方,就是“你们是不是一开始就判断错了”。

其实很多时候不是判断草率,而是证据后来变了。这个变化如果不在时间线上留下来,后面就只会被看成瞎试。

这件事为什么不能等事故结束后再补

因为判断理由是最容易蒸发的东西。

日志和监控回头还能翻,动作记录系统里也常能找回来,但下面这些通常过一会儿就只剩模糊印象:

  • 为什么当时先看 A 没先看 B
  • 为什么那个动作只做了一半
  • 为什么那时觉得还不能恢复
  • 为什么某个证据当时被认为不重要

这些东西不在现场写下,30 分钟后往往就只能靠回忆拼。

而靠回忆补时间线,最容易把真正现场里的犹豫、推翻、验证,全都补成一条事后看起来很顺的假故事。

这篇的边界也别放大

如果你现在还没把多告警现场收成几条故障链,先去做范围切分,而不是急着记漂亮时间线。像值班时看到多个告警同时响,第一轮该怎样做范围切分?这种问题,优先级更高。

如果你现在已经进入事故结束后的经验沉淀阶段,更该接着看故障复盘如何从“现象记录”升级为“可复用方法论”?

这篇只守一个边界:事故还在进行时,怎么把判断过程保下来。

我后来最看重的一条时间线,不是写得最全的,而是让后面的人能立刻接上现场的

真正好的时间线,不会让后来加入的人只看到:

  • 告警响了
  • 动作做了
  • 曲线好了

而是能让他一眼接上:

  • 你们现在认为什么更像主线
  • 刚才那个动作想验证什么
  • 下一分钟最该盯哪组指标
  • 如果结果不对,接下来准备改哪条判断

时间线记到这个程度,它就不再只是复盘材料,而是排障本身的一部分。

现场越乱,越需要有人把“为什么刚才这么做”写下来。

不然 30 分钟后你手里明明有一整串动作,却还是还原不出那场故障到底是怎么被一点点判断出来的。