异常监控系统设计背景
不同于后端服务有日志可查询可追溯,对于前端而言,前台出现的异常和报错,往往在用户发现之后才能通知到开发,消息滞后,处理不及时,而且单纯从用户反馈描述去定位也有一定难度。当然,按业务场景来说,前后端也应该有一套完善监控系统,前端实现具体的前台监控方案,但对于上报日志的数据入库、分析、预警等,也需要后端的支持。有些前台出现的错误,例如数据类型报错,可能是前端数据处理出错,也可能是后端返回数据报错导致的逻辑错误,如果将前后端串联起来,可以方便及时发现线上异常,定位错误解决问题。
版本更新日志
版本 | 更新内容 | 备注 |
---|---|---|
1.1.0 | 增加IP字段,控制钉钉消息频率,修复undefined级错误显示,增加UUID字段识别设备 | 运行分析文档 |
系统版本
对于目前的用户量来说,第一阶段做好预警即可,根据实际情况来决定是否需要设计入库和分析的环节。
错误采集
前端常见异常:白屏(崩溃),样式错乱,渲染正常但执行某步操作后页面卡死,页面交互正常但某个资源无法加载(如图片显示报错,音频无法播放),前后端交互报错(如ajax请求40X或者50X)等。
异常等级
等级 | 异常类别 | 定级描述 | 异常产生常见原因 |
---|---|---|---|
0 | 白屏、样式错乱,某步操作导致页面卡死崩溃 | 用户完全无法使用或中断操作,最严重 | a. js运行时逻辑报错或数据类型错误(频率最高)b. 项目静态资源加载异常,资源跨域,非安全环境(频率较低)c. js语法错误(频率极低)d. 系统错误(频率极低) |
1 | 媒体资源无法使用 | 不影响产品交互,但用户无法使用完整功能,很严重 | a. 主站资源404(频率较低)b. 弱网环境(频率较低)c. 后台运营配置出错(频率较高) |
2 | 提交表单或发起请求失败,图片不可用 | 不影响产品交互,但对于部分场景会中断用户的操作步骤,对于ajax请求报错后端会先于前台系统报警,较严重 | a. 提交或返回数据类型出现变动,与约定格式不符(频率较低)b. 第三方基础服务报错(频率较低)c. 图片资源被删除(频率较低) |
信息采集
前端捕捉到的错误信息比较杂乱,需要在前台做一次数据过滤。
- 用户信息
- 在登录状态的维度进行定位。收集用户当前的登录状态,uid等。
- 设备信息
- 以系统类型、设备类型进行定位。收集报错机型和系统型号,便于复现并优化设备兼容性问题。
- 页面信息
- 根据当前页面信息和操作路径历史,定位报错页面,便于复现报错环节。
- 日志信息
interface ErrorLog {
tag: string;
appName: string;
userInfo: {
isLogin: boolean;
uid: string
};
deviceInfo: {
client: 'h5';
ua: string;
system: string;
isWeixin: boolean;
isApp: boolean;
version: string
};
pageInfo: {
url: string;
title: string;
routerLength: number
};
errorInfo: {
type: number;
desc: string;
level: number;
filename: string;
message: string;
errorStack: object;
lineno: number;
colno: number;
t: number
};
dingTalkInfo: string
}
日志上报
随着后期完善,用户体量增大,异常报错信息会变得越来越复杂,这就需要考虑到日志上报的量和频率问题,即需要做前端数据持久化存储。
根据错误等级进行频率控制,例如:
等级为0和1的错误应该即时上报。
等级为2的错误可以在前端作本地存储(IndexedDB或Storage),每5条打包批量上传一次,或者按照时间间隔进行单条上传,降低对服务器的压力。
除此之外,还可以增加用户反馈机制,弹出弹层,当非紧急异常在短时间内快速累积时,让用户选择手动反馈bug,并帮助用户自动刷新页面,防止页面卡死导致死机崩溃。
错误日志前端存档归档
前台收集的日志后在本地进行存档归档,上报后端之后,此条日志将进入归档区,记录并设立失效时间此条日志间结束后会对store进行清洗。
预警
后端接收到紧急异常上报后,立即以钉钉方式推送错误消息,需要展示最直观的信息,可以前后端进行约定。
规则:每分钟累计超过10条则发送一次消息。