提及埋点又到了谈起前端项目中数据收集与监控,那么今天来简单的聊下前端报错监控的埋点。前端
首先先安利下本身作的报错监控的项目 FE-Monitor 欢迎 issue 和 star 。jquery
首先咱们能够看下前端作报错监控的意义在哪里:git
整体来讲前端监控的主要目的都是为了获取用户行为以及跟踪产品在用户端的使用状况,并以监控数据为基础,指明产品优化方向。github
try {
test code // throw error
} catch(e){
console.log(e);
}
复制代码
上面的代码在项目中很常见,通常用来捕获某一段可能代码抛出的错误信息。而且在try catch 中的错误并不会阻塞整个页面,即便发生错误,页面也能够继续执行。ajax
固然,咱们不太可能对这个项目中的每一段代码都添加 try catch,这样不只不利于线上定位问题产生的缘由,也会让代码难以维护,目前主流的就是在项目中独立引入一个报错监控的 JS 来单独的完成对整个项目的监控。函数
好比 FE-Monitor 就提供开源的项目报错监控的能力,只须要将 SDK 引入本身的项目中,便可监控整个项目的js执行报错,资源加载异常,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 的事件主要是为了发现 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
属性来判断不一样类型的错误。