异常监控
监控是软件质量最后的防线,帮助我们发现真实场景中才会出现的问题,是提高软件质量的有效手段,在后端世界中异常监控已经是不可或缺的模块。
异常监控的核心问题
- 异常捕获:如何高效、准确和全面的捕获异常?
- 数据上报:如何选择上报时机?如何在性能和信息全面性之间做出取舍?
- 数据分析:我们能够根据上报信息得出更深层的有价值结论吗?
- 告警:什么时候告警?什么方式告警?
异常监控主要流程
异常捕获 -> 数据上报 -> 数据分析 -> 告警
异常捕获 - 同步
//浏览器
window.onerror // 全局异常捕获
window.addEventListener('error') // js错误、资源加载错误
window.addEventListener( ' unhandledrejection') // 没有catch的Promise错误
//node
process.on( 'uncaughtException') // 全局异常捕获
process.on(unhandledRejection' ) // 没有catch的Promise错误
异常捕获 - 异步
异步异常通常采用重写原生,第三方库相关方法实现:
- setTimeout setlnterval
- fetch
- XMLHttpRequest
- ...
const originalSetTimeout = window.setTimeout;
window.setTimeout = (fn, time) => {
const wrap = () => {
try {
fn()
} catch (e) {
// do something
}
}
return originalSetTimeout(wrap, time);
})
异常捕获 - 利用框架、库本身的能力
重写框架相关方法:
- Vue.config.errorHandler
- React ErrorBoundary
- ...
异常上报常见问题
- 跨域问题:图像 ping、JSONP、CORS
- 信息量大问题:Batch Sending
- 附带上下文信息 (用户信息,错误前后的控制台log.)
推荐工具Sentry
- 知名的开源监控平台
- 不仅可用于前端,也可用于后端应用
- 开箱即用的错误收集、错误上报、数据分析、监控告警功能
- 异常捕获:非常全面和自动化,大部分错误不需我们手动 try..catch..
- 数据上报:丰富的异常上下文
- 数据分析:多维度的异常分析方式、直观的报表展示
- 告警:多样告警方式、自由的告警规则
优化点
数据爆炸
前端监控的一个显著特点:容易短时间产生海量数据
解决方案:
- 采集端考虑:采样后上报(sampleRate)
- 收集端考虑:生产者消费者模式- 利用消息队列控制消息消费速度
- ...
效果增强
- 更多的告警方式
- 收集用户反馈,获得用户的主观意见和建议
- 更丰富的上下文信息:用户操作录像等 (rrweb)
- ...