这是我参与「第四届青训营 」笔记创作活动的第15天
前言
在上一篇系列的文章里我们介绍了前端监控的重要性和大概流程,在本文中会对异常监控信息中的白屏异常进行讲解。
白屏异常
白屏异常:用户屏幕无任何内容,一直保持为白色,任何后台交互信息包括报错都不会呈现给用户。
一般而言对于正常网站,当用户出现白屏异常时,多半是出BUG了。
白屏异常更像一个泛化的类型,因为引起白屏异常的因素有很多。当监控到白屏异常时,可能是JS错误,资源文件加载错误等。
如何监控白屏异常
根据查阅相关资料与博客的情况,完美解决监控白屏异常的方案似乎没有,在本次大作业中我采用的方法为等待页面渲染完成(onload()判断),再通过米字型采点(采点图如下所示),判断该点是否属于["html", "body", "#container", ".content"]中的一类,如果采得的点取得的element属于该四类的话,说明其无包裹内容,为空,那么则说明其是空白点。
通过图我们可以直观的看到分别从页面高的一半处,宽的一半处,左上至右下,右上至左下分别采点,该方法的好处是简单粗暴,比如在我们组的项目里,如下图所示(空白点用绿色方框标出),
很明显这只是个测试页面,可以看到有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
在此方法中实际上采用的是深度优先算法,如果子元素可见,那父元素可见,不再计算。 同样的,如果最后一个元素可见,那前面的兄弟元素也可见。通过深度优先算法,性能有了大幅的提升。
从学术角度上说该方法比本项目采用的采点法要好,下一次我会分享一下自己的对比记录。
总结
通过本文的学习,相信大家已经对白屏异常有了一定了解,也有了监控白屏异常的能力。本系列的下一节会继续介绍前端监控的异常关键信息。大家敬请期待!