前端错误监控
前端错误监控
type
status
date
slug
summary
tags
category
icon
password
Blocking
Blocked by
top
URL
Sub-item
Parent item

自研监控优势

为什么不直接用 sentry 私有化部署,而选择自研前端监控?
这是优先要思考的问题,sentry 作为前端监控的行业标杆,有很多可以借鉴的地方
相比 sentry,自研监控平台的优势在于:
1、可以将公司的 SDK 统一成一个,包括但不限于:监控 SDK、埋点 SDK、录屏 SDK、广告 SDK 等
2、提供了更多的错误还原方式,同时错误信息可以和埋点信息联动,便可拿到更细致的用户行为栈,更快的排查线上错误
3、监控自定义的个性化指标:如 long task、memory 页面内存、首屏加载时间等。过多的长任务会造成页面丢帧、卡顿;过大的内存可能会造成低端机器的卡死、崩溃
4、统计资源缓存率,来判断项目的缓存策略是否合理,提升缓存率可以减少服务器压力,也可以提升页面的打开速度
5、提供了  采样对比+ 轮询修正机制  的白屏检测方案,用于检测页面是否一直处于白屏状态,让开发者知道页面什么时候白了,具体实现见 前端白屏的检测方案,解决你的线上之忧

指标

性能监控

字段
描述
计算公式
备注
FP
首次绘制
responseEnd - fetchStart
将第一个像素点绘制到屏幕的时刻
FCP
首次内容绘制
First Content Paint
首次内容绘制是浏览器将第一个 DOM 渲染到屏幕的时间,可以是任何文本、图像、SVG 等的时间;
FMP
首次有意义绘制
First Meaningful paint
首次有意义绘制是页面可用性的量度标准;
TTI
首次可交互时间
domInteractive - fetchStart
浏览器完成所有HTML解析并且完成DOM构建,此时浏览器开始加载资源。
DomReady
HTML加载完成时间也就是 DOM Ready 时间。
domContentLoadEventEnd - fetchStart
单页面客户端渲染下,为生成模板dom树所花费时间;非单页面或单页面服务端渲染下,为生成实际dom树所花费时间'
Load
页面完全加载时间
loadEventStart - fetchStart
Load=首次渲染时间+DOM解析耗时+同步JS执行+资源加载耗时。
FirstByte
首包时间
responseStart - domainLookupStart
从DNS解析到响应返回给浏览器第一个字节的时间
卡顿
指超过 50ms 的长任务,具体的指标可以根据页面的内容进行调节,一般 50ms 人眼就能感觉到卡顿。
耗时监控
字段
描述
计算公式
备注
DNS
DNS查询耗时
domainLookupEnd - domainLookupStart
如果使用长连接或本地缓存,则数值为0
TCP
TCP连接耗时
connectEnd - connectStart
如果使用长连接或本地缓存,则数值为0
SSL
SSL安全连接耗时
connectEnd - secureConnectionStart
只在HTTPS下有效,判断secureConnectionStart的值是否大于0,如果为0,转为减connectEnd
TTFB
请求响应耗时
responseStart - requestStart
TTFB有多种计算方式,相减的参数可以是 requestStart 或者 startTime
Trans
内容传输耗时
responseEnd - responseStart
DOM
DOM解析耗时
domInteractive - responseEnd
Res
资源加载耗时
loadEventStart - domContentLoadedEventEnd
表示页面中的同步加载资源。

行为监控

  • PV、UV量,日同比、周同比等。能清晰的明白流量变化。
  • 用户热点页面、高访问量TOP10
  • 设备、浏览器语言、浏览器、活跃时间段等的用户特征
  • 用户的行为追踪:某个用户,进入了网站后的一系列操作或者跳转行为;
  • 用户自定义埋点上报用户行为:想做一些自定义事件的监听,比如播放某个视频的行为动作。
  • 多语种站点,每个语种的用户量
 

错误监控

Error类型

