一、前端监控
首先我们先来了解一下什么是前端监控?通过一定的手段来获取用户行为以及跟踪产品在用户端的使用情况,并以监控数据为基础,为产品优化指明方向,为用户提供更加精确、完善的服务,前端监控主要分为三大类
1. 数据监控(监控用户行为)
- PV (page view):即页面浏览量或点击量
- UV:指访问某个站点或点击某条新闻的不同 IP 地址的人数
- 用户在每一个页面的停留时间、触发的行为......
统计这些数据是有意义的,比如我们知道了用户来源的渠道,可以促进产品的推广,知道用户在每一个页面停留的时间,可以针对停留较长的页面,增加广告推送等等。
2. 性能监控(监控页面性能)
- 不同用户,不同机型和不同系统下的首屏加载时间
- 白屏时间、 页面渲染时间
- HTTP 请求的响应时间
- 页面交互动画完成时间...
这些性能监控的结果,可以展示前端性能的好坏,根据性能监测的结果可以进一步的去优化前端性能,尽可能的提高用户体验。
3. 异常监控(监控系统异常)
及时的上报异常情况,可以避免线上故障的发生。虽然大部分异常可以通过 try catch
的方式捕获,但是比如内存泄漏以及其他偶现的异常难以捕获。
二、埋点上报
上面我们已经了解了一个产品需要监控哪些内容以及为什么需要监控,那么我们应该怎么实现前端监控呢?
实现前端监控,第一步是将我们要监控的事项(数据)给收集起来,再提交给后台进行入库,最后再给数据分析组进行数据分析,最后处理好的数据再同步给运营或者是产品。数据收集的丰富性和准确性会直接影响到我们做前端监控的质量,因为我们会以此为基础,为产品的未来发展指引方向。
现在常见的埋点上报方法有三种:手动埋点、可视化埋点、无埋点
1. 手动埋点
手动埋点,也叫代码埋点,即纯手动写代码,调用埋点 SDK 的函数,在需要埋点的业务逻辑功能位置调用接口,上报埋点数据
优点:让使用者更加方便地设置自定义属性、自定义事件
缺点:项目工程量大,需要埋点的位置太多,容易出现手动差错,重新埋点的成本也很高
2. 可视化埋点
通过可视化交互的手段,代替上述的代码埋点。将业务代码和埋点代码分离,提供一个可视化交互的页面,输入为业务代码,通过这个可视化系统,可以在业务代码中自定义的增加埋点事件等等,最后输出的代码耦合了业务代码和埋点代码。
缺点:可以埋点的控件有限,不能手动定制
3. 无埋点
无埋点则是前端自动采集全部事件,上报埋点数据,由后端来过滤和计算出有用的数据
优点:前端只要一次加载埋点脚本
缺点:流量和采集的数据过于庞大,服务器性能压力山大
三、采用图片(GIF)做埋点
向服务器端上报数据,可以通过请求接口,请求普通文件,或者请求图片资源的方式进行,只要能上报数据,服务器端其实并不关心具体的上报方式。那为什么使用请求 GIF 图片的方式上报数据呢?原因有如下几点:
1. 防止跨域
一般来说,打点域名都不是当前域名,所以所有的接口请求都会出现跨域问题,但图片的 src
属性并不会跨域,并且同样可以发起请求
2. 防止阻塞页面加载
通常,创建资源节点后只有将对象注入到浏览器 DOM 树后,浏览器才会实际发送资源请求。反复操作 DOM 不仅会引发性能问题,而且载入 js/css 资源还会阻塞页面渲染,影响用户体验;但是图片请求例外,构造图片打点不仅不用插入 DOM,只要在 js 中 new 出 Image 对象就能发起请求,而且还没有阻塞问题,在没有 js 的浏览器环境中也能通过 img 标签正常打点,这是其他类型的资源请求所做不到的。
3. 浏览器支持性好
所有浏览器都支持 Image 对象,即使不支持 XMLHttpRequest 对象也一样
4. 记录错误的过程很少出错
大多数 Ajax 通信借助 JavaScript 库的包装来处理,如果这个库本身出错,而你又要利用它记录错误,那么显然错误消息永远也不会发给服务器
5. 避免请求取消的出现
如果 ajax 请求发送过程中跳转了页面,那么该请求会被取消,但用图片不会有这个问题,在记录离开页面打点行为的时候会很有用的;图片是最早期的方式,兼容性较好,也可以使用 navigator.sendBeacon,现在所有主流浏览器都支持了navigator.sendBeacon 接口,专门用来解决页面卸载时数据无法继续发送的问题。
6. GIF 的体积最小
最小的 BMP 文件需要 74 个字节,PNG 需要 67 个字节,而合法的 GIF,只需要 43 个字节;同样的响应,GIF 可以比 BMP 节约 41% 的流量,比 PNG 节约 35% 的流量。
并且大多采用的是1*1像素的透明GIF来上报:1x1 像素是最小的合法图片,而且,因为是通过图片打点,所以图片最好是透明的,这样一来不会影响页面本身展示效果,二者表示图片透明只要使用一个二进制位标记图片是透明色即可,不用存储色彩空间数据,可以节约体积。