这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
前言
本篇文章主要是说明如何实现了前端层面的性能指标/错误信息以及定位/资源监控等数据的收集。
为什么要做前端监控?
- 比用户更快的发现问题,并可以快速定位到问题及时修复
- 收集加载/访问指标,为用户体验方向优化提供正确方向
- 对面向用户的网站进行收集用户行为,支撑决策的重要依据
第三方监控服务
有sentry,神策,Fundebug等。
监控的大体流程
- 实现监控sdk可以对性能指标和错误进行监控(收集源)
- 上传接口
- 数据清洗和日志存储
- 报表展示
- 监控报警
后续…
- 问题处理
- 辅助分析
- 外部平台接入
- …..
性能监控
性能监控是指我们写的网页在用户的端上所体现的数据指标
性能监控主要是借助了 window.performance
这个api。处理这个api我们可以获得
- 上一个页面的卸载时间
p.fetchStart - p.navigationStart
- 页面的重定向时间
p.redirectEnd - p.redirectStart
- DNS查找时间
p.domainLookupEnd - p.domainLookupStart
- TCP建联时间
p.connectEnd - p.connectStart
- 网络层面的总耗时
p.connectEnd - p.navigationStart
- chrom发送数据到服务端接收到的时间
p.responseStart - p.requestStart
- 请求数据的用时
p.responseEnd - p.responseStart
- 请求页面的总耗时
p.responseEnd - p.requestStart
- dom的解析时间
p.domComplete - p.domLoading
- loadEvent时间
p.loadEventEnd - p.loadEventStart
- 前端层面的总时间
p.loadEventEnd - p.domLoading
- 页面完全加载时间
p.loadEventEnd - p.navigationStart
- dom开始渲染的耗时
p.domContentLoadedEventStart - p.navigationStart
- 用户操作可被响应的时间
p.domInteractive - p.navigationStart
- 首字节时间
p.responseStart - p.navigationStart
getPerfData: p => {
let data = {
// 网络建联
prevPage: p.fetchStart - p.navigationStart, // 上一个页面的卸载时间
redirect: p.redirectEnd - p.redirectStart, // 重定向时间, 两个网页非同域则为0
dns: p.domainLookupEnd - p.domainLookupStart, // DNS查找时间
connect: p.connectEnd - p.connectStart, // TCP建联时间
network: p.connectEnd - p.navigationStart, // 网络总耗时, 前面的加起来
// 网络接收
send: p.responseStart - p.requestStart, // 前端从发送到接收的时间
receive: p.responseEnd - p.responseStart, // 请求数据用时
request: p.responseEnd - p.requestStart, // 请求页面的总耗时
// 前端渲染
dom: p.domComplete - p.domLoading, // dom解析时间
loadEvent: p.loadEventEnd - p.loadEventStart, // loadEvent时间
frontend: p.loadEventEnd - p.domLoading, // 前端总时间
// 关键阶段
load: p.loadEventEnd - p.navigationStart, // 页面完全加载时间
domReady: p.domContentLoadedEventStart - p.navigationStart, // dom准备时间, 白屏时间
interactive: p.domInteractive - p.navigationStart, // 可操作时间,用户的点击可以被响应了
ttfb: p.responseStart - p.navigationStart // 首字节时间
}
return data
}
复制代码
- 当 performance.timing.domComplete 完成则说明dom已经加载完成,我们可以向服务端上报数据了
// 监测dom加载完成
let runCheck = () => {
if (performance.timing.domComplete) {
// 如果监测到dom解析完成,则停止循环监测,运行callback
clearTimeout(timer)
getPerfData(window.performance.timing) //得到性能指标
perfData.type = 'domready'
callback(perfData)
isDOMReady = true
} else {
// 再去循环检测
timer = setTimeout(runCheck, 100)
}
}
复制代码
- 当performance.timing.loadEventEnd 完成则说明页面加载完成,我们可以向服务端上报数据了
let runCheck = () => {
if (performance.timing.loadEventEnd) {
// 这个可以判断dom加载完成了
// 如果监测到dom解析完成,则停止循环监测,运行callback
clearTimeout(timer)
getPerfData(window.performance.timing) //得到性能指标
perfData.type = 'onload'
callback(perfData)
isOnload = true
} else {
// 再去循环检测
timer = setTimeout(runCheck, 100)
}
}
复制代码
性能的一些指标
字段 | 描述 | 备注 |
---|---|---|
FP | First Paint(首次绘制) | 包括了任何用户自定义的背景绘制,它是首先将像素绘制到屏幕的时刻 |
FCP | First Content Paint(首次内容绘制) | 是浏览器将第一个 DOM 渲染到屏幕的时间,可能是文本、图像、SVG等,这其实就是白屏时间 |
FMP | First Meaningful Paint(首次有意义绘制) | 页面有意义的内容渲染的时间 |
LCP | (Largest Contentful Paint)(最大内容渲染) | 代表在viewport中最大的页面元素加载的时间 |
DCL | (DomContentLoaded)(DOM加载完成) | 当 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,无需等待样式表、图像和子框架的完成加载 |
L | (onLoad) | 当依赖的资源全部加载完毕之后才会触发 |
TTI | (Time to Interactive) 可交互时间 | 用于标记应用已进行视觉渲染并能可靠响应用户输入的时间点 |
FID | First Input Delay(首次输入延迟) | 用户首次和页面交互(单击链接,点击按钮等)到页面响应交互的时间 |
参考文章
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END