错误监控
错误监控页面(/analytics/errors)提供 6 个 Tab:错误 Issue / 概览 / 错误事件 / Source Map / 告警规则 / 告警历史,默认进入「错误 Issue」,覆盖 Issue 分组、堆栈还原、行为面包屑、状态流转与多渠道告警。
捕获范围
全局兜底 useGlobalErrorHandler(App 中挂载一次)自动捕获并上报常见错误,也支持业务手动上报严重崩溃:
| 类型 | 来源 |
|---|---|
js_error | 未捕获的运行时错误(window error) |
promise_rejection | 未处理的 Promise 拒绝(不含约定内拒绝:ApiError 业务错误与 SubmitAborted 提交中断标记,二者由 request 层或页面自行提示,不进入错误监控) |
resource_error | 图片 / 脚本 / 样式等资源加载失败 |
console_error | console.error 调用 |
http_error | 失败的 fetch/XHR 请求(5xx / 网络错误,由 SDK API 监控转报) |
white_screen | 加载后根节点长时间无内容的疑似白屏 |
crash | 业务手动调用 reportError('crash', ...) 上报的严重崩溃 |
上报链路
POST /api/frontend-errors(匿名/登录均可,受 error-report IP 限流)。匿名上报同样支持站点 X-Analytics-Site-Key 归属租户,并受站点来源白名单约束。
- 每次上报携带最近 30 条行为面包屑(导航 / 点击 / 网络 / 控制台)用于还原现场。
- 会话回放开启时自动携带当前回放 ID(
replayId),错误与录像精确关联。 - SDK 侧对同一
type + message的错误做 10 秒去重,避免循环报错刷爆队列。 - 载荷截断上限:
message2000 字符、stack16000 字符、来源/页面 URL 512 字符。 - 采集设置中的
errorIgnorePatterns按租户配置正则规则,命中message的错误在服务端丢弃;非法正则被跳过,不影响其他规则。
Issue 分组模型
相同错误按指纹聚合为一个 error_group(Issue),每次发生记录为一条 error_event:
- 指纹 =
hash(tenantId + environment + errorType + 归一化 message + 顶层堆栈帧 + 来源文件);归一化会抹掉数字、UUID、十六进制地址等易变部分,含租户与环境因子保证全局唯一。 - 列表
GET /api/frontend-errors/groups支持按状态 / 类型 / 级别 / 错误信息关键词筛选。 - 概览
GET /api/frontend-errors/overview提供错误种类、未解决数、总发生次数、影响用户、今日新增、趋势与 Top Issues。 - 「错误事件」Tab(
GET /api/frontend-errors/events)按标准分页平铺查看单次错误事件;Issue 详情可通过groupId查看该分组的最近事件。 error_group_identities以u:{userId}/m:{memberId}/a:{sessionId}对每个 Issue 去重维护影响用户数,避免详情页临时做大范围COUNT(DISTINCT)。
详情
GET /api/frontend-errors/groups/{id} 返回:
- 错误信息与堆栈;若已上传对应 release 的 Source Map,自动给出还原后的源码堆栈(可切换原始 / 还原)。
- 近 14 天发生趋势、浏览器 / 系统分布、影响用户数。
- 最近事件列表,每条可展开查看面包屑、上下文、UA、HTTP 详情。
会话回放联动
报错时刻若回放录制处于活跃状态,错误事件会携带精确的回放 ID:
- Issue 详情「最近事件」与「错误事件」详情弹窗中,携带回放的事件显示**「查看会话回放」**按钮,跳转回放中心深链(
/analytics/replays?replay={id})直接播放报错前后的操作录像。 - 反向:回放详情的关联错误列表可跳回对应 Issue(
?issue={groupId}深链)。 - 事件 context 携带服务端
requestId时另有「查看服务端链路」按钮跳转链路追踪,三者共同构成「录像 + 前端堆栈 + 服务端链路」的完整排障现场。
回放的录制模式、触发方式与隐私策略见 会话回放。
状态流转与指派
PUT /api/frontend-errors/groups/{id}:
- 状态:未解决 / 已解决 / 已忽略 / 已静音;标记已解决记录
resolvedAt,再次发生自动重开(回归检测:同指纹错误再次上报时resolved自动翻回unresolved并清空resolvedAt)。 - 指派处理人、修改级别、添加处理备注。
- 支持批量改状态(
POST /groups/batch-status)与批量删除(DELETE /groups/batch)。 - 清除历史数据:
DELETE /api/frontend-errors/clean?days=N(权限monitor:error:manage)删除 N 天前的错误事件与关联分组。
Source Map 堆栈还原
在「Source Map」Tab 管理打包产物的 .map 文件(按 release + 文件名,文件名需与压缩堆栈中的 bundle 名一致,如 index-abc.js):
GET /api/frontend-errors/source-maps列表、POST /source-maps上传(replace 语义,重复上传覆盖)、DELETE /source-maps/{id}删除。- 单个 Source Map 最大 20MB,前后端均会拒绝超限内容。
- 构建过程自动注入应用版本(可用
VITE_APP_VERSION覆盖),错误上报的release必须与上传时填写的 Release 一致。 - 详情页自动将压缩堆栈逐帧映射回源码位置(基于
source-map库)。
告警规则
在「告警规则」Tab 配置(查看 monitor:alert:list,管理 monitor:alert:manage):
- 条件:新错误(
new_error,出现新指纹分组即命中)/ 阈值(threshold,时间窗口内错误数 ≥ 阈值)/ 激增(spike,当前窗口错误数 ≥ 阈值且超过上一窗口的 2 倍)。 - 可按错误类型、级别过滤;阈值次数 1–100000,时间窗口 1–10080 分钟。
- 通知渠道(
email/webhook/inapp站内信):启用规则必须至少选择一个渠道;webhook必须配置 URL,email/inapp必须配置接收人。 - Webhook 外呼启用 SSRF 防护,拒绝本机、私网及云元数据地址(8 秒超时)。
- 测试发送:
POST /api/frontend-errors/alerts/{id}/test按规则当前渠道配置发送一条测试通知,验证可达性,不影响去抖状态。
评估与去抖
- 定时任务
evaluateErrorAlerts每 5 分钟评估全部启用规则;此外错误上报落库时实时评估一次(new_error条件由新分组判定直接短路,threshold/spike复用窗口计数),新错误告警无需等下一个周期。 - 去抖:命中后通过条件 UPDATE 原子推进
lastTriggeredAt抢占触发权——同一规则在一个时间窗口(windowMinutes)内最多触发一次,多实例并发评估也不会重复通知。 - 每次触发写入
error_alert_logs(规则快照、命中详情、投递渠道),在「告警历史」Tab(GET /api/frontend-errors/alert-logs,权限monitor:alert:list)分页查看。