Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【前端监控】静态资源测速&错误上报

【前端监控】静态资源测速&错误上报

作者头像
神仙朱
发布于 2021-09-09 07:00:56
发布于 2021-09-09 07:00:56
4.7K00
代码可运行
举报
运行总次数:0
代码可运行

小东西快快学快快记,大知识按计划学,不拖延

继续监控内容总结,今天总结的是前端如何监控静态资源的加载情况,并进行数据上报

本文分为3个部分

1、监控静态资源重要性

2、静态资源测速上报

3、静态资源出错上报

静态资源监控重要性

一个页面的加载快慢,最重要的指标就是静态资源的加载速度了吧。你拼了命得对代码进行优化几十ms,结果静态资源一个不爽就给你耗了几百ms。

所以监控页面静态资源加载情况是十分有必要的。让我们更加全面评估页面的健康情况。

当应用静态资源加载总是缓慢或者出错,会进行告警,这时候马上去排查,是 cdn出了问题还是 资源有问题,就可以减少问题影响时间

静态资源缓慢和失败可是会直接影响用户体验和留存的

庆幸有监控的例子

之前我们上线了一个活动,我们自己验证没有问题。过了一会,静态资源告警就来了,原来是中国移动网络下,该cdn加载有问题,导致图片都加载不出来,所以我们才紧急切换cdn又发布了一版。

如果没有告警,我们哪里会知道什么鬼网络下会出现什么鬼异常。

什么中国移动,联通,电信,铁通,长城一堆网络,又不可能一个个去看,一个个看还存在偶然性。

而且说不定下次不是网络问题了,是xxxx偏门手机资源加载出错,那你可没有办法了吧

你想想如果没有资源告警,难道需要等用户来告诉你吗,想多了,人直接划走了。我淘宝买东西出问题都懒得和商家说…

监控什么静态资源

js , css , 图片,字体,video,audio

静态资源测速上报

1基本原理

这里我们会使用 performance.getEntries() ,它可以获取到页面所有的静态资源和接口请求

我们这次是为了处理静态资源,所以可以使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
performance.getEntriesByType('resource')

来过滤得到页面的静态资源,如js css img 等

对于单个资源,我们能获取到的信息是这些

根据上面的这些信息,我们可以清楚页面的加载情况

但是需要注意的是

使用 performance.getEntries() 获取资源的时候,可能并不能一下子拿到页面所有的资源,因为资源请求也不是一次性加载完的,就像懒加载的图片

所以我们还需要监听资源的动态载入

具体我们会使用 PerformanceObserver 对资源进行监听。

下面我们看一下这个api的使用例子,我们动态插入一个js,看是否能监听到如下

可以看到木有任何问题

兼容性

可以看到这比我们使用了两个api,来看下他们的兼容性

可以看到 PerformanceObserver 比 getEntries 兼容性差一些。ie全线不支持

2上报什么数据

除了我们会上报getEntris 中拿到的这些数据

我们还需要上报

3问题一览

虽然我们现在以这两个api 可以完成我们的功能,但是仍然存在一些问题需要解决

1、IE 对 PerformanceObeserver 完全不支持

那要怎么办,不管ie 了吗

当然不是

我们会使用一个定时器,循环定时3秒去手动获取资源

performance.getEntries()

这时候有个问题,循环 getEntries(),那不是每次循环获取到的资源有重复的吗??

是的,所以我们在其中加入了一个 资源截取标记位,表示当前已经收集的资源的长度

因为getEntries 获取到的资源列表顺序是一直固定的,所以每次我们调用一次getEntries,就可以把当前已经截取到的位置存起来,下次从这个位置后开始截取

比如这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let currentResLen = 0;
setInterval(() => {
 const entrys = performance.getEntriesByType('resource');

  const currentRes = entrys.slice(currentResLen);

 currentResLen += currentRes.length;
},300);

2、浏览器保存资源数据有限

浏览器保存的资源信息是有大小限制的,超过一定数量,剩下的资源就算加载,也不会被记录。performance.getEntries() 就获取不到了。

比如在 chrome 中,最大缓冲资源数是 250个,超过这个数目后,资源无法被记录。

比如我加载了500张图片

