静默的 86 小时:全链 402 停摆与零告警的故障复盘

每日技术复盘 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 分钟)

  1. 会话档回放 :10/11、10/12、10/13 各 11 次运行失败,三天共 33 个失败档;错误行形态统一:stopReason="error" + errorMessage="402 status code (no body)";10/14 上午再 +3。
  2. 网关日志:10/13 全部时点 402;10/14 10:27:46 最后一次 402 → 11:00:11 首个请求转 200(闸门解除点落在 10/14 10:28--11:00 之间,无我方动作记录)。
  3. 调度配置实读 :failureAlert 28/28 全空;模型 fallback 决策 next=none(备用链长度 0);consecutiveErrors 持续累计(本任务 =5)------计数在,管道缺。
  4. 群聊镜像:最后一条 10/10 19:10:03 → 空窗 → 首条恢复 10/14 11:09:45,空窗 86h00m。
  5. 成本纪律:全程只读、零取证泥潭(各调查步骤 ≤2 分钟)。

③ 根因(三层)

  1. 电源层(模型接口):402(计费类)在第一次模型调用就拒绝------一切寄生在 LLM 之上的东西(任务执行、心跳、告警、甚至复盘)同一秒全灭。
  2. 通知层(成功才投递) :失败任务没有产出 → 没有消息可投递 →「失败」与「无事发生」在用户侧同构。静默不是没有信号,是通知模型把信号丢掉了。
  3. 信号层(告警缺席):失败自始被完整记录(日志/计数/镜像),但没有一个通道把它「说出口」------failureAlert 未配置、无外部观察者。
  4. 结构性洞察 :
    • 观测者必须与被观测系统异层:若告警由 LLM 生成,则与故障同生共死;调度器/网关层的 failureAlert 是现成的「异层通道」。
    • 备用链长度 0 ≠ 有备用:failover 机制存在但候选为空;且同账户的备选也共享同一计费闸门------「异层」原则对备援同样适用。

④ 解决 / 提案

恢复事实(10/14):

  • 402 由平台侧于上午解除(非我方动作);11:00:11 首个 200;微博链 11:02 启动、11:09 首条交付;
  • 同日补跑机制全生效:微博、日报、小红书(卡登录墙,老问题)、金价、豆瓣------全部接回;
  • 浏览器自愈路径当日固化(无需手动拉起,直接提交任务即触发服务 auto-launch)。

提案:

  1. 【P0】关键任务配置 failureAlert ------ 通道在调度/网关层、不依赖模型;建议 after≥2、announce 到群。以本次为标尺:若 10/10 晚即配置,至少省下 3.5 天静默。
  2. 【P1】二级「产出完备性」复核 ------ 由当日成功任务顺带核验;注意其自身依赖 LLM,402 场景同灭,只能作二级兜底。
  3. 【P2】402 处置清单:发现 → 提示检查账户计费/额度 → 恢复后核对补跑 → 告知。

⑤ 复盘

  1. 静默故障 = 失败 × 无信号;修复优先级永远是:先让失败可见,再谈自动恢复。
  2. 计数 ≠ 告警:consecutiveErrors 一直在涨------数据早已存在,只差「接出来」这一公里。把已有数据接给人眼,是性价比最高的可靠性投资。
  3. 观测者异层原则:问任何一个告警系统「你自己依赖什么」,再问「它挂了谁来喊」。
  4. 恢复分层认知:可自愈类(子进程)=提交触发;不可自愈类(平台侧)=只能快检知 + 告知。按「可自愈 / 可重试 / 需人工」分层,是恢复策略的前提。
  5. 黑色幽默归档 :上一期复盘被它要记录的故障腰斩于第 8 分 52 秒;本期把它作为首个完整案例。复盘可以迟到,但不会缺席。
  6. 系列坐标:Day 26「取证不是恢复」→ Day 27「恢复跟着残留状态走」→ Day 28「发现必须走出失效系统(异层观察)」。

应用场景:Agent Infra、可观测性建设、告警设计、故障复盘、恢复分层

关键词:静默失败、402、failureAlert、告警异层、备用链、恢复分层、可观测性

相关推荐
要开心吖ZSH43 分钟前
定时任务从外部调度搬回本地 @Scheduled:一次连接池被打满的复盘与选型思考
前端·firefox
开开心心就好1 小时前
文件关联被破坏怎么修?免费工具一键修复
java·服务器·开发语言·pdf·ocr·启发式算法·宽度优先
不停喝水1 小时前
【前端转全栈java速通课】 项目实战④12-14节 拦截器过滤器和全局配置-cors跨域设置-token体系-利用session做验证码
java·开发语言·前端·ai·容器
VimorphTech1 小时前
转写结果怎么生成双语字幕?TypeScript 实现 SRT、WebVTT 与索引匹配
javascript·音视频开发
代码猎人1 小时前
怎么开发一个微信小程序
前端
console.log('npc')1 小时前
第 3 章 工程化与项目初始化
前端·人工智能·大模型
CVer儿1 小时前
起源引擎harmmer++ 配置
开发语言
掘金者阿豪1 小时前
数据集成软件不能只看“同步成功”:聊聊金仓 KFS 和订单数据同步这件事
前端·后端
星夜离尘561 小时前
MATLAB FFT 单边幅度谱:归一化、奇偶长度与频谱泄漏的完整实验
开发语言·matlab·信号处理·频谱分析·fft