前端埋点、pv/uv统计、前端监控

1. pv/uv统计

pv: 页面重复浏览量

统计方式,多页面应用通常在页面load事件,单页应用通常在页面路由中

uv: 页面独立访客浏览量

统计方式,pv统计的基础上,添加唯一标识,可以是IP地址,用户浏览器localStorage存储的uuid等。

IP地址存在局域网内的共享一个ip、代理、动态ip等误差

uuid存在用户删除localStorage等,需权衡选取,uuid的准确度更高

2. 前端埋点

无侵入式的埋点方式,就是理由冒泡,在dom层级挂载 track-key,记录上报参数,在document层级监听事件,截获埋点参数,触发上报

vue框架,可以使用 v-track 这个库

react框架,可以使用 react-tracking 或者 react-decorator-track

3. 上报埋点的方式

1. gif图get请求上报,首选,get请求,数据量小,支持跨域,无阻塞(new Image无需append到body即可发送请求)

2. img beacon上报,次之,post请求,数据量大,需后端支持跨域

3. ajax上报,最次,需后端支持跨域

埋点库封装可参考 前端埋点sdk封装

4. 前端监控

监控平台可使用

Sentry:一个开源的前端错误监控工具,可以捕获和报告 JavaScript 和前端框架的错误和异常。它提供详细的错误信息和堆栈跟踪,帮助开发人员快速定位和解决问题。

前端要封装监控库,收集监控信息

前端需要捕获异常类型

JS 语法错误、代码异常
AJAX 请求异常
静态资源加载异常
Promise 异常
Iframe 异常
跨域 Script error

1. window.onerror捕获异常

当 JS 运行时错误发生时,window 会触发一个 ErrorEvent 接口的 error 事件,并执行 window.onerror()

window.onerror = function(message, source, lineno, colno, error) {
    // message:错误信息(字符串)。
    // source:发生错误的脚本URL(字符串)
    // lineno:发生错误的行号(数字)
    // colno:发生错误的列号(数字)
    // error:Error对象(对象)
    console.log('捕获到异常:',{message, source, lineno, colno, error});
}

2. window.addEventListener捕获资源加载异常

当一项资源(如图片或脚本)加载失败异常,由于网络请求异常不会事件冒泡,因此必须在捕获阶段将其捕捉到才行,
但是这种方式虽然可以捕捉到网络请求的异常,却无法判断 HTTP 的状态是 404 还是 500 等

<scritp>
window.addEventListener('error', (error) => {
    console.log('捕获到异常:', error);
}, true)
</script>
<img src="./xxx.png"></img>

3. Promise异常 用 unhandledrejection 全局监听

window.addEventListener("unhandledrejection", function(e){
    e.preventDefault()   //此句可以去掉控制台的异常显示,适当选用
    console.log('捕获到异常:', e);
    return true;
});

4. VUE异常捕获用errorHandler, React异常捕获用componentDidCatch

5. 对于 iframe 的异常捕获,使用 window.onerror

<iframe src="./iframe.html" frameborder="0"></iframe>
<script>  
window.frames[0].onerror = function (message, source, lineno, colno, error) {
    console.log('捕获到 iframe 异常:',{message, source, lineno, colno, error});
    return true;
}
</script>

6. Script error

出现 Script error 错误,是因为引用了跨域的脚本,浏览器出于安全原因,window.onerror无法捕获完整错误信息,只能显示 Script error.

解决方法

1. 服务器端配置设置:Access-Control-Allow-Origin,允许当前域名,即引用脚本的页面的域名

2. 脚本添加 crossorigin 属性

<script src="http://xxx/index.js" crossorigin="anonymous"></script>

响应头和crossorigin取值问题

1. 设置 crossorigin属性后,script标签去请求资源的时候,request会带上origin头,然后会要求服务器进行 cors校验,跨域的时候如果response header 没有 ‘Access-Control-Allow-Origin’ 是不会拿到资源的。cors验证通过后,拿到的script运行内部报错的话, window.onerror 捕获的时候,内部的error.message可以看到完整的错误信息。
2. crossorigin的属性值分为 anonymous和use-credentials。如果设置了crossorigin属性,但是属性值不正确的话,默认是anonymous。
3. anonymous代表同域会带上cookie,跨域则不带上cookie,相当于 fecth请求的credentials: 'same-origin'。
4. use-credentials跨域也会带上cookie,相当于fetch请求的 credentials: 'include',这种情况下跨域的response header 需要设置'Access-Control-Allow-Credentials' = true,否则cors失败

 

参考: 如何优秀的处理前端异常

          script crossorigin 属性 

posted @ 2023-06-28 13:44  全玉  阅读(1872)  评论(0编辑  收藏  举报