这是我参与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




















![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)

![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)