前端埋点 - 报错监控

提及埋点又到了谈起前端项目中数据收集与监控,那么今天来简单的聊下前端报错监控的埋点。前端

首先先安利下本身作的报错监控的项目 FE-Monitor 欢迎 issue 和 star 。jquery

首先咱们能够看下前端作报错监控的意义在哪里:git

  • 帮助灰度测试发现问题
  • 收集线上错误日志
  • 帮助优化产品稳定性
  • 收集错误数据用于分析
  • 监控第三方资源/CDN 稳定性

整体来讲前端监控的主要目的都是为了获取用户行为以及跟踪产品在用户端的使用状况,并以监控数据为基础,指明产品优化方向。github

常见监控方式

try {
    test code  // throw error
} catch(e){
    console.log(e);
}
复制代码

上面的代码在项目中很常见,通常用来捕获某一段可能代码抛出的错误信息。而且在try catch 中的错误并不会阻塞整个页面,即便发生错误,页面也能够继续执行。ajax

固然,咱们不太可能对这个项目中的每一段代码都添加 try catch,这样不只不利于线上定位问题产生的缘由,也会让代码难以维护,目前主流的就是在项目中独立引入一个报错监控的 JS 来单独的完成对整个项目的监控。函数

好比 FE-Monitor 就提供开源的项目报错监控的能力,只须要将 SDK 引入本身的项目中,便可监控整个项目的js执行报错,资源加载异常,ajax错误等信息了。测试

ajax 错误监控

ajax 的错误监控主要是为了发现服务接口返回值的问题。优化

看了一些产品的实现都是对 window 下的 XMLHttpRequest 重写,可是这样直接重写不只会形成调用链的修改也会让宿主页面上的多个 ajax 库产生冲突,如使用了 jquery 的话 jquery 中是直接使用 XMLHttpRequest 对象的。若是修改了全局的对象中的属性可能会形成之外的影响。ui

用了一种特殊的方式去实现对 XMLHttpRequest 对象的监听。this

_initListenAjax: function () {
    let self = this;
    function ajaxEventTrigger(event) {
      var ajaxEvent = new CustomEvent(event, { detail: this });
      window.dispatchEvent(ajaxEvent);
     }
     var oldXHR = window.XMLHttpRequest;
     function newXHR() {
      var realXHR = new oldXHR();
      realXHR.addEventListener('load', function ($event) {
        ajaxEventTrigger.call(this, 'ajaxLoad');
      }, false);
      realXHR.addEventListener('timeout', function () {
        ajaxEventTrigger.call(this, 'ajaxTimeout');
      }, false);
      realXHR.addEventListener('readystatechange', function() {
        ajaxEventTrigger.call(this, 'ajaxReadyStateChange');
      }, false);
      return realXHR;
     }
     window.XMLHttpRequest = newXHR;
     self._startLintenAjax();
  }
复制代码

这样作不只能够一经调用就监控到页面的错误,不会出现重写 window.onerror 的时候第一次错误监控不到的状况还须要重写 console.error 函数才能够监听到。

error错误监控

错误监控中对 error 事件的监控是最重要的,监听 error 的事件主要是为了发现 js 执行中抛错。

window.addEventListener("error", function(err) {
      getError(err, self._config);
}, true);
复制代码

监控 error 报错的状况中,最 error 的处理中要判断是不是咱们设置的埋点接口的 URL 所抛错的。主要是为了不在埋点服务宕机的状况下出现重复请求上报,形成页面卡死的状况。

监控资源加载异常

页面上有不少的外部的资源,通常来讲对资源的加载的监控是在资源标签添加 onerror 的方法来监听加载错误信息。

这种作法和对js 代码添加 try catch同样,须要对每一个资源都不断的添加监控。

对比以后 使用 addEventListener 监控总体的项目资源加载更方便快捷。

window.addEventListener("error", function(err) {
      getError(err, self._config);
}, true);
复制代码

其中 addEventListener 方法中的第三个参数是 useCapture,若是将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。 若是useCapture 为 false,则侦听器只在目标或冒泡阶段处理事件。

其中回调函数中接受的 err 中有 cancelable 属性的是js执行错误,因此能够经过 err 上时候有 cancelable 属性来判断不一样类型的错误。

相关文章
相关标签/搜索