类型
含义
说明
SyntaxError
语法错误
语法错误
ReferenceError
引用错误
常见于引用了一个不存在的变量: let a = undefinedVariable;
RangeError
有效范围错误
数值变量或参数超出了其有效范围。 常见于 1.创建一个负长度数组 2.Number对象的方法参数超出范围:let b = new Array(-1)
TypeError
类型错误
常见于变量或参数不属于有效类型 let foo = 3;foo();
URIError
URL处理函数错误
使用全局URL处理函数错误,比如 decodeURIComponent('%');

错误监控采集

window.addEventListener('error') :监听JS代码异常
window.onerror :监听资源加载异常
xhr.addEventListener('error') :监听请求异常等
window.addEventListener('unhandledrejection') : 监听未被捕获的 Promise 错误

框架自带的错误监控

react:errorBounry

监控白屏

白屏就是页面上什么东西也没有,在页面加载完成之后,如果页面上的空白点很多,就说明页面是白屏的,需要上报,这个上报的时机是:document.readyState === 'complete' 表示文档和所有的子资源已完成加载,表示 load(window.addEventListener('load') )状态事件即将被触发。
document.readyState 有三个值:loading(document 正在加载),interactive(可交互,表示正在加载的状态结束,但是图像,样式和框架之类的子资源仍在加载),complete 就是完成,所以监控白屏需要在文档都加载完成的情况下触发。
监控白屏的思路主要是:可以将可视区域中心点作为坐标轴的中心,在 X、Y 轴上各分 10 个点,找出这个 20 个坐标点上最上层的 DOM 元素,如过这些元素是包裹元素,空白点数就加一,包裹元素可以自定义比如 Html Body App Root Container Content 等,空白点数大于 0 就上报白屏日志。

监控卡顿

用户交互的响应时间如果大于某一个时间,用户就会感觉卡顿。可以定一个时间比如 100 毫秒,就代表响应时间长,会卡顿。
PerformanceObserver 构造函数使用给定的观察者 Callback 生成新的 PerformanceObserver 对象,当通过 Observe () 方法注册条目类型(需要监控的类型)的性能条目被记录下来时,会调用该观察者回调。
所以可以 new PerformanceObserver 来监控 longTask,监控的资源加载如果超过 100 毫秒就表示卡顿,可以浏览器空闲(requestIdleCallback)的时候上报数据。
 

如何计算首屏时间、白屏时间

计算首屏时间和白屏时间的主要方法有:
  1. 使用 Navigation Timing API
  • navigationStart:准备请求页面的时刻
  • responseStart:收到第一个字节的时刻
  • responseEnd:收到最后一个字节的时刻
  • domInteractive:DOM 被解析完成的时刻
  • domContentLoadedEventEnd:DOM 被完全加载的时刻
首屏时间 = domContentLoadedEventEnd - navigationStart
白屏时间 = responseEnd - navigationStart
  1. 使用 Performance API
  • performance.getEntriesByName('navigation')[0].responseEnd
  • performance.timing.domContentLoadedEventEnd
首屏时间 = domContentLoadedEventEnd - responseEnd
  1. 通过前端 JavaScript 检测
监听 DOMContentLoaded 事件,记录时间。白屏时间通过检查 body/html 标签可见性实现。
  1. 使用MutationObserver
    1. body
    2. 区域稳定的时间点

性能指标

PerformanceObserver.observe 方法用于观察传入的参数中指定的性能条目类型的集合。当记录一个指定类型的性能条目时,性能监测对象的回调函数将会被调用。performance.timing 记录了从输入 URL 到页面加载完成的所有的时间,从这些字段中可以提取对对页面性能的监控,通过分析这些指标来优化页面的体验,比如统计 FMP、LCP 等,具体可以查看 MDN。

统计 pv (页面的停留时间)

navigator.connection 对象获取网络连接的信息:effectiveType(网络类型),RTT(估算饿往返时间)等,还能通过监听 window.addEventListener ('unload') 事件计算用户在页面的停留时间

上报首屏时间

入库、分析

 
关于react 的状态管理封装库实现原理总结(wip)
Loading...