关于前端性能监控,你需要知道这些(上)

前言

监控是一套完整的"监视+报警"的系统。对于像我们这样的软件开发者来说,应用性能监控是衡量App的第一道关卡,如果应用的质量不好,会给用户带来最直接的体验伤害。系统上线后,开发者是无法7*24实时获取到用户使用及体验情况的,这时就需要一套优质的监控工具。

一、性能监控的两驾马车

前端性能监控主要分为两种方式:一种叫做合成监控(SYM),另一种叫真实用户监控(RUM)

合成监控

通过第三方工具去模拟目标页面在浏览器中的运行场景,提取一些性能数据指标,得出一个性能审计报告。

合成监控中比较流行的是GoogleLighthouse,我们通过Lighthouse统计一下门店后台首页的性能情况。

真实用户监控

所谓真实用户监控,就是用户在我们的页面上访问,访问之后就会产生各种各样的性能指标,我们在用户访问结束的时候,把这些性能指标上传到我们的日志服务器上,进行数据的提取清洗加工,最后在我们的监控平台上进行可视化的一个过程。

二、性能指标

阶段性指标

如上图所示,描述了从一个页面卸载到新的页面加载完成整个过程,即URL输入到完成发生了什么。

分三个阶段进行划分:

  1. 缓存阶段:包含上一页面卸载Prompt for unload、重定向Redirect、缓存AppCache
  2. 网络阶段:域名查询DNS、网络连接TCP|Request|Response
  3. 浏览器阶段:dom解析、页面加载
字段 描述 计算方式 备注
unload 上一页面卸载耗时 unloadEventEnd - unloadEventStart 如前一页面监听unload事件做数据收集上报,会影响本次页面载入耗时
redirect 重定向耗时 redirectEnd - redirectStart 过多重定向影响性能
appCache 查询缓存耗时 domainLookupStart - fetchStart
DNS DNS解析耗时 domainLookupEnd - domainLookupStart 域名解析耗时,可以通过dns-prefetch预解析提升速度
TCP TCP链接耗时 connectEnd - connectStart
TTFB 网络请求耗时(接收到首字节)即waiting responseStart - requestStart 使用CDN,让站点内容离重点用户更近 www.wanghuiblog.com/post/what-i...
response 数据回包耗时 responseEnd - responseStart 留意后端返回字段必要性
DOM DOM解析耗时 domInteractive - responseEnd
DCL DOMContentLoaded 事件耗时 domContentLoadedEventEnd - domContentLoadedEventStart 完整DOM解析完毕总耗时
resources 资源加载耗时 loadEventStart - domContentLoadedEventEnd 完整DOM(DOMContentLoaded)解析到资源加载完毕(window.onLoad)时间
onLoad onLoad事件耗时 loadEventEnd - loadEventStart

web关键性能指标

字段 描述 计算方式 备注
FP 首次绘制时间/白屏时间 responseEnd - fetchStart 从开始请求到开始解析DOM之间的时间差
FCP 首次内容绘制 domContentLoadedEventEnd - fetchStart 首屏加载时间,可能会跟白屏时间相同
TTI 首次可交互时间 domInteractive - fetchStart DOM完成解析和构建,开始加载资源
ready HTML加载完成时间 domContentLoadedEventEnd - fetchStart 同步JS会影响该耗时,js执行时间为ready-TTI
load 页面加载完毕时间 loadEventStart - fetchStart 全部资源加载完毕、同步js执行完毕总耗时

小程序指标

字段 描述 计算方式 备注
FP/FCP 首次渲染耗时 onShow - onLaunch 小程序从启动到第一个页面onshow钩子执行之间的耗时

兼容性

performance.timing(已废弃)

以上指标都可以通过performance.timing去计算获取,目前在一些旧版浏览器中兼容性较高,但是在W3C Level2中已经废弃了该标准,而提供了更为精准、更为全面的新的性能统计API-PerformanceNavigationTiming

PerformanceNavigationTiming

1、概念

PerformanceNavigationTiming 使用了High-Resolution Time,时间精度可以达毫秒的小数点好几位。可以通过performance.getEntriesByType获取返回指定类型的PerformanceNavigationTiming接口数据。例如:

js 复制代码
performance.getEntriesByType("navigation")[0]
json 复制代码
{
    "name": "https://i.mp.fkw.com/version2/#/tmpMsg/tmpMsgList",
    "entryType": "navigation",
    "startTime": 0,
    "duration": 502.6999999997206,
    "initiatorType": "navigation",
    "nextHopProtocol": "http/1.1",
    "workerStart": 0,
    "redirectStart": 0,
    "redirectEnd": 0,
    "fetchStart": 2.099999999627471,
    "domainLookupStart": 2.099999999627471,
    "domainLookupEnd": 2.099999999627471,
    "connectStart": 2.099999999627471,
    "connectEnd": 2.099999999627471,
    "secureConnectionStart": 2.099999999627471,
    "requestStart": 4.899999999906868,
    "responseStart": 119,
    "responseEnd": 120.89999999990687,
    "transferSize": 11206,
    "encodedBodySize": 10906,
    "decodedBodySize": 60185,
    "serverTiming": [],
    "workerTiming": [],
    "unloadEventStart": 128,
    "unloadEventEnd": 128,
    "domInteractive": 386.89999999990687,
    "domContentLoadedEventStart": 387,
    "domContentLoadedEventEnd": 391.09999999962747,
    "domComplete": 502.59999999962747,
    "loadEventStart": 502.59999999962747,
    "loadEventEnd": 502.6999999997206,
    "type": "reload",
    "redirectCount": 0
}
2、performance.getEntriesByType常用类型
  1. navigation(HTML文档相关指标)
  2. resource(静态资源相关指标,不包含HTML相关信息)
  3. paint(渲染相关指标)
  4. measure(自定义测量、计算指标,常用于打点)

performance.getEntriesByType 返回的是数组,只有准备好的数据才能入组,你可能需要轮询,或找到一个恰当的时间点来上报数据。 新标准,提供了 PerformanceObserver API 来帮你监听相应的资源数据是否准备好了。

下一节来看看如何测量上报相关指标?

相关推荐
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang2 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄4 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、5 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤6 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
AvatarGiser6 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la6 小时前
vue的样式知识点
前端·javascript·vue.js
别忘了微笑_cuicui6 小时前
elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
前端·javascript·elementui