监控目标
稳定性【stability】 | 错误名称 | 描述 | | —- | —- | | js报错 | js执行错误或promise异常 | | 资源resource报错 | script或者link资源加载异常 | | 接口报错 XMLHttpRequest | ajax或者fetch接口异常 | | 白屏 | 页面没有绘制出元素 |
用户体验【experience】 | 错误名称 | 备注 | | —- | —- | | 加载时间 | 各个阶段的加载时间 | | TTFB(time to first byte) | 首字节时间 | | FP(First Paint) | 首次绘制 | | FCP(First Content Paint) | 首次内容绘制 | | FMP(First Meaningful Paint) | 首次有意义绘制 | | L(load) | 加载时间 | | LCP(load Content Paint) | 内容加载完成 | | 卡顿 | 超过50ms的长任务 |
业务指标【business】 | 名称 | 备注 | | —- | —- | | PV | page view 页面浏览量或点击量 | | UV | 访问站点的不同IP地址的人数 | | 页面停留时间 | 用户在页面停留时间 |
监控流程
- 数据埋点
- 数据采集/上报
- 数据分析
- 可视化展示
- 监控报警
埋点方案
- 代码埋点
- 以嵌入代码的形式进行埋点。比如监控用户的点击事件,在用户点击时插入一段代码,保存这个监听行为的各种数据,并发送给服务器
- 优点:可以在任意时刻,精确的发送或保存所需要的数据信息
- 缺点是工作量大
- 可视化埋点
- 通过可视化交互的手段,代替代码埋点
- 将业务代码和埋点代码分离,提供一个可视化交互的页面,输入为业务代码。通过可视化系统可以在业务代码中自定义增加埋点事件。
- 可视化埋点是用系统代替手工插入埋点代码。
无痕埋点
- 前端的任意一个事件被绑定一个标识,所有事件都被记录下来
- 通过定期上传记录文件,配合文件解析,
监控采集脚本
阿里云日志服务,开通sls日志服务。日志服务(SLS)是云原生观测分析平台,为Log/Metric/Trace等数据提供大规模、低成本、实时平台化服务。一站式提供数据采集、加工、分析、告警可视化与投递功能,全面提升研发、运维、运营和安全等场景数字化能力。
日志服务帮助文档
web Tracking
putWebTracking
监控错误
错误分类
js错误
- promise错误
- 资源错误
数据结构设计
jsError
promiseError{
"title": "前端监控系统",
"url": "http://localhost:8000",
"timestamp": "1523223",
"useAgent": "Chrome",
"kind": "stability",
"type": "error",
"errorType": "jsError",
"message": "Uncaught TypeError: Cannot set properties of undefined (setting 'error')",
"filename": "http://localhost:8000/",
"position": "0:0",
"stack": "errorClick (http://localhost:8000/:22:30)^HTMLInputElement.onclick (http://localhost:8000/:12:68)",
"selector": "html body div#container div.content input"
}
{
"title": "前端监控系统",
"url": "http://localhost:8000",
"timestamp": "1523223",
"useAgent": "Chrome",
"kind": "stability",
"type": "error",
"errorType": "promiseError",
"message": "Cannot set properties of undefined (setting 'error')",
"filename": "http://localhost:8000/",
"position": "0:0",
"stack": "http://localhost:8000/:26:34^new Promise (<anonymous>)^promiseErrorClick (http://localhost:8000/:25:9)^HTMLInputElement.onclick (http://localhost:8000/:17:11)",
"selector": "html body div#container content input"
}
接口异常采集脚本
数据设计
{
"title": "前端监控系统",
"url": "http://localhost:8000",
"timestamp": "1523223",
"useAgent": "Chrome",
"kind": "stability",
"type": "xhr",
"errorType": "load",
"path": "/success",
"status": "200-ok",
"duration": "7",
"response": "{'ok'}",
"params": ""
}
白屏时长
白屏时间过长,会造成不好的用户体验。白屏就是页面上什么都没有
数据结构
{
"title": "前端监控系统",
"url": "http://localhost:8000",
"timestamp": "1523223",
"useAgent": "Chrome",
"kind": "stability",
"type": "blank",
"emptyPoints": "0",
"screen": "1920x1080",
"viewPoint": "2048x994",
"selector": "HTML BODY #container"
}
参数:
- screen:返回当前window的screen对象,当前渲染窗口中和屏幕有关的属性
- innerWidth:window的innerWidth属性,只读。返回以像素为单位,窗口内部的宽度
- innerHeight:window的innerHeight属性,只读。返回以像素为单位,窗口内部的高度
- layout_viewport:
- elementsFormPoint:可以获取到当前视口内指定坐标处,由里到外排列的所有元素
performance 性能指标
阶段计算
字段 | 描述 | 计算方式 | 意义 |
---|---|---|---|
unload | 前一个页面卸载时长 | unloadEventEnd - unloadEventStart | 前一个页面卸载时长 |
redirect | 重定向时长 | redirectEnd-redirectStart | 重定向时长 |
appCache | 缓存耗时 | domainLookupStart - fetchStart | 缓存耗时 |
dns | DNS解析耗时 | domainLookupEnd-domainLookupStart | 观察域名解析服务是否正常 |
tcp | TCP连接耗时 | connectEnd-connectStart | 建立连接的耗时 |
ssl | SSL安全连接耗时 | connectEnd-secureConnectionStart | 建立ssl安全连接的耗时 |
ttfb | Time to First Byte[TTFB] 网络请求耗时 |
responseStart-requestStart | 页面发出请求到接收到响应数据的第一个字节,消耗的毫秒数 |
response | 响应数据传输耗时 | responseEnd-responseStart | 观察网络是否正常 |
dom | DOM解析耗时 | domInteractive-responseEnd | 观察DOM结构是否合理,是否有js阻塞页面解析 |
dcl | DOMContentLoaded 事件耗时 | domContentLoadedEventEnd-domContentLoadedEventStart | 当HTML文档被完全加载和解析完成DOMContentLoaded事件被触发,无需等待样式表、图片、和子框架的加载 |
resources | 资源加载耗时 | domComplete-domContentLoadEventEnd | 可观察文档流是否过大 |
domReady | DOM阶段渲染耗时 | domContentLoadEventEnd-fetchStart | DOM树和页面资源加载完成时间 |
FP | 首次渲染耗时 | responseEnd-fetchStart | 加载文档到看到第一帧非空图像的时间,也叫白屏时间 |
FID | 首次可交互时间 | domInteractive-fetchStart | |
首包时长 | 首包时长 | responseStart-domainLookupStart | DNS解析到响应返回给浏览器第一个字节的时间 |
页面完全加载时间 | 页面完全加载时间 | loadedEventStart-fetchStart | |
onLoad | onLoad事件耗时 | loadedEventEnd-loadedEventStart |
性能指标
- PerformanceObserver.observe
- entryType
- paint-timing
- event-timing
- LCP
- FMP
- time-to-interactive | 字段 | 描述 | 备注 | | —- | —- | —- | | FP | First Paint 首次绘制 | 包括了任何自定义的背景绘制,不一定是DOM。表示首次将像素绘制到屏幕的时刻 | | 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 首次输入延迟 | 用户首次和页面交互(点击链接、按钮、输入框等)到页面响应交换的时间 |
资源下载:链接: https://pan.baidu.com/s/19HcFa3Fo0G4zbjYfdgfopQ 提取码: 95f2