使用 getEntries 获取资源的时候,只获取到了 250个

所以我们需要及时清除缓冲区

具体做法是

对缓冲区进行监听,当缓冲区满了之后,就清空资源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
performance.onresourcetimingbufferfull = () => {
   performance.clearResourceTimings();
};

但是直接清空是有一定风险的,如果其他开发者想在页面想获取资源,发现死活获取不到,又不知道你这里的清空逻辑,就会困扰到别人....

所以这里清空缓存的时候,最好在控制台输出一些信息,用于提示开发者

另外前面我们说的,我们会有一个 资源截取标记位,用于记录已经截取的资源数量长度

这里清空缓存区的时候,标志位也要相应重置

3、无法判断资源成功失败

从 performance.getEntries 获取的资源列表中,无法判断资源是否加载成功失败

我们这部分只负责上报 资源的 加载速度,错误的资源不应该包含在内,所以需要剔除发生错误的资源。

错误的资源,我们会另外处理

现在可以知道的是

发生错误的 script 和 link 标签,并不会出现在在 getEntries 获取的资源列表中

但是 img 错误,仍然会出现在其中,如果不处理,会导致错误图片误报成功的情况

所以这里的处理是,对错误图片缓存起来,使用 getEntries 获取到资源列表的时候,把错误的图片过滤就可以了

怎么拿到错误的图片呢

1、获取已经加载的错误图片(可能在我们获取资源之前已经加载错误了)

2、监听全局错误事件,拿到错误的图片

具体逻辑做法如下

这里的图片处理逻辑 和我另一篇文章一样,大家可以参考一下,图片错误重载

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const ErrImgList = [];

// 监听动态的图片错误
function watchImgError(params) {
 window.document.addEventListener(
   'error',
   (event) => {
     const target = event.target
     const url = target.src

     // 发生错误的图片存起来,因为错误的也会放在 entries 中,用来过滤
     if (target.nodeName === 'IMG') {
       ErrImgList.push(url);
     }
   },
   true // 设置为 true 表示捕获
 );
}

// 处理已经加载错误的图片
function observeStatic() {
 document.querySelectorAll('img').forEach((node) => {
   const lazySrc =
     node.getAttribute('data-src') || 
     node.getAttribute('lazy-src');

   if (!lazySrc) {
      // 加载完成 complete = true,naturalWidth=0 表示图片没高度,那就是加载失败
     if (element.complete && element.naturalWidth === 0) {
       ErrImgList.push(node.src);
     }
   }
 });
}

function reportResource(params) {
 performance.getEntries().forEach((entry) => {
   const { name } = entry;

   //   错误的图片不上报测速
   if (ErrImgList.indexOf(name) > -1) {
     return;
   }

   // 上报资源测速数据
 });
}

4什么时候上报数据

1、window.onload 上报

window.onload() 会在页面完全载入(包括静态资源完成)后触发,所以在这里可以上报一波

2、监听资源加载 再逐个上报

前面总体上报了一波之后,动态增加的资源,可以动态单个上报

5基本流程

可能画得不太规范,但是样子大概是这样

静态资源出错上报

上面我们对资源的加载速度数据进行了上报,我们还需要对错误的资源进行上报

因为 速度 和 错误 不是一个维度的数据,所以我们需要分开上报

1基本原理

使用全局监听错误事件,并设置 第三个参数 为 true,表示捕获,可以捕获到 页面中资源加载错误的情况

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window.addEventListener('error',error,true)

拿到的错误信息如下

之前监听图片错误用于剔除资源测速上报,就是插在这里处理的,并不会监听两次。

2上报什么数据

错误上报的数据就不像 加载速度那样那么多,基本是下面三个

什么时候上报

监听错误事件回调内进行上报

3基本流程

代码参考

https://gitee.com/hoholove/study-code-snippet/blob/master/LOGGER/assetSpeed.js

最后

资源上报我们就已经总结完了,总体不难,就大概用两个api,但是其中还是会涉及兼容和优化的处理细节,总体来说难度不大

