前端性能监控的基本介绍这是我之前在我们团队中做的一次分享,很多地方写的比较简单,就是抛砖引玉,大致讲解下前端性能监控的基本思路。 服务上线,才是万里长征的第一步,我们还要根据收集到性能收据和业务数据,进行后续的调整和优化。 web 的性能一定程度上影响了用户留存率,用户各种情况不确定,诸如网络情况,机型,浏览器版本等,或者项目本身的迭代更新。不可能每一项在本地测试过程中,都能覆盖的到。而且,随着版本的迭代,有的指标会发生变化。若没有监控,线上的一切情况对我们来说就是一个黑盒。 因此这里需要一个性能监控系统,监控和预警页面的性能,并且能在发现瓶颈的时候来进行优化。 我们可转化为三个方面来看:响应速度、页面稳定性、外部服务调用 我们在上面分成了三部分来监控,每项细分的话,主要有: 比如首屏渲染耗时的计算,根据渲染方式的不同,计算方法也不一样。若采用服务端渲染的,只需要在恰当的位置打点就行。但若采用的是前端渲染,则计算方法就复杂的多。 性能指标可以通过 performance 来获取。 html 页面的数据,如 ttfb,白屏时间等,可以通过 performance.timing 来获取。 其他的如 js\css\img 等资源,可以通过 performance.getEntries() 来获取。 被动捕获的全局错误。 主动输出的错误: 注意,使用 一般是劫持发送请求的方法,然后埋上自己的监控代码。 以 XMLHttpRequest 为例,我们要监听的是他的方法,而不是这个类。 fetch 方法同理: 我们依照的原则是: 给到开发者的都是一些可选的配置,如: 有三种方式,主要是前 2 种。 其实要说 sendBeacon() 的兼容性,目前也算还可以,大部分主流浏览器都是满足的:sendbeacon 的兼容性。 有些 sdk 为了避免多次高频的数据上报,也会先在本地积攒一定的数量或时间后,再统一进行上报。 数据上报之后,主要是进行 3 个过程: 对一些不规范或缺失的数据,进行补全或剔除。 从原始的数据中分析出页面的性能和错误率后,需要在某一个平台上进行展示和过滤,方便我们前端开发者可以定位问题。 同时,为了及早发现错误,也需要配置相应的告警机制。告警策略也分很多种,如: 告警提示的样例,随便找了张图: 在实际的实现过程中,就要复杂的很多,要考虑的因素也更多。就现在市面上的各种前端监控系统,着重点也不一样,支持的平台也不一样。 比如我曾经使用过的 RUM(之前叫 Aegis),支持的功能就比较多,更多是在前端领域。我摘抄一下RUM 官方的介绍: 前端性能监控(Real User Monitoring,RUM)是一站式前端监控解决方案,专注于 Web、小程序等场景监控。前端性能监控聚焦用户页面性能(页面测速,接口测速,CDN 测速等)和质量(JS 错误,Ajax 错误等),并且联动腾讯云应用性能观测实现前后端一体化监控。用户只需要安装 SDK 到自己的项目中,通过简单配置化,即可实现对用户页面质量的全方位守护,真正做到低成本使用和无侵入监控。 但我后来了解到的 Sentry,它是更聚焦在错误日志收集和全链路追踪上,支持前端 js、Node.js、Python、Go 等各种语言环境。如每条的错误信息,除了一些全局数据(如浏览器版本等),还有收集发生该错误前的一些接口请求、console 日志输出和用户的点击行为等,方便我们可以尽可能的还原现场。同时,还对每条的 xhr 请求添加 trace 等请求头参数,便于追踪该请求的整条链路的处理。1. 性能监控的目的、意义 #
2. 监控什么指标? #
2.1 性能指标 #
2.2 各种错误 #
2.3 第三方系统的数据 #
2.4 公共指标 #
3. 怎么监控这些指标 #
3.1 性能指标 #
3.2 各种错误 #
window.addEventListenter("error", (event) => {
upload("error", event);
});
// 未捕获的 reject 错误
window.addEventListenter("unhandledRejection", (event) => {
upload("unhandledRejection", event);
});
const originalError = console.error;
console.error = (...rest) => {
originalError(...rest);
upload("console.error", ...rest);
};
throw
抛出的错误,会被 onerror 捕获。3.3 监控接口的数据 #
const originalSend = XMLHttpRequest.prototype.send;
const originalOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function (method, url, ...rest) {
originalOpen.call(this, method, url, ...rest);
};
XMLHttpRequest.prototype.send = function (data) {
this.startTime = Date.now();
const { onloadend, ontimeout } = this;
this.onloadend = function () {
onloadend();
};
this.ontimeout = function () {
ontimeout();
};
originSend.call(this, data);
};
const originalFetch = window.fetch;
window.fetch = function (...rest) {
const startTime = Date.now();
return originalFetch(...rest).then((response) => {
upload("fetch", response);
return response;
});
};
4. 上报哪些数据 #
5. 如何上报这些数据 #
优点
缺点
创建 img 图片
方式简单,可跨域,兼容性好
数据量有限制
xhr 的 post 请求
数据大小没有限制
需特殊处理跨域限制
navigator.sendBeacon
页面卸载前上报数据避免丢失
兼容性一般
6. 上报之后 #
6.1 数据清洗 #
6.3 展示和告警 #
7. 总结 #
版权属于:
加速器之家
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
评论