- 作者:老汪软件技巧
- 发表时间:2024-09-06 17:02
- 浏览量:
在白屏检测的场景下,不必检测这类可替换元素是否有内容。
例如一个全屏的 iframe 是否发生了白屏,提供该 iframe 的团队自行检测即可;再或者一个全屏的 img (常见于运营投放的公告类信息),若图片资源加载失败、也已经有对应的资源加载成功率可以监控。
因此,我们白屏检测的部分可以进一步约定:只需要检测常见的用来做容器的节点的元素即可
const COMMON_CONTAINER_TAG_NAMES = [
'HTML',
'BODY',
'DIV',
'NAV',
'MAIN',
'SECTION',
'FOOTER',
'HEADER',
];
if (COMMON_CONTAINER_TAG_NAMES.indexOf(whiteElementTagName) > -1) {
reportWhiteScreen();
}
页面不可见时
场景: 如下图,同时存在 2 个页面时,后方的 webview 若对于用户不可见,此时检测白屏也没有意义;这种场景常见于移动端,例如小程序或客户端同时打开了 2 个原生页面
解决方案: 检测时增加页面 visibleState 的判断,页面不可见时不检测白屏
Toast 后又白了
场景: 某个接口发生正常业务报错,一般都是 toast 出对应的错误信息,此时执行检测白屏正常;3s 后 toast 消失,此时页面仍然是白屏
解决方案:判定为正常的情况下,也兜底二次确认
白屏但正常的场景
当然,不是所有的白屏上报都属于异常场景:有可能是当时网络慢,检测的时候确实是白屏;也有的页面在业务定义上,就是一个没有内容的中转页面。
页面加载慢
原因: 在执行检测白屏时,因网络等原因,资源或接口尚未加载完成,检测的那一时刻确实是白屏的。
回收上报的白屏数据发现,若页面的 FCP 75 分位大于 2s,上报的白屏比例 (白屏数量 / pv 数量) 会大于 0.8%。
解决方案: 需要业务代码优化,例如加个骨架屏
设计如此
此类在业务上定义就是空页面的,在设置告警或排查白屏问题时剔除即可
白屏检测流程
处理完各类差异化场景,我们的白屏检测流程大致如下
当然,我们的方案预期内就会存在一定的误报,前文也提到了一些白屏但正常的场景。这并不影响,我们的目标是对于页面白屏指标能观测、并且可以针对性的排障。若有误报,只需要在排查时剔除对应的路由即可。
方案对比取舍
当前也有几类主流的白屏检测方案,在调研时团队也针对公司的业务场景做了分析和权衡,对比如下
方案评估结论
页面截图对比颜色,检测是否纯色。
优点 : 准确度高**不使用原因:**引入成本大:例如常见的 html2canvas 库,可以将页面转成一个图片,其体积就有58kb,对于「寸土寸金」的日志 SDK 而言太大,引入成本过高另外检测时由于要操作canvas、逐个对比像素,预期内就对用户设备的性能有较大损耗。
React 提供的ErrorBoundary,渲染出错时该生命周期会被执行
不使用原因:不够通用:无法适用于其他技术栈下的前端项目;并且需要业务代码自行改造、上报,而我们的目标是一个通用性的监控方案;另外,也有上文提到的原因:白屏时不一定会发生 JS Error,二者没有直接的因果关系。
使用 document.elementsFromPoint 方法打点,轮询检测取点是否全部为根节点根节点(html,body,#app,#root 等)前端监控库 web-see 就是使用方案
我们整体检测思路正是来自 web-see 的方案,但在原有方案上针对公司的业务场景做了扩展:通用性强:例如上文提到的场景三,web-see无法检测,我们的方案可以正常检测上报白屏。接入简单:在我们的方案下,无需业务代码参与改造,无需指定检测的根节点。轻量化:对原监控SDK的体积只增加了0.7KB(gzip后);真机测试检测平均耗时 8ms;影响小:检测时机在页面pv发生后,无须轮询浪费性能。适配场景多:如上检测流程图,我们针对 6 类不同场景 也做了兼容处理,保障了上报数据的准确程度。
排障思路
有了白屏检测能力后,我们要如何发现并解决 H5 页面存在的白屏问题呢?
得益于货拉拉完善的日志系统和监控告警平台,我们可以针对上报的白屏日志配置看板和告警规则
看板观察
设置项目页面路由级别的白屏看板,可在日常巡检时、或发生白屏告警后,观察页面的白屏上报情况以及发展趋势
告警通知
针对与上一天同一个时间点的白屏比例 (当前项目的白屏数量 / 当前项目的 pageview 数量) 对比,在大于告警阈值的时候通知对应研发
下图是一次生产故障演练时的告警通知
存量排查
除了对新增的白屏 case 进行观察和告警,线上存量的异常白屏场景往往是以下几类原因:
少量场景下的数据异常造成用户特殊的操作,或代码未处理全部状态的数据,导致未能呈现正常页面
那么就需要结合上报的其他日志细致排查个例的操作轨迹,例如是否有接口数据异常、是否发生了 JS Error 等,一一排查。
思考与规划
本文探讨了一种轻量化的前端白屏监控方案。目前,该上报方案已经覆盖了货拉拉国内的所有 H5 页面,在告警系统上增加了通用的页面白屏率告警,高频页面也有初步定制化的告警规则。
通过走查上报的白屏日志,不仅发现了研发自身代码不当导致的白屏,也有业务侧的投放错误导致的问题,证实此方案确实可行。
接下来,我们的治理方案将会进一步精细化:
逐页面排查上报的案例,定位解决问题
无效的白屏上报:调整误报 case 的关注级别,根据页面路由在告警系统加白若确认问题,在问题处理完成后,针对页面维度,重新调整告警阈值,细化监控规则以适应不同场景的规律
持续监控相关指标,防止治理成果劣化
通过跟进上述措施,相信前端白屏监控能力能有效助力提升用户体验、进一步保障系统稳定性。