前端性能监控错误上报

这周学习了一波前端性能分析和前端报错上传,当一个项目完成时,UI炫酷功能强大,却卡在性能瓶颈,势必会令项目黯然失色。并且当项目上线之后,如果无法进行错误的有效收集和定位,势必会给排查bug造成很大的困难。

说起前端性能指标,基础的有白屏时间,首屏时间,用户可操作,总下载时间,这里说一下基本概念:

  1. 白屏时间: 指用户首次看到内容的时间,一般会在head标签起始和结束位置做埋点
  2. 首屏时间:出现在视窗内所有资源加载完毕的时间,加载页面时开始统计,统计首屏所有图片加载时间(绑定load事件统计),页面加载完后判断图片是否在首屏内,找出最慢的一张;页面如果存在iframe,也要判断它的加载时间;
  3. 用户可操作时间:默认可以统计domready时间,因为通常会在这时候绑定事件操作。对于使用了模块化异步加载的 JS 可以在代码中去主动标记重要 JS 的加载时间,这也是产品指标的统计方式。对于React而言,也就是componentDidMount。
  4. 总下载时间:默认可以统计onload时间,这样可以统计同步加载的资源全部加载完的耗时。如果页面中存在很多异步渲染,可以将异步渲染全部完成的时间作为总下载时间。对异步渲染的代码进行埋点,耗时最长的则为总下载时间。
可以使用window.performance监测以上性能

performance接口的常用计算:

  1. DNS查询耗时 :domainLookupEnd - domainLookupStart
  2. TCP链接耗时 :connectEnd - connectStart
  3. request请求耗时 :responseEnd - responseStart
  4. 解析dom树耗时 : domComplete - domInteractive
  5. 白屏时间 :responseStart - navigationStart
  6. domready时间(用户可操作时间节点) :domContentLoadedEventEnd - navigationStart
  7. onload时间(总下载时间) :loadEventEnd - navigationStart

监控错误:前端的错误监控和上报有几个知识点

捕获错误的脚本要放置在最前面,确保可以收集到错误信息,以免被错误脚本报错阻碍

前端错误类型:

1. 资源加载失败,样式、图片、脚本文件的请求异常,比如文件或者图片加载404了

解决方法,使用window.addEventListener的捕获方式可以获取报错信息: "HttpError at " + (e.target.baseURI || location.href) + " outerHTML:" + e.target.outerHTML

2. js脚本异常,即控制台常见的Error信息
3. 检测HTML劫持,比如被运营商强行注入标签或脚本
4. 页面样式丢失,CSS 展现异常

window.addEventListener方法使用

window.addEventListener('error'), function(e) {}, true

  1. 异常的提示信息,会直接告诉你是什么异常。这是识别一个异常的最重要依据,即e.message中的信息;
  2. JS 文件名:异常发生在那个文件中。是堆栈信息中最顶层的那个文件。即e.filename。
  3. 异常所在行、列:异常的具体位置。行信息各浏览器基本还是一致的,列信息的差别较大,仅供参考。
  4. 堆栈信息:异常信息发生的堆栈,也是函数调用的堆栈信息,每下一层都是上一层的运行环境。即e.error.stack。每一层都包含类型、文件、行、列信息。但是注意堆栈信息可能会比较多,可以根据需要截取上报。safari和firfox的e.error.stack中不包含以上1,2,3的信息,只有堆栈信息,而chrome和IE中都包含,此处需要做兼容处理。
  5. 发生异常的设备信息,可以从window.navigator中选取自己需要的信息,或者直接使用window.navigator.userAgent

前端异常捕获方法使用:

  1. window.onerror()能捕获到的异常,当然如果用addEventListener无论冒泡还是捕获阶段也能捕获到该异常。
  2. 只有在window.onerror()中return true 错误信息才不会向上抛出,否则即使是知道异常的发生控制台还是会显示 Uncaught Error: xxxxx。
  3. window.onerror()无法捕获网络错误,由于网络请求异常不会事件冒泡,因此必须在捕获阶段将其捕捉到才行,但是这种方式虽然可以捕捉到网络请求的异常,但是无法判断 HTTP 的状态是 404 还是其他比如 500 等等,所以还需要配合服务端日志才进行排查分析才可以
    4.资源加载失败也就是网络错误的一种,即<img>、<script>标签上的onerror,这个异常无法通过冒泡到达window,但是可以在捕获阶段拿到,这就是为什么要将addEventListener第三个参数置成true了。这个报错收集非常必要,不然用户访问网站,图片 CDN 无法服务,图片加载不出来而开发人员没有察觉就尴尬了。
    5.捕获到错误后,阻止错误在控制台展示,线上自行收集错误信息以防外人看到
window.addEventListener('error', (function(e) {
    console.log("-----errorEvent----", e)
    e.preventDefault()  //这里换成 return false或return true均不行!
}), true);
window.onerror = function(msg, url, line, col, error) {
    console.log("------errorInfo---",msg, url, line, col, error)
    return true;   //这里用return false不行!
}
  1. 关于Promise错误:有时候promise没有写catch语句,这个报错onerror并不能捕获,最好添加一个 Promise 全局异常捕获事件 unhandledrejection
window.addEventListener("unhandledrejection", function(e){
  e.preventDefault()
  console.log('我知道 promise 的错误了');
  console.log(e.reason);
  return true;
});
Promise.reject('promise error');
new Promise((resolve, reject) => {
  reject('promise error');
});
new Promise((resolve) => {
  resolve();
}).then(() => {
  throw 'promise error'
});
  1. 父窗口的onerror事件是无法捕获其中iframe中的JS错误的

Scirpt error

这个就是跨域脚本的问题了,基于安全协议跨域脚本的报错无法接收到具体信息。因为线上的版本,经常做静态资源 CDN 化,这就会导致我们常访问的页面跟脚本文件来自不同的域名,这时候如果没有进行额外的配置,就会容易产生 Script error,解决办法如下:
一:静态资源请求需要加多一个Access-Control-Allow-Origin头部。
二:<scrip>标签加上crossorigin属性

https://www.cnblogs.com/bldxh/p/6857324.html
https://www.cnblogs.com/bldxh/p/6923370.html
https://github.com/happylindz/blog/issues/5

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 现行有一些已经开源的前端异常监控库,如腾讯的badJs,全栈js监控fundebug,国外的sentry等。 错误...
    滚石_c2a6阅读 3,924评论 3 0
  • 最近在做一个前端监控的js 如图,一个大概的思路是这样的。 图片版 -----------------------...
    Estarsyang阅读 507评论 0 0
  • 错误类型 我们一般比较关心以下三种类型的错误 js执行错误 资源加载错误 http请求错误 全局捕获错误 wind...
    tiancai啊呆阅读 457评论 0 0
  • 为什么要做前端异常监控 有些问题只存在于线上特定的环境 后端错误有监控,前端错误没有监控 基本实现 参考我们nod...
    2林子易2阅读 6,947评论 0 9
  • 现在很多企业都在学习“联想”的复盘文化。包括现在的当红的互联网公司“罗辑思维”,之前一直在“得到”上学习,订阅了全...
    张彦博Burgess阅读 128评论 0 0