浏览器崩溃情况的监控方式--前端监控细节深究(1)

需求背景

我们需要实现一个浏览器崩溃的监控方式,为什么呢?

有两个方面的考量:

第一:我们正在参与字节的前端夏令营,我们要实现的项目是一个前端监控系统。其中一个重要的考核目标是系统实现的完整性,所以我们不得不做(笑)。

第二:我们需要更多的维度去衡量当前前端系统的"稳定性和可靠性 ",以便帮助用户去提高自己系统的"用户体验 "以及进行相关的"性能分析"。

方案设计

其实最为主流的就两种方案,第一种是load 与 beforeunload 事件 ,第二种是 基于 Service Worker 的崩溃统计方案

方案一 load 与 beforeunload 事件

js 复制代码
   window.addEventListener('load', function () {
      sessionStorage.setItem('good_exit', 'pending');
      setInterval(function () {
         sessionStorage.setItem('time_before_crash', new Date().toString());
      }, 1000);
   });

   window.addEventListener('beforeunload', function () {
      sessionStorage.setItem('good_exit', 'true');
   });

   if(sessionStorage.getItem('good_exit') &&
      sessionStorage.getItem('good_exit') !== 'true') {
      /*
         insert crash logging code here
     */
      alert('Hey, welcome back from your crash, looks like you crashed on: ' + sessionStorage.getItem('time_before_crash'));
   }

从 jasonjl.me 中,我们可以看到如上的实现方案,这里的逻辑相当简单。

  1. 在进入页面的时候注册 load 事件,并且在 sessionStorage 存入 { key: 'good_exit', value: 'pending' },并且每隔一秒存入 { key: 'time_before_crash', value: new Date().toString() }
  2. 在离开页面的时候注册 beforeunload 事件,并且把 sessionStorage 中存入的 good_exit 的值改为 'true'
  3. 并在每次打开的时候校验 sessionStorage 中的值,如果是正常退出的值'true',那就 ok,如过不是,就弹窗说出现了问题。

整个状态流转如图:

zhihu 中提到,如果我们使用这种方案会产生两个问题:

  • 采用 sessionStorage 存储状态,但通常网页崩溃/卡死后,用户会强制关闭网页或者索性重新打开浏览器,sessionStorage 存储但状态将不复存在;
  • 如果将状态存储在 localStorage 甚至 Cookie 中,如果用户先后打开多个网页,但不关闭,good_exit 存储的一直都是 pending,完了,每有一次网页打开,就会有一个 crash 上报。

方案二基于 Service Worker 的崩溃统计方案

一些定义------说在方案二之前

首先我们得知道,浏览器崩溃了,到底是哪里出了问题,我们先看下下面这个图片

我们知道在浏览器内核中存在着如图所示的五大线程,那么其中任何一个线程出现问题,都可能导致浏览器的白屏,卡死,甚至直接弹出。

那么我们对于浏览器崩溃这件事情的定义就显而易见了:"五个线程中的一个或多个出现问题,导致我们的浏览器出现问题。"

知道这一点对于我们理解第二个方案至关重要。

因为我们的 service worker 相当于新开了一个独立于这五个线程之外的线程,不受他们崩溃的影响。

具体实现

zhihu 中有第一种实现方式 & 相关的思路,就不再赘述了。

这里还打算给读者提供一个思考:"如果我直接把浏览器关闭了呢?"

思考一下,如果用户在sw还没有传给后端的时候就把浏览器关闭了,这个情况我如何监测到呢??

这里有一个 API 推荐给读者 Navigator.sendBeacon()。

这个 API 会在浏览器卸载之前将数据发送给服务器,所以我们首先将崩溃数量存储到 data 里,然后跟随着卸载执行这个 API,就可以保证我们数据的完整性了。

参考文章:

  1. zhuanlan.zhihu.com/p/40273861
  2. jasonjl.me/blog/2015/0...
相关推荐
曹牧5 小时前
C#:空合并运算符
java·前端·数据库
小羊没烦恼!6 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
智能直播8 小时前
RK3518:1.5G 内存 + 8G 存储,如何跑起硬件编解码、Web、AI 识别、绿幕特效
前端·人工智能·5g
掘金酱10 小时前
【10.24 特别活动】AI 时代,程序员的新饭碗在哪里?
前端·人工智能·后端
excel10 小时前
多进程环境下使用 PM2 部署 Socket.IO:需要注意什么
前端
IT_陈寒10 小时前
Redis的原子性竟然失效了?记一次分布式锁翻车实录
前端·人工智能·后端
Interview Aid11211 小时前
Snowflake OA 面试真题:前缀和、BFS 与动态规划
面试·动态规划·宽度优先
_菜鸟果果12 小时前
高德地图 JS API 2.0 在国产 Linux/ARM 电脑上渲染失败 的排查与解决
linux·开发语言·javascript
时间的情敌12 小时前
《回顾 2018 前端:Vue2 成熟期,Webpack4 发布,PWA 大火》
前端