项目五:前端稳定性监控与大促高可用
从 SDK 采集到告警、容量、预案和事故复盘,整理一个能把前端异常闭环到发布决策的稳定性项目。
项目五:前端稳定性监控与大促高可用
资料中的“前端哨兵”项目覆盖错误、用户行为、框架异常、性能指标、ErrorId、日志上报和 Web/小程序差异;配套的大促资料进一步涉及入口盘点、容量、三层监控、预案和演练。本文将其组织成完整项目,不把“提前多少分钟发现”或 Crash 百分比当作既定结果。
1. 背景与目标
前端故障往往先表现为用户无法点击、页面白屏、请求失败或数据展示错误,而服务端大盘可能仍然正常。没有统一采集和版本关联时,团队只能依赖用户截图,难以回答:
- 哪个版本、浏览器、路由和依赖引起了问题?
- 有多少会话受影响,是否集中在资损或高流量入口?
- 是真实异常、主动取消、弱网超时,还是监控 SDK 自己失败?
- 如何在大促期间快速止血,并在事后补上测试和发布门禁?
项目目标是建立一条不阻塞业务的闭环:
采集 -> 脱敏/标准化 -> 采样/聚合 -> 队列上报
-> 版本/trace 关联 -> 大盘/告警 -> 预案/止血
-> 复盘/回归测试/规则调整
成功标准要落到行为和证据:错误能定位到 release 和样本;关键性能能按路由和设备分位统计;上报失败不会放大故障;高风险入口有容量、降级、回滚和演练记录。
2. 监控架构
浏览器 / 小程序
|- runtime/resource/unhandled rejection
|- request/performance/behavior
\- framework boundary
|
v
SDK: normalize -> redact -> sample -> bounded queue -> beacon/fetch
|
v
接收网关 -> 校验/限流/去重 -> 事件存储 -> 聚合大盘/告警
| |
v v
release/source map 值班/预案/事故单
SDK 只负责轻量采集和可靠发送;聚合、查询、告警和权限放在服务端。Web 和小程序可共享事件模型与脱敏规则,但能力检测、生命周期和上报 API 分别适配,不假设两端完全相同。
3. 统一事件信封
type MonitorEvent = {
schemaVersion: 1
id: string
type: 'error' | 'performance' | 'request' | 'behavior'
occurredAt: number
sessionId: string
page: { url?: string; route?: string }
release: string
traceId?: string
samplingVersion?: string
payload: Record<string, unknown>
}
字段约束:
id客户端生成,用于重试去重;服务端仍需幂等写入。release与构建产物、Source Map 一致;错误不能只按消息文本聚合。- URL、错误消息、自定义属性进入队列前做字段级脱敏;不采集 Cookie、Authorization、输入框原文和完整 IP。
payload限制深度、字符串/数组长度和总字节数,超限时保留摘要。- 路由、浏览器、网络类型和采样版本作为维度,但避免未经必要性评估的设备指纹。
错误 fingerprint 可组合事件类型、标准化消息、文件/行列和 release;同一问题聚合后再告警,避免单个用户连续刷新把值班频道刷爆。
4. 错误与请求采集
全局 error 监听需区分运行时异常和资源加载失败;unhandledrejection 统一转换未知 reason。框架 Error Boundary 负责组件树,但不能代替全局捕获。跨域脚本只得到 Script error. 时,需要服务端 CORS 与 crossorigin 配合;第三方脚本仍可能不可观测。
请求拦截器记录脱敏后的 URL 模板、方法、状态、耗时、取消/超时原因和 traceId,不记录完整请求体或令牌。主动取消、用户离开页面和预期降级应标记为非错误,避免错误率虚高。慢请求和错误请求提高采样,正常请求按会话或哈希稳定采样。
5. 性能与用户行为采集
PerformanceObserver 可观察导航、资源、长任务、布局偏移和交互延迟。首屏指标先在内存中汇总,页面隐藏或 pagehide 时用 navigator.sendBeacon 尝试发送;Beacon 只保证请求进入浏览器队列,不保证服务端已处理。内存队列在页面/进程结束后会丢失;若要求跨页面或跨启动补偿,必须将 outbox 持久化到 IndexedDB、Service Worker 等可靠介质,并设置过期与隐私清理,否则只能依赖服务端对已接收事件的幂等重试和明确记录丢弃计数。
行为采集只记录必要的事件名、页面和结果,不记录输入原文。关键点击可关联 traceId 和业务操作 ID,让“用户点了什么”与“哪个请求失败”能在同一时间线上查看。采集本身应异步、限流、可关闭,不得阻塞首屏或交互。
6. 队列、采样与降级
事件 -> 脱敏/规范化 -> 按策略采样 -> 内存队列(条数/字节上限)
|
+-- 批量压缩/Beacon
+-- 超限丢弃低优先级事件
+-- 失败退避/熔断
- 错误和关键性能事件优先于普通行为事件;队列满时按优先级丢弃。
- 上报请求设置超时、重试上限和指数退避;连续失败熔断一段时间,避免网络异常放大流量。
- SDK 初始化失败、CSP 阻断或 API 不支持时静默降级,只增加内部计数,不递归上报自身错误。
- 采样率和规则由版本配置控制,配置失效时使用安全默认值;不能远程下发任意代码。
- 采集开关应支持按环境、租户、路由和用户同意状态关闭,敏感场景默认最小采集。
7. 版本、Source Map 与定位
生产错误定位依赖三个一致的对象:发布版本、构建产物和 Source Map。部署时生成产物校验清单,将 Source Map 上传到受控平台,客户端只带 release 和文件名;旧版本错误匹配不到映射时应安全失败而不是猜测行号。
错误详情可以附带路由、浏览器版本、最近请求 traceId、操作步骤和 feature flag,但必须脱敏。发布系统要能从告警直接跳到对应 commit、灰度批次和回滚入口。
8. 大促前的入口与容量盘点
稳定性不是单一 SDK 项目。大促前先盘点三类入口:
- 核心重保入口:服务等级、准确性或响应时间有明确承诺。
- 资损入口:故障可能导致订单、金额或权益错误。
- 大流量入口:峰值可能挤压自身或下游容量,即使单次故障业务损失有限。
沿入口追踪 HTTP、RPC、消息、缓存和外部服务,标记强依赖/弱依赖、超时、资源水位、最近改造和历史故障。容量模型同时考虑上游流量、业务峰值日期、场景分配、下游限额和余量,并用压测或历史数据验证,不能只看本服务机器数。
9. 三层信号与黄金指标
Biz: 成功率、业务延时、关键状态、资损
Application: JS 错误、请求超时、线程/进程、中间件
System: CPU、内存、网络、磁盘、实例水位
每层按 Latency / Errors / Traffic / Saturation 组织
业务层最接近用户感受,优先触发告警;应用和系统层帮助定位原因。每条告警写清级别、阈值、持续时间、通知人、升级路径、预案和恢复条件。阈值应结合业务波动和分位数,不能过迟,也不能制造告警疲劳。
前端 SDK 的错误、请求、性能和行为事件可以作为 Biz/Application 层输入,但不能替代服务端和系统监控。大盘至少支持按 release、路由、端、浏览器、租户和依赖分组。
10. 预案、事故角色与演练
预案按执行时机和影响对象分为:
- 技术应急:限流、降级、摘除异常节点、切换备份。
- 技术前置:峰值前熔断弱依赖、暂停冲突任务、校验容量和开关。
- 业务应急:数据错误、玩法变更或需要业务确认的有损处理。
- 业务前置:配合活动节奏调整配置和服务策略。
每份预案至少包含执行/关闭时间、触发/恢复阈值、影响、决策/执行/验证人员、开启和关闭步骤。事故管理可分四个角色:事故总控、处理团队、发言人、规划/轮班负责人。实时事故文档记录时间线、证据、决策和交接,避免多人同时修改同一开关。
沙盘演练使用历史真实故障,重点验证止血、分工、证据保留和恢复,而不是只检查文档存在。演练后要恢复限流/扩容设置,并将缺口转成有 owner 和截止时间的改进项。
11. 失败边界与恢复
| 失败场景 | 可能后果 | 止血与长期改进 |
|---|---|---|
| SDK 上报接口故障 | 业务请求被额外拖慢 | 独立域名、超时、队列上限、熔断和静默降级 |
| 采样配置错误 | 关键事件丢失或流量暴涨 | 安全默认、版本化配置、配置审计和流量保护 |
| Source Map 不匹配 | 错误无法定位 | release 校验、产物清单、部署门禁和回滚 |
| 跨域脚本无堆栈 | 只能看到 Script error | CORS/crossorigin;接受第三方边界并监控资源失败 |
| Beacon 未送达 | 页面关闭时指标缺失 | visibilitychange/pagehide;只有持久化 outbox 才能下一次启动补偿,否则依赖服务端对已接收事件的幂等重试并记录丢弃计数 |
| 告警风暴 | 值班无法识别主因 | fingerprint 聚合、优先级和多指标抑制 |
| 强依赖超时 | 核心链路级联阻塞 | 超时预算、降级/切换、容量压测和预案演练 |
| 灰度版本异常 | 影响面扩大 | 小流量停止条件、release 维度大盘、一键回滚 |
12. 指标与验证
| 方向 | 指标定义 | 证据 |
|---|---|---|
| 采集质量 | 事件丢弃率、去重率、上报成功率、SDK 自身错误 | SDK 内部计数和接收网关日志 |
| 稳定性 | 错误会话率、资源失败率、接口超时率、受影响入口数 | release/路由维度大盘 |
| 体验 | LCP、INP、CLS、首屏/交互延迟 P75/P95 | PerformanceObserver、trace |
| 响应 | 告警到确认、止血、恢复和复盘完成时间 | 事故时间线 |
| 发布 | 灰度停止次数、回滚耗时、版本错误回归 | 发布系统和监控关联 |
| 大促 | 峰值流量余量、弱依赖降级覆盖、演练通过率 | 容量表、预案和演练记录 |
验证用例包括运行时错误、资源失败、Promise 拒绝、网络超时、Beacon 不可用、队列超限、隐私脱敏、Source Map 错配、降级开关和回滚。指标阈值由自身 SLO、设备和业务波动决定,不直接套用资料中的数字。
13. 面试表达与追问
三分钟版本
前端故障原来只能靠用户反馈,无法关联版本、路由和请求。我负责监控 SDK、事件协议和大促保障清单,采集错误、请求、性能和必要的行为事件,统一脱敏、采样、队列和 release/trace 关联。
SDK 失败时有上限、退避和熔断,不影响业务;发布前把核心、资损、大流量入口和强弱依赖画成链路,建立 Biz/Application/System 三层信号和限流、降级、回滚预案。
一次告警会沿样本、Source Map 和发布批次定位,事故后补回归测试、监控规则和演练。结果只引用自己的大盘、时间线和版本记录。
高频追问
| 追问 | 回答要点 | 深入阅读 |
|---|---|---|
| 为什么不能把所有日志都上报? | 成本、隐私、网络和告警噪声;统一信封、脱敏、优先级采样、队列上限和聚合 | 前端稳定性 |
error 和 Error Boundary 有什么区别? |
全局捕获资源/脚本/Promise,Boundary 捕获组件树;两者互补,跨域堆栈有边界 | 浏览器机制 |
| Beacon 一定可靠么? | 只保证浏览器接受入队,不保证服务端处理;用隐藏/卸载事件、持久化 outbox(若需要跨启动补偿)和幂等处理,无法持久化时明确接受丢失 | 浏览器高频追问 |
| 大促为什么要分 Biz/Application/System? | 业务指标先反映用户影响,应用/系统指标定位原因;每层按黄金信号和预案关联 | 前端稳定性 |
| 如何防告警风暴? | fingerprint 聚合、影响面/趋势分级、多指标抑制和明确升级路径 | 项目面试追问清单 |
| 怎么证明监控有效? | 固定 release、路由、样本和窗口,测采集质量、定位时间、恢复时间和回归缺陷;不引用宣传数字 | 技术误区与验证 |
14. 交付清单
- 事件信封、ID、release、trace 和脱敏规则有版本。
- 错误、资源、请求、性能和行为采集区分预期取消与真实失败。
- 队列有条数/字节上限、优先级、退避、熔断和降级。
- Source Map、构建产物、发布版本和回滚入口可关联。
- 大促入口、依赖、容量、Biz/Application/System 指标和预案齐全。
- 告警有阈值、持续时间、角色、升级和恢复条件。
- 通过故障注入、隐私、Beacon、灰度、回滚和演练验证。
- 指标带版本、样本、基线和时间线,不把示例收益当事实。
来源:高级前端亮点项目.pdf 第 38-39 页(错误/行为/框架/性能采集、ErrorId、上报链路及 Web/小程序差异);结合 高频真题解析与9月考点预测上.pdf 第 7-9 页(Cookie、缓存、鉴权与代理)、高频真题解析与9月考点预测中.pdf 第 8-9 页(性能指标和构建缓存)及已有 前端稳定性 整理。