前端监控之白屏异常| 青训营笔记

384 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第15天

前言

在上一篇系列的文章里我们介绍了前端监控的重要性和大概流程,在本文中会对异常监控信息中的白屏异常进行讲解。


白屏异常

白屏异常:用户屏幕无任何内容,一直保持为白色,任何后台交互信息包括报错都不会呈现给用户。
一般而言对于正常网站,当用户出现白屏异常时,多半是出BUG了。
白屏异常更像一个泛化的类型,因为引起白屏异常的因素有很多。当监控到白屏异常时,可能是JS错误,资源文件加载错误等。


如何监控白屏异常

根据查阅相关资料与博客的情况,完美解决监控白屏异常的方案似乎没有,在本次大作业中我采用的方法为等待页面渲染完成(onload()判断),再通过米字型采点(采点图如下所示),判断该点是否属于["html", "body", "#container", ".content"]中的一类,如果采得的点取得的element属于该四类的话,说明其无包裹内容,为空,那么则说明其是空白点。

米字型.png
通过图我们可以直观的看到分别从页面高的一半处,宽的一半处,左上至右下,右上至左下分别采点,该方法的好处是简单粗暴,比如在我们组的项目里,如下图所示(空白点用绿色方框标出), image.png
很明显这只是个测试页面,可以看到有27个空白点,也就是只采到了9个点,这个时候当空白点为36时,极大概率就为白屏异常,我们就可以判断他为白屏异常了。相关代码如下所示:

onload(function () {
    let xElements, yElements;
    for (let i = 1; i <= 9; i++) {
      xElements = document.elementsFromPoint(
        (window.innerWidth * i) / 10,
        (window.innerHeight * i) / 10,
      );
      yElements = document.elementsFromPoint(
        window.innerWidth - i*(window.innerWidth / 10 ),
        (window.innerHeight * i) / 10
      );
      isWrapper(xElements[0]);
      isWrapper(yElements[0]);
    };

    for (let i = 1; i <= 9; i++) {
      xElements = document.elementsFromPoint(
        (window.innerWidth * i) / 10,
        window.innerHeight / 2
      );
      yElements = document.elementsFromPoint(
        window.innerWidth / 2,
        (window.innerHeight * i) / 10
      );
      isWrapper(xElements[0]);
      isWrapper(yElements[0]);
    }

    // 白屏
    if (emptyPoints == 36) {
       ...
  };

相关补充

相信大家还没尽兴,对于监控白屏异常网上还有许多的方案。
比如饿了么,记录页面打开 4s 前后 html 长度变化,并将数据上传到饿了么自研的时序数据库。如果一个页面是稳定的,那么页面长度变化的分布应该呈现「幂次分布」曲线的形态,p10、p20 (排在文档前 10%、20%)等数据线应该是平稳的,在一定的区间内波动,如果页面出现异常,那么曲线一定会出现掉底的情况。

作者:极乐君\ 链接:zhuanlan.zhihu.com/p/399348866… 来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


以及GMTC阿里云前端监控团队前端技术专家彭伟春在一次大会上的分享:
1)侦听页面元素的变化
2)遍历每次新增的元素,并计算这些元素的得分总和 3)如果元素可见,得分为 1*权重, 如果元素不可见则得分为0
在此方法中实际上采用的是深度优先算法,如果子元素可见,那父元素可见,不再计算。 同样的,如果最后一个元素可见,那前面的兄弟元素也可见。通过深度优先算法,性能有了大幅的提升。
从学术角度上说该方法比本项目采用的采点法要好,下一次我会分享一下自己的对比记录。


总结

通过本文的学习,相信大家已经对白屏异常有了一定了解,也有了监控白屏异常的能力。本系列的下一节会继续介绍前端监控的异常关键信息。大家敬请期待!