前言
在现代的软件开发和运维过程中,系统的稳定性和高可用性一直是技术团队最为关注的问题之一。而异常监控作为保障系统健康、快速响应问题的重要手段,已经成为每个系统不可或缺的一部分。通过异常监控,开发者可以实时捕捉到系统中的潜在问题,及时排查并修复,避免系统故障对业务带来较大的影响。
工作之余,参考了几篇优秀的文章,学会了从零搭建平台,想和大家分享下心得体会。
功能梳理
在搭建前希望平台可以支持以下功能点,并且希望可以由用户自定义各种功能点是否开启。
- 捕获异常
- 上报异常
- 异常监控录屏
针对上述罗列出来的功能点,下面开始一步步实现吧~🚗🚗🚗
功能实现
下面的实现会将异常捕获及上报等逻辑包装在一个class中。
自定义配置项
private config: MonitorConfig; // 配置项
private errorQueue: ErrorData[]; // 错误队列
private errorCache: Set<string>; // 错误指纹缓存
private recorder: any; // 录屏器实例
private screenEvents: any[] = []; // 录屏事件列表
private timer?: NodeJS.Timeout; // 定时器
初始化
初始化主要包括:异常监听、录屏、将本地错误加入上报队列、页面变化监听
private initialize() {
this.initErrorListeners(); // 初始化错误监听
this.initScreenRecording(); // 初始化录屏
this.loadFromLocalStorage(); // 从本地加载错误队列
this.initPageHideHandler(); // 监听页面可见性变化
}
全局错误监听
错误类型可以分为:JS错误、资源加载错误、异步错误
JS错误
资源加载错误
异步错误
主动上报
针对自动的错误上报,可以直接调用对应的方法,将错误加到上报队列中
初始化录屏
合并本地错误
由于数据上报会存在异常的情况,为了防止错误丢失,会将其暂存在本地,当重新初始化时需要合并进来,重新上报。
监听页面变化
监听页面卸载时上报数据,防止数据丢失。
错误去重
当发生了同样的错误,是不需要重复上报的,需要对错误去重处理。
根据错误数据生成hash值,缓存hash值,每次添加到队列中时去重处理。
生成hash
错误去重
关联录屏
错误上报
根据用户的配置项决定上报的方式,其中的request上报设置了定时上报,避免抢占浏览器资源。
上报方式提供了三种:request、img、navigator
录屏播放
通过rrwebPlayer播放录制的异常监控数据。
结束语🙋
以上是核心逻辑梳理及部分源码展示,下面附上git地址,有需要的话欢迎去git查看~ github.com/nanfriend-1…