鉴于本人能力有限,难免会有疏漏错误的地方,请大家多多包涵, 如果有任何描述不当的地方,欢迎后台联系本人,领取红包

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 神仙朱 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
腾讯前端团队是如何做web性能监控的?
也许你有听过一个问题,你这款 web 应用性能怎么样呀?你会回答什么呢?是否会优于海量 web 应用市场呢?本文就来整理下如何进行 web 性能监控?包括我们需要监控的指标、监控的分类、performance 分析以及如何监控。
zz_jesse
2020/06/24
7.8K0
腾讯前端团队是如何做web性能监控的?
【前端监控】单页应用首屏测速
前端监控系列,SDK,服务、存储 ,会全部总结一遍,写文不易,希望给最后点个赞鼓励鼓励
神仙朱
2021/09/09
1.8K0
【前端监控】单页应用首屏测速
前端性能监控(RUM)
简介 腾讯云前端性能监控 (RUM) 是一站式前端监控解决方案,用户只需要安装 sdk 到自己的项目中,通过简单配置化,即可实现对用户页面质量的全方位守护,真正做到了低成本使用和无侵入监控。前端性能监控专注于 Web,小程序等大前端领域,主要关注用户页面性能(页面测速,接口测速,CDN 测速等)、质量(JS 错误,Ajax 错误等),并且通过联动腾讯云应用性能监控实现对前后端监控一体化的打通。 点击文末"阅读原文" 立即申请体验 RUM。 为什么要有前端监控 作为一名前端开发者,想必你一定遇到过这些
腾讯云可观测平台
2021/07/16
3K0
从0到1搭建前端监控平台,面试必备的亮点项目
常常会苦恼,平常做的项目很普通,没啥亮点;面试中也经常会被问到:做过哪些亮点项目吗?
前端老道
2023/02/27
3.7K0
从0到1搭建前端监控平台,面试必备的亮点项目
【性能】198-腾讯新闻前端团队:深入理解前端性能监控
https://segmentfault.com/a/1190000018785911
pingan8787
2019/07/23
1.7K0
【性能】198-腾讯新闻前端团队:深入理解前端性能监控
前端埋点数据收集及上报方案
埋点,它的学名是事件追踪(Event Tracking),主要是针对特定用户行为或业务过程进行捕获、处理和发送的相关技术及实施过程。埋点是数据领域的一个专业术语,也是互联网领域的一个俗称。
落落落洛克
2021/10/12
7K0
一文搞懂得物前端监控
得物的服务端监控是比较全面和有效的,除了上报原始日志数据,还通过数据分析制定线上告警机制,调用链路分析,而针对前端项目这一块,还是不够全面的。对前端线上问题感应不及时,靠人肉发现,没有告警机制等问题,所以就有个前端监控这个项目。前端监控也确实很有必要,我们需要对线上的页面有个全面的把控,而至于怎么做监控,做数据上报,以及数据分析,如何针对监控数据分析出有用的核心链路的告警等也能有个全面的认识。本文主要是介绍得物针对监控做了哪些事情以及对前端底层监控手段做个总结。
得物技术
2023/12/13
7950
一文搞懂得物前端监控
从零开始搭建前端数据监控系统(二)-前端性能监控方案调研
1. 业界案例 目前前端性能监控系统大致为分两类:以GA为代表的代码监控和以webpagetest为代表的工具监控。 代码监控依托于js代码并部署到需监控的页面,手动计算时间差或者使用浏览器的的API进行数据统计。 影响代码监控数据的因素有以下几种: 浏览器渲染机制; 浏览器对API的实现程度,比如performance API; 工具监控不用将统计代码部署到页面中,一般依托于虚拟机。以webpageTest为例,输入需统计的url并且选择运行次url的浏览器版本,webpageTest后台虚拟机对url进
寒月十八
2018/01/30
2.6K0
从零开始搭建前端数据监控系统(二)-前端性能监控方案调研
应用性能前端监控,字节跳动这些年经验都在这了
随着用户数量的不断增长,对于站点体验衡量的的需求也日益紧迫,用户会将产品和他们每天使用的体验最好的 Web 站点进行比较。想着手优化,则必须先有相关的监控数据,才能对症下药。
ssh_晨曦时梦见兮
2022/03/07
1.3K0
应用性能前端监控,字节跳动这些年经验都在这了
前端监控 SDK 的一些技术要点原理分析
本文要讲的就是其中的第一个环节——数据采集与上报。下图是本文要讲述内容的大纲,大家可以先大致了解一下:
谭光志
2022/03/24
2.4K0
前端监控 SDK 的一些技术要点原理分析
目前为止整理最全的前端监控体系搭建篇(长文预警)
PV(page view) 是页面浏览量,UV(Unique visitor)用户访问量。PV 只要访问一次页面就算一次,UV 同一天内多次访问只算一次。
前端达人
2022/04/18
12.6K1
目前为止整理最全的前端监控体系搭建篇(长文预警)
超全对照!前端监控的性能指标与数据采集
导语 | 前端监控可以让你更了解自己的网站,更早地发现和解决存在的问题,再通过优化来提升网站的性能和体验。那么,如何衡量一个网站的好坏?有什么指标?性能数据如何采集?本文围绕这些问题和你一起探讨。 一、为什么要做前端性能监控 可能你也有过这样的经历: 有用户反馈你的网站很慢,然后你立马紧张地在浏览器上打开用户反馈的网站。经过检查,可能你的网站一切正常,也可能你的网站真的很慢,甚至打不开了。 有一天老板问你:“咱们的网站性能体验怎么样?”你该如何回答?“挺好的,很快,这个月没有发生过故障....”老板再
腾讯云开发者
2021/06/02
4.2K0
现代浏览器观察者 Observer API 指南
想要计算Web页面的元素的位置,非常依赖于DOM状态的显式查询。但这些查询是同步的,会导致昂贵的样式计算开销(重绘和回流),且不停轮询会导致大量的性能浪费。
前端劝退师
2019/10/28
4.5K0
现代浏览器观察者 Observer API 指南
面试必问——前端页面性能指标基本介绍
导语 | 面试的时候问页面性能有哪些指标,却经常得到合并文件、压缩资源等优化手段的答案,是时候整体盘一下“性能指标”了。 1. 基本指标介绍 首先前端性能指标一般分为以下几种: 首屏绘制(First Paint,FP) 首屏内容绘制(First Contentful Paint,FCP) 可交互时间(Time to Interactive,TTI) 最大内容绘制(Largest Contentful Paint,LCP) 首次有效绘制(First Meaning Paint, FMP) FP 是时间线上的第
用户1097444
2022/06/29
3.6K0
面试必问——前端页面性能指标基本介绍
Web页面性能优化——前端监控监控
本文分为接入前端性能监控、使用前端性能监控、性能优化三部分,可以通过目录跳转到对应的部分浏览。
Im小泽
2023/09/12
1.1K0
干货:如何十分钟实现一个简单的前端性能、fetch请求实时监控?
如何实时监控fetch请求,因为他想写一个谷歌浏览器的插件,实时监控原生fetch请求,众所周知,fetch源码是将原生ajax封装在内的,网上有一种办法是重写fetch,然后达到效果
Peter谭金杰
2020/05/09
1.4K0
干货:如何十分钟实现一个简单的前端性能、fetch请求实时监控?
前端性能优化之谈谈常见的性能指标及上报策略
性能优化是所有前端人的追求,在这条路上,方法多种多样。这篇文章,说一下可以怎样定义性能指标及上报。
winty
2020/05/01
2.9K0
前端性能优化之自定义性能指标及上报方法详解
性能优化是所有前端人的追求,在这条路上,方法多种多样。这篇文章,说一下利用浏览器的一些API,可以怎样进行自定义性能指标及上报。
winty
2020/02/13
1.4K0
前端性能优化之自定义性能指标及上报方法详解
Performance API不完全使用指北
使用浏览器的DevTools来评估web应用性能是很有用的,但要复现现实世界的使用情况并不容易。因为人们在不同地点使用不同的设备、浏览器和网络,都会有不同的体验。
chuckQu
2023/02/13
1.1K0
Performance API不完全使用指北
你的函数有多快?使用 performance 监控前端性能
要比较两个函数哪个性能更好,一个直观且公平的方法就是计算两个函数分别执行完的时间。
前端小智@大迁世界
2020/07/23
1.7K0
你的函数有多快?使用 performance 监控前端性能
推荐阅读
相关推荐
腾讯前端团队是如何做web性能监控的?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验