基于数据驱动的作事原则,咱们须要统计线上项目中,用户的行为和使用状况,从而更加贴近用户,为咱们的决策提供相应的数据支持,更好地迭代升级咱们的产品,创造用户价值。
既然如此,研发同窗以及业务方对前端监控的诉求应该有:html
而目前,对于咱们来讲,须要作的前端监控包括: 异常监控,指标监控,埋点监控前端
因为前端代码的执行环境很是复杂,很难保证在不一样的环境下不出现问题,并且有些问题每每是由于浏览器或者操做的缘由,难以复现,因此咱们须要收集异常数据,方便开发定位问题。web
什么是指标呢,我理解的应该是衡量咱们项目工程化能力的数据。好比咱们会记录FCP做为咱们的白屏时间,LCP做为首屏时间,以及做业提交的失败率等等。算法
这个主要是与业务相关,好比咱们会须要记录咱们投放的营销页面的转化率,用户进入咱们的页面以后,点击了什么按钮,将页面滚动到了什么位置,等等。用于还原用户行为的信息记录,为业务方提供业务调整的方向和依据。canvas
对于一个成熟的前端体系而言,一个靠谱的前端数据采集,上报,处理,监控报警平台也是很是有必要的。api
根据上面说到的三个监控方向,咱们须要的监控数据以下:浏览器
指标数据包括,性能数据(首屏时间,白屏时间,页面是否卡顿,页面加载全部资源的时间),以及自定义的指标数据(视频播放卡顿状况,做业提交失败率)架构
前端相关的性能指标繁多,核心指标的设计咱们主要参考google提出的以用户为中心的原则来设计。dom
其主要根据视觉反馈来制定具体的性能指标,下面以打开一个web页面为例:异步
除了以上几项性能数据,其余的如dns查询时间等性能,主要做为附加数据,仅在慢日志时自动采集。
通用性能指标的采集,在实现方案上须要保持对业务较低的侵入性。
FP(first paint): 首次绘制时间,能够理解为浏览器首个像素的绘制时间
FCP(first contentfull): 首次内容绘制,能够理解为首个可见元素的绘制时间,包含文本、图片、canvas等。
从用户的感知来说,fp时间接近白屏时间,fcp主要受index.html dom结构以及loading等影响。故咱们主要以fp为参考指标。fp/fcp的采集,能够直接使用paint timing api来采集,从测试数据来看,没法是 spa仍是非spa页面,fp都比较接近白屏时间。
FMP(first meaningful paint): 首次有效绘制,也就是页面的核心元素渲染完成的时间点,不一样的网站,核心元素的定位不同。
FMP 目前来看并无标准的API支持,google lighthouse中采集的fmp的准确率仅为70%左右。可是能够看到主流的前端监控,基本都将FMP做为一项重要的性能指标。咱们能够根据自身的业务特色,作关键的特征提取,而后调整权重算法,达到较为接近真实数据的指标。
TTI(Time-to-interactive): 用户可交互时间,这个阶段浏览器已完成渲染工做,并可影响用户输入的时间。
对于重交互的页面,较为关注 可交互时间,好比咱们的scratch3,对于重展现的页面,对可交互时间的关注较弱,好比dm单
TTI指标的采集,google官方提供polyfill方法,可参考使用。
咱们须要记录用户从进入页面,点击事件,滚动事件,离开页面等操做
用户浏览器信息 ,用户硬件设备信息等等
对于以上数据,前端监控SDK是默认收集部分数据,也提供对应的接口,供项目调用上报到数据平台。
目前主流的监控工具库有sentry,badjs.saiji等等,通过充分调研后,认为sentry可以匹配咱们的监控需求,可是因为sentry并不能彻底知足咱们的监控需求,因此咱们对其进行了扩展。
实现捕获数据的基本原理以下:
一般是在http中使用中间件来处理,经过代理原生的XHR对象,以及原型方法和Fetch方法,来实现对http请求调用的拦截
一般是经过监听 unhandledrejection
来捕获Promise被reject可是没有catch的异常,并获得关于异常的信息
捕获全局异常,不管异步仍是同步错误,onerror都能捕获到运行时错误
一般是经过 window.addEventListener('error', function(event) { ... })
来捕获
经过Performance API获取页面性能
记录用户从进入页面,点击事件,滚动事件,离开页面等操做
项目根据自身状况,调用相应接口,上报到数据平台
经过该平台咱们能够很直接地了解项目的各方面数据,以帮助咱们做出决策
目前监控系统已经普遍应用在团队的各个项目中,对了解项目性能,项目运行状况,管理项目等提供了很大的帮助,也方便团队作技术决策。