干货:如何十分钟实现一个简单的前端性能、fetch请求实时监控?

干货:如何十分钟实现一个简单的前端性能、fetch请求实时监控?

最近在系统学习分布式微服务架构,最后的技术冲刺前端

今天的文章由于年前一个朋友问题开始:ajax

如何实时监控fetch请求,由于他想写一个谷歌浏览器的插件,实时监控原生fetch请求,众所周知,fetch源码是将原生ajax封装在内的,网上有一种办法是重写fetch,而后达到效果算法

对于这种操做我确定是拒绝的,因而就全面研究了一下前端性能监控,最终仍是找到了办法浏览器


首先要知道performance的API 咱们从最简单的开始 缓存

咱们查看 performance.timing 会获得下面这些数据架构


咱们把上面的这个数据对象,传入到组装数据的函数内部便可:dom

下面都有详细的注释,看代码复制就能用,固然SPA页面的监控可能要定制精细化处理,这里就不详细讲了。前端性能

// 处理数据
function handleData(performance) {
let navigationStart = performance.navigationStart || performance.fetchStart
let performanceData = {}
if (performance) {
// 重定向时间
            performanceData.redirectTime = performance.redirectEnd - performance.redirectStart
// 缓存时间
            performanceData.cacheTime = performance.domainLookupStart - performance.fetchStart
// dns查询时间
            performanceData.dnsTime = performance.domainLookupEnd - performance.domainLookupStart
// tcp握手时间
            performanceData.TcpTime = performance.connectEnd - performance.connectStart
// ajax请求时间
            performanceData.ajaxTime = performance.responseEnd - performance.requestStart
// 开始解析dom时间,此时document.readyState 变为 loading
            performanceData.domLoadingTime = performance.domLoading ? performance.domLoading - navigationStart : null
// dom解析完成时间,此时document.readyState 变为 interactive
            performanceData.domInteractiveTime = performance.domInteractive - navigationStart
// dom解析完成,资源加载完成,脚本完成
            performanceData.domContentLoadedEventEndTime = performance.domContentLoadedEventEnd - navigationStart
// 页面从开始到结束的所有时间时间
            performanceData.loadPageTime = performance.loadEventEnd ? performance.loadEventEnd - navigationStart : null
        }
return performanceData
    }

组装好数据后,在window.onload事件触发时发送:tcp

window.onload = function () {
                let timing = window.performance.timing;
                let performanceData = handleData(timing)
                performanceData.timestamp = Date.now()
                performanceData.url = location.href
                performanceData.from = 'window.performance'
                performanceData = Object.assign({}, performanceData, getPaintTime())
                send(performanceData)
            }

最终上报发送组装好的数据: 分布式


那么问题来了,如何事实监控fetch请求呢?那么一定有事件,并且是观察者模式

这里要用到PerformanceObserver这个API

MDN介绍:PerformanceObserver用于监测性能度量事件,在浏览器的性能时间轴记录下一个新的performance entries 的时候将会被通知 

PerformanceObserver.observe()

指定监测的 entry types 的集合。当 performance entry 被记录而且是指定的 entryTypes 之一的时候,性能观察者对象的回调函数会被调用


咱们在构造调用PerformanceObserver的时候,传入一个函数

perf_observer

制定entryTypes为resource,当咱们发送fetch请求的时候,perf_observer

函数就会被调用

function perf_observer(list, observer) {
console.log(list, observer, 'resource', performance.getEntries())
    }

perf_observer函数:

function perf_observer(list, observer) {
console.log(list, observer, 'resource', performance.getEntries())
}

当发送fetch请求时,看打印结果:

这样每次发送fetch请求,而后咱们打印 performance.getEntries()的结果,就能够看到fetch请求了,固然,这里能够写一个diff算法,缓存一份结果,给每个请求独一无二的key值,每次fetch请求触发perf_observer函数时候,只取出最新的、以前没有的值上报便可

虽然不是什么高深的知识点,但还算比较实用,以为不错能够点个在看,看得懂源码的人会本身去看,看不懂的你写了也不会看。写文章挺尴尬

长按二维码关注咱们

有趣的内容在等你

我的weixin:CALASFxiaotan

相关文章
相关标签/搜索