浅谈前端异常监控与定位
前言
文章分成以下六部分来介绍:
- 自研监控平台解决了哪些痛点,实现了什么亮点功能?
- 相比传统的监控方案,自研监控的优势有哪些?
- 前端监控的目的、监控的设计方案
- 数据的采集方式:错误信息、性能数据、用户行为、加载资源、个性化指标等
- 自研监控平台亟待优化的方面
痛点
系统上线之后,出现意料之外的问题,无法点击、跳转、白屏、用户会有异常情况,机型兼容情况等等,事前没有第一时间发现异常并上报,问题溯源费时、排查难。
亮点
监控平台提供了三种方式还原错误:
优势
- 采用pnpm + monorepo开发模式,可以将不同功能的SDK统一成一个
- 监控自定义的个性化指标,比如memory页面内存、首屏加载时间、long task
- 提供了更多的错误还原方式,更细致的还原用户行为栈,更快的排查线上错误
- 提供了 采样对比+ 轮询修正机制 的白屏检测方案
监控的目的
- 事前预警:当监控的数据达到阙值时,通知开发人员避免造成大面积的错误
- 事后分析:通过监控信息,分析故障原因和故障发生点,防止类似情况再次发生
- 性能优化:采集页面关键性能指标,帮助开发者了解页面的性能情况,为页面优化提供方向
- 提供决策:通过监控平台采集各个项目的PV、UV、健康状况、性能指标等数据,帮助决策者了解页面的整体运行情况,为决策提供数据支撑
监控的设计方案
监控流程:
- 监控SDK(使用AOP切片编程思想,发布-订阅设计模式,作用:数据采集与上报)
- 数据看板(参考sentry的数据看板)
- 错误还原
- 监控报警
监控SDK
- 错误采集:接口报错、JS 代码运行错误、语法错误、异步错误、静态资源加载错误
- 用户行为数据采集:用户页面操作、页面跳转、网络请求、页面报错、用户自定义事件
- 性能数据采集:FP、LCP、TTFB、FID、CLS
- 资源数据采集:资源列表、资源缓存率
- 个性化指标采集:long task、内存使用情况、首屏加载时间
- 数据上报:优先使用sendBeacon上报,若数据量大,再使用图片打点上报和fetch上报(常规请求)
数据看板
错误还原
- sourcemap代码还原
- rrweb前端录屏
- 用户行为栈
监控报警
数据的采集方式
- try/catch
- window.onerror
- window.addEventListener
- unhandledrejection
- Vue.config.errorHandler
- React的ErrorBoundary
- window.addEventListener("error")
- 重写XMLHttpRequest拦截请求错误
- 通过 PerformanceObserver 采集性能数据
- 重写pushState、replaceState事件
- performance.getEntriesByType('resource')和 PerformanceResourceTiming来采集资源加载的详细数据
- performance.memory可以采集此刻内存占用情况
- 利用MutationObserver采集首屏的加载时间
自研监控平台亟待优化的方面
- 图片打点缺点是:url受浏览器长度限制
- 打包生产版本没有map,需要定位错误位置,则在生产环境时,开启sourcemap选项,把map文件放到指定的服务器地址,不可对外暴露
- rrweb前端录屏慎用,开启录屏对前端的性能有一定的影响,主要在于录屏数据的压缩与上传,可考虑worker
- 页面复杂DOM数量多的情况下,全量快照会很耗时,页面渲染会被阻塞,用户强感知
- 异常后自动上报,一旦发生整站故障,那么大概率会所有用户一起上报,重复率很高,server迎来流量洪峰,考虑下怎么扛
- 兜底开关,业务系统接入录屏,一旦发生性能问题,远程一键关闭及时止损
- 不支持ie11及以下的浏览器(什么是ie浏览器!)