网站监控网页内容监测(阿里UC岳鹰全景监控平台如何设计一个通用、低侵入性、自动上报的页面性能监控方案)

优采云 发布时间: 2021-12-11 02:17

  网站监控网页内容监测(阿里UC岳鹰全景监控平台如何设计一个通用、低侵入性、自动上报的页面性能监控方案)

  前言

  前端页面性能是一个非常核心的用户体验指标。本文介绍了阿里UC月影全景监控平台如何设计一个通用的、低侵入性的、自动化的报表页面性能监控解决方案。使用的主要方法是Navigation Timing API 和sendBeacon。

  

  为什么要监控页面性能?

  页面性能不佳会极大地影响用户体验。如果用户打开页面等待的时间过长,他们可能会直接关闭页面甚至不再使用它。这种情况在移动终端上更为明显,移动终端用户对页面响应延迟的容忍度非常低。

  虽然页面性能很重要,但在实际使用中,页面性能不佳的情况并不少见。首先,在产品的迭代演进中,页面性能可能会被忽略,性能会随着版本迭代而衰减;其次,性能优化是一件复杂且具有挑战性的事情,需要明确的优化方向和具体的优化方法,才能快速达到效果。

  所以我们需要一个性能监控系统,对页面的性能进行持续的监控和预警,并在发现瓶颈时指导优化工作。

  了解Navigation Timing API的性能指标

  为了帮助开发者更好的衡量和提升前端页面的性能,W3C性能团队引入了Navigation Timing API,实现页面性能的自动化精准管理;开发者可以通过 window.performance 属性来获取。

  下图是W3C第一版Navigation Timing的处理模型。从当前浏览器窗口卸载旧页面开始,到完成新页面加载,整个过程分为9个小部分:提示卸载旧文档、重定向/卸载、应用缓存、DNS解析、TCP握手、 HTTP请求处理、HTTP响应处理、DOM处理、文档加载完成。将每个小块的开始、结束、中间分为事件,取Unix时间戳,计算两个事件的时间差,从而得到中间过程的时间消耗(精确到毫秒)等级)。

  

  W3C 导航计时级别 1()

  上图为Level 1规格。2012年底进入候选推荐阶段,目前仍在日常使用;但在 W3C 议程上,它已经退却,让位于更高的精度、更强大的功能和更高的级别。Clear Level 2(处理模型如下图所示)。比如独立划分的Resource Timing,可以让我们获取到具体资源的详细耗时信息。

  

  W3C Navigation Timing Level 2() 指标解读

  

  采集页面性能的关键指标

  使用上面的指标,我们可以计算出很多重要的指标,比如首字节时间、页面加载时间、dns查找、连接是否安全等。我们对 Navigation Timing API 提供的指标进行分类。根据从上到下的时间流向,右侧的时刻表示每个指标的起点和终点。例如,重定向时间由redirectEnd-redirectStart 计算。,其他类比。

  

  确定统计的起点(navigationStart vs fetchStart)

  页面性能统计的起始时间应该是用户输入URL并按回车后的时间。一个是通过navigationStart获取,相当于在URL输入栏回车或者按F5刷新页面的时间;另一种是通过fetchStart,相当于浏览器准备好使用HTTP请求获取文档的时间。

  从开发者使用场景的实际分析来看,浏览器重定向和卸载页面的时间消耗对页面加载分析没有太大影响;一般建议使用 fetchStart 作为统计的起点。

  第一个字节

  主文档返回第一个字节的时间是页面加载性能的重要指标。对于用户来说,一般是不知道的。对于开发者来说,这意味着访问网络后端的整体响应时间是耗时的。

  白屏时间

  用户在页面显示上看到元素的时间。很多人认为白屏时间是页面返回的第一个字节时间,但这其实是不准确的,因为头资源还没有加载完,页面也是白屏。

  相对而言,“白屏时间”有统计意义的指标可以是domLoading-fetchStart。这时候页面开始解析DOM树,页面上渲染的第一个元素很快就会出现。

  从W3C Navigation Timing Level 2方案设计,可以直接采用

  

  ,此时页面资源加载完毕,即将进入渲染过程。

  首屏时间

  首屏时间是指页面首屏所有资源全部显示的时间。这对于用户来说是一个非常直接的体验指标,但是对于前端来说,却是一个非常难统计衡量的指标。

  可以使用具有一定意义的指标,

  

  甚至使用

  

  ,此时页面DOM树已经解析完毕,显示内容。

  下面是统计页面性能指标的方法。

  let times = {};

let t = window.performance.timing;

// 优先使用 navigation v2 https://www.w3.org/TR/navigation-timing-2/

if (typeof win.PerformanceNavigationTiming === 'function') {

try {

var nt2Timing = performance.getEntriesByType('navigation')[0]

if (nt2Timing) {

t = nt2Timing

}

} catch (err) {

}

}

//重定向时间

times.redirectTime = t.redirectEnd - t.redirectStart;

//dns查询耗时

times.dnsTime = t.domainLookupEnd - t.domainLookupStart;

//TTFB 读取页面第一个字节的时间

times.ttfbTime = t.responseStart - t.navigationStart;

//DNS 缓存时间

times.appcacheTime = t.domainLookupStart - t.fetchStart;

//卸载页面的时间

times.unloadTime = t.unloadEventEnd - t.unloadEventStart;

//tcp连接耗时

times.tcpTime = t.connectEnd - t.connectStart;

//request请求耗时

times.reqTime = t.responseEnd - t.responseStart;

//解析dom树耗时

times.analysisTime = t.domComplete - t.domInteractive;

//白屏时间

times.blankTime = (t.domInteractive || t.domLoading) - t.fetchStart;

//domReadyTime

times.domReadyTime = t.domContentLoadedEventEnd - t.fetchStart;

  当SPA流行时

  Navigation Timing API 可以监控大部分前端页面的性能。但是,随着SPA模型的盛行和vue、reactjs等框架的普及,页面内容渲染的时机发生了变化,W3C标准不能完全满足原本的监控意义。

  幸运的是,W3C 已经进入了首屏统计的提案阶段。以Chrome为首的浏览器正在打造更能代表用户体验的FP、FCP、FMP指标,并逐渐开放API。

  

  用户体验指标的注意事项

  数据上报方式

  测量完时间后,需要将数据发送到服务器。页面性能统计对丢失率的要求比较低,应该在尽可能不影响主进程逻辑和页面性能的前提下进行性能统计。

  用于获取请求的 img 标签

  var i = new Image();

i.onload = i.onerror = i.onabort = function () {

i = i.onload = i.onerror = i.onabort = null;

}

i.src = url;

  navigator.sendBeacon

  大多数现代浏览器都支持 navigator.sendBeacon 方法。这种方式可以用于发送少量的统计和诊断数据,特别适用于需要统计上报的场景。

  window.addEventListener('unload', logData, false);

function logData() {

navigator.sendBeacon("/log", analyticsData);

}

  最终计划

  当浏览器支持sendBeacon方法时,首选此方法,使用img方法降级报告。

  悦盈-WEB前端监控

  经过一年左右的不断打磨,阿里UC出品的月影WEB前端监控已经对外开放,欢迎大家免费试用。

  进行技术交流,第一时间掌握产品动态,欢迎联系我们~

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线