这类问题看似集中在一个 API 或参数上,真正决定可用性的却是状态归属、资源上限和失败后的恢复方式。 window error 的资源失败与脚本异常参数不同,Promise reason 甚至不一定是 Error。采集层先归一化 kind、code、stack fingerprint 和 release。
可观测性应回答故障发生在哪个阶段、影响多少会话和是否仍在扩大。事件字段使用白名单与低基数维度,用户内容、密钥和完整网络身份不进入遥测。
先把实现决策说清楚
先把下面几项写成可评审的规则,而不是散落在回调和界面判断里。规则越清楚,后续扩容、兼容和排错越少靠猜。
- 只允许同源受控 stack,URL 去查询和片段,错误消息按规则清洗;相同 fingerprint 在时间窗聚合,页面卸载用小型 sendBeacon 批次。
- 先定义正常、降级、取消和失败四类终态,再让界面、存储与指标消费同一状态。
- 重试必须带幂等键、退避和截止时间;超过截止时间后建立新任务,而不是继续复活旧回调。
“浏览器全量报错采集:Error、Promise、资源和 CSP 要分开处理”的交付标准是正常路径可用、异常路径收敛、资源有界,并且用户能理解系统为何采用当前状态。 这样得到的不是演示代码,而是能解释、能降级、能回滚的生产能力。
最容易漏掉的失败路径
不要把异常路径理解成弹一次提示。它还包括在途工作如何停、对端如何获知、残留数据如何处置,以及下一次操作是否会继承旧状态。
- 错误处理器本身抛错会递归上报;把 Response body 或 DOM 快照附加错误又会泄露聊天、文件名和连接秘密。
- 旧响应在新任务建立后迟到,如果没有版本隔离,会把健康状态覆盖成失败或再次启动已取消工作。
- 只在理想数据量下测试,真实的大文件、长会话或高并发会越过隐含上限并产生级联故障。
上线前怎样验证
发布闸门应包含确定性回归、随机时序探索和真实浏览器组合。发现一次失败后保存 seed 与状态轨迹,让它永久成为可重放用例。
- 分别触发同步异常、字符串 reject、404 脚本、521 API、跨域脚本和 CSP 违规,确认分类、去重、脱敏与离线上报恢复。
- 连续执行一百次开始、失败、重试和取消,检查句柄、监听器、队列及临时数据回到基线。
- 发布前记录成功率、p50/p95/p99 延迟、错误分类和资源高水位,并为回退条件设定明确阈值。
最终交付标准应当是:正常路径足够快,异常路径能够收敛,用户意图不会被自动恢复覆盖,运维人员也能从有限而安全的证据定位问题。