每日技术复盘 Day 28 | 领域:Agent Infra(可观测性 / 告警设计 / 恢复分层)
素材:10/10 21:09 -- 10/14 11:09 全链 402 停摆(39 次运行无一完成、零告警);含「上一期复盘被腰斩」自证案例
复盘时间:2026-10-14
缺期说明:Day 27(10/9)之后、本期之前,缺 10/10--10/13 四期------其中 10/10 当期写到一半即被本故障腰斩;其余三期从未启动。
〇 对账(第三期,距上期 5 天)
| # | 上期建议 | 状态 | 核对依据(10/14) |
|---|---|---|---|
| ① | 投资资讯任务超时预算 900→1200 | ❌ 连续第 4 晚未落地 | 配置实读仍为 900;且故障窗口恰好掩盖了该任务的越线风险(三天没跑) |
| ② | 恢复侧模板(续接/重试) | ✅ 再实盘两处 + 新增一类 | 金价「路径C续接」(16:00)与豆瓣「停一拍→续接」(19:08)均一次成功;新增「服务自愈」类:浏览器被关闭后提交任务即自动拉起(已固化到运维笔记) |
| ③ | 发布与收尾拆分(检查点化) | ⏳ 待决策 | 本期无新越线样本;建议仍挂 |
| ④ | 复盘对复盘 | ✅ 第三期本表 | ------ |
| ⑤ | 链长审计 | 🔶 延续 | 恢复日各链均在预算内(微博链 11:02→11:10 约 8 分钟) |
| ⑥ | 【本期新增】failureAlert 缺口 | 🔴 定位完毕、待决策 | 28 条任务 failureAlert 全部为空;模型 fallback next=none。见 ④ 提案 |
① 现象
- 用户视角:10/10 晚起,系统的全部自动输出(小说、复盘、资讯、日报、金价、日记......)彻底停止。持续到 10/14 10:27,用户发问「我的定时任务了」------系统连这句都答不出(回复只以「空消息 + stopReason=error + errorMessage=402」的形态留在会话档里,从未送达)。
- 系统视角 :10/10 21:09:03 -- 10/14 11:00:11,86 小时 ;窗口内 39 次调度运行无一完成(38 次首个模型请求即被拒;1 次执行了 8 分 52 秒后被腰斩------正是上一期(10/10)复盘自己,它当时正在生成对账证据表)。
- 第二故障域:浏览器自 10/13 10:01 被关闭(窗口关闭→扩展断连→任务池清空)。与 402 相互独立,但同窗口叠加。
② 排查(全只读、约 15 分钟)
- 会话档回放 :10/11、10/12、10/13 各 11 次运行失败,三天共 33 个失败档;错误行形态统一:
stopReason="error"+errorMessage="402 status code (no body)";10/14 上午再 +3。 - 网关日志:10/13 全部时点 402;10/14 10:27:46 最后一次 402 → 11:00:11 首个请求转 200(闸门解除点落在 10/14 10:28--11:00 之间,无我方动作记录)。
- 调度配置实读 :failureAlert 28/28 全空;模型 fallback 决策
next=none(备用链长度 0);consecutiveErrors 持续累计(本任务 =5)------计数在,管道缺。 - 群聊镜像:最后一条 10/10 19:10:03 → 空窗 → 首条恢复 10/14 11:09:45,空窗 86h00m。
- 成本纪律:全程只读、零取证泥潭(各调查步骤 ≤2 分钟)。
③ 根因(三层)
- 电源层(模型接口):402(计费类)在第一次模型调用就拒绝------一切寄生在 LLM 之上的东西(任务执行、心跳、告警、甚至复盘)同一秒全灭。
- 通知层(成功才投递) :失败任务没有产出 → 没有消息可投递 →「失败」与「无事发生」在用户侧同构。静默不是没有信号,是通知模型把信号丢掉了。
- 信号层(告警缺席):失败自始被完整记录(日志/计数/镜像),但没有一个通道把它「说出口」------failureAlert 未配置、无外部观察者。
- 结构性洞察 :
- 观测者必须与被观测系统异层:若告警由 LLM 生成,则与故障同生共死;调度器/网关层的 failureAlert 是现成的「异层通道」。
- 备用链长度 0 ≠ 有备用:failover 机制存在但候选为空;且同账户的备选也共享同一计费闸门------「异层」原则对备援同样适用。
④ 解决 / 提案
恢复事实(10/14):
- 402 由平台侧于上午解除(非我方动作);11:00:11 首个 200;微博链 11:02 启动、11:09 首条交付;
- 同日补跑机制全生效:微博、日报、小红书(卡登录墙,老问题)、金价、豆瓣------全部接回;
- 浏览器自愈路径当日固化(无需手动拉起,直接提交任务即触发服务 auto-launch)。
提案:
- 【P0】关键任务配置 failureAlert ------ 通道在调度/网关层、不依赖模型;建议
after≥2、announce 到群。以本次为标尺:若 10/10 晚即配置,至少省下 3.5 天静默。 - 【P1】二级「产出完备性」复核 ------ 由当日成功任务顺带核验;注意其自身依赖 LLM,402 场景同灭,只能作二级兜底。
- 【P2】402 处置清单:发现 → 提示检查账户计费/额度 → 恢复后核对补跑 → 告知。
⑤ 复盘
- 静默故障 = 失败 × 无信号;修复优先级永远是:先让失败可见,再谈自动恢复。
- 计数 ≠ 告警:consecutiveErrors 一直在涨------数据早已存在,只差「接出来」这一公里。把已有数据接给人眼,是性价比最高的可靠性投资。
- 观测者异层原则:问任何一个告警系统「你自己依赖什么」,再问「它挂了谁来喊」。
- 恢复分层认知:可自愈类(子进程)=提交触发;不可自愈类(平台侧)=只能快检知 + 告知。按「可自愈 / 可重试 / 需人工」分层,是恢复策略的前提。
- 黑色幽默归档 :上一期复盘被它要记录的故障腰斩于第 8 分 52 秒;本期把它作为首个完整案例。复盘可以迟到,但不会缺席。
- 系列坐标:Day 26「取证不是恢复」→ Day 27「恢复跟着残留状态走」→ Day 28「发现必须走出失效系统(异层观察)」。
应用场景:Agent Infra、可观测性建设、告警设计、故障复盘、恢复分层
关键词:静默失败、402、failureAlert、告警异层、备用链、恢复分层、可观测性