从零开始搭建异常监控

117 阅读3分钟

前言

在现代的软件开发和运维过程中,系统的稳定性和高可用性一直是技术团队最为关注的问题之一。而异常监控作为保障系统健康、快速响应问题的重要手段,已经成为每个系统不可或缺的一部分。通过异常监控,开发者可以实时捕捉到系统中的潜在问题,及时排查并修复,避免系统故障对业务带来较大的影响。

工作之余,参考了几篇优秀的文章,学会了从零搭建平台,想和大家分享下心得体会。

功能梳理

在搭建前希望平台可以支持以下功能点,并且希望可以由用户自定义各种功能点是否开启。

  • 捕获异常
  • 上报异常
  • 异常监控录屏

image.png

针对上述罗列出来的功能点,下面开始一步步实现吧~🚗🚗🚗

功能实现

下面的实现会将异常捕获及上报等逻辑包装在一个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错误image.png

资源加载错误image.png

异步错误image.png

主动上报

针对自动的错误上报,可以直接调用对应的方法,将错误加到上报队列中image.png

初始化录屏

image.png

合并本地错误

由于数据上报会存在异常的情况,为了防止错误丢失,会将其暂存在本地,当重新初始化时需要合并进来,重新上报。

image.png

监听页面变化

监听页面卸载时上报数据,防止数据丢失。

image.png

错误去重

当发生了同样的错误,是不需要重复上报的,需要对错误去重处理。

根据错误数据生成hash值,缓存hash值,每次添加到队列中时去重处理。

生成hashimage.png

错误去重image.png

关联录屏

image.png

错误上报

根据用户的配置项决定上报的方式,其中的request上报设置了定时上报,避免抢占浏览器资源。

上报方式提供了三种:request、img、navigator

image.png

image.png

录屏播放

通过rrwebPlayer播放录制的异常监控数据。

image.png

屏幕录制2025-02-28-16.55.35.gif

结束语🙋

以上是核心逻辑梳理及部分源码展示,下面附上git地址,有需要的话欢迎去git查看~ github.com/nanfriend-1…

参考文档:github.com/rrweb-io/rr…