监控体系

在线上项目中,需要统计产品中用户行为和使用情况,从而可以从用户和产品的角度去了解用户群体,从而升级和迭代产品,使其更加贴近用户。用户行为数据可以通过前端数据监控的方式获得,除此之外,前端还需要实现性能监控和异常监控。性能监控包括首屏加载时间、白屏时间、http请求时间和http响应时间。异常监控包括前端脚本执行报错等。 实现前端监控有三个步骤:前端埋点和上报、数据处理和数据分析。

  1. 数据监控
  • PV/UV:PV(page view),即页面浏览量或点击量。UV:指访问某个站点或点击某条新闻的不同IP地址的人数
  • 用户在每一个页面的停留时间
  • 用户通过什么入口来访问该网页
  • 用户在相应的页面中触发的行为
  1. 性能监控
  • 不同用户,不同机型和不同系统下的首屏加载时间
  • 白屏时间
  • http等请求的响应时间
  • 静态资源整体下载时间
  • 页面渲染时间
  • 页面交互动画完成时间
  1. 异常监控
  • Javascript的异常监控
  • 样式丢失的异常监控

前端异常

try...catch 可疑区监控

try...catch 只能捕获到同步的运行时错误,对于语法和异步错误无能为力,捕获不到。

window.onerror

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

  • 函数只有在返回 true 的时候,异常才不会向上抛出(浏览器接收后报红),否则即使是知道异常的发生控制台还是会显示 Uncaught Error: xxxxx
  • 最好写在所有 JS 脚本的前面,否则有可能捕获不到错误
  • 无法捕获语法错误

window.addEventListener

当一项资源(如图片和脚本加载失败),加载资源的元素会触发一个Event接口的error事件,并执行该元素上的onerror处理函数。这些error事件不会向上冒泡到window, 不过(至少在 Chrome 中)能被单一的window.addEventListener 捕获。

对于全局的错误捕获,在现代浏览器中,倾向于只使用window.addEventListener('error')window.addEventListener('unhandledrejection')就行了。如果需要考虑兼容性,需要加上window.onerror,三者同时使用,window.addEventListener('error')专门用来捕获资源加载错误。

Promise Catch

我们知道,在 promise 中使用 catch 可以非常方便的捕获到异步 error

为了防止有漏掉的 promise 异常,建议在全局增加一个对 unhandledrejection 的监听,用来全局监听 Uncaught Promise Error

iframe 异常

对于 iframe 的异常捕获,我们还得借力 window.onerror

Script error

一般情况,如果出现 Script error 这样的错误,基本上可以确定是跨域问题。这时候,是不会有其他太多辅助信息的,但是解决思路无非如下:跨源资源共享机制( CORS ):我们为 script 标签添加 crossOrigin 属性。

网页崩溃

  1. 利用 window 对象的 loadbeforeunload 事件实现了网页崩溃的监控。
  2. 利用 Service Worker 有自己独立的工作线程,生命周期一般要比网页还要长,与网页区分开,网页崩溃了,Service Worker 一般情况下不会崩溃,可以通过 navigator.serviceWorker.controller.postMessage API 向掌管自己的 SW 发送消息

监控方案

数据上报

  1. 通过 Ajax 发送数据

异常定位

参考:

谈谈前端异常捕获

前端异常监控解决方案研究

前端监控和前端埋点方案设计

撸一个前端监控系统

Webfunny 开源监控

web-monitoring