1.准备工作
初始化项目
1 | npm init -y |
新建 webpack.config.js
1 | const path = require('path'); |
新建 src/index.html
1 |
|
新建 src/index.js
安装包
1 | npm install webpack webpack-cli webpack-dev-server html-webpack-plugin user-agent -D |
修改package.json
1 | "scripts": { |
2.编写监控采集脚本
2.1 开通日志服务
- 日志服务(Log Service,简称 SLS)是针对日志类数据一站式服务,用户无需开发就能快捷完成数据采集、消费、投递以及查询分析等功能,帮助提升运维、运营效率,建立 DT 时代海量日志处理能力
- 日志服务帮助文档
- Web Tracking
2.1.1 步骤
1、【创建Project】 : 名称(front-end-monitor-test)、所属地域(杭州) 确定;
2、【创建logStore】:名称(font-end-monitor-store)、开启WebTracking 确定;
3、【创建成功,立即接入数据】:搜索WebTracking SDK、下一步、开启包含中文、下一步
4、【完成数据接入配置】:查询日志->立即尝试
5、【有数据之后设置索引】:https://sls.console.aliyun.com/lognext/profile 找到下面的Project下的项目,进入,查询分析属性-设置-开启日志聚类-自动生成索引-确定-确定
2.2 监控错误
2.2.1 错误分类
- JS错误
- JS错误
- Promise异常
- 资源异常
-监听error
2.2.2 数据结构设计
1.jsError
1 | { |
2.promiseError
1 | { |
3.resourceError
1 | { |
2.2.3 实现
2.2.3.1 收集log信息
src/index.html
1 | <body> |
src/index.js
1 | import './monitor/index'; |
新建 src/monitor/index.js
1 | import {injectJsError} from './lib/jsError'; |
新建 src/monitor/lib/jsError.js
1 | import getLastEvent from '../util/getLastEvent'; |
新建 src/monitor/util/getLastEvent.js
1 | let lastEvent; |
新建 src/monitor/util/getSelector.js
1 | const getSelector = function (path) { |
2.2.3.2 上报
新建 src/util/tracker.js
1 | const project = 'front-end-monitor-test'; |
2.3 接口异常采集脚本
2.3.1 数据结构设计
成功的请求
1 | { |
失败的请求
1 | { |
2.3.2 实现
src/index.html
1 | <body> |
webpack.config.js 添加before方法
1 | const path = require('path'); |
新建 src/monitor/lib/xhr.js
1 | import tracker from '../util/tracker'; |
/src/monitor/index.js
1 | import {injectJsError} from './lib/jsError'; |
2.4 白屏
2.4.1 数据设计
1 | { |
2.4.2 实现
- elementsFromPoint方法可以获取到当前视口内指定坐标处,由里到外排列的所有元素
src/index.html
1 | <body> |
新建 src/monitor/util/onload.js
1 | export default function (callback) { |
新建 src/monitor/lib/blankScreen.js
1 | import tracker from '../util/tracker'; |
src/monitor/index.js
1 | import {injectJsError} from './lib/jsError'; |
2.4.2.1 举例
src/index.html
1 | <body> |
可以依次拉伸显示不同宽度尺寸的屏幕,页面上定位到的emptyPoints个数随之变化,来设置最大白屏点数去发送白屏tracker
2.5 加载时间
2.5.1 阶段含义
2.5.2 阶段计算
【注意】计算阶段下面第二张图注意:执行javascript 依赖css解析完毕,构建DOM 依赖JS解析完毕。
css没有解析完毕会阻塞js,这里涉及async、defer
2.5.3 数据结构
1 | { |
2.5.4 实现
新建 /src/monitor/lib/timing.js
1 | import tracker from '../util/tracker'; |
src/monitor/index.js
1 | import {injectJsError} from './lib/jsError'; |
刷新页面,可以看到向阿里云服务器发送track请求, 可以看到事件回调耗时0毫秒
2.5.4.1 举例
src/index.html
1 | <body> |
刷新页面,可以看到发送track请求 domContentLoadedTime: 1001
2.6 性能指标
- PerformanceObserver.observe方法用于观察传入的参数中指定的性能条目类型的集合。当记录一个指定类型的性能条目时,性能监测对象的回调函数将会被调用
- entryType
- paint-timing
- event-timing
- LCP
- FMP
- time-to-interactive
2.6.1 字段描述
【注意】字段下面的Performance图片中的Rendering、Painting,它们的区别是:渲染引擎会在内部将页面画好Rendering,画好之后一次性的放到浏览器中Painting,始终有两张图,这个叫双缓冲
。多久更新一次:比如设备的屏幕刷新率为 60 次/秒,1000ms/60,大概16.6ms绘制一帧(交换一次图片)。
2.6.2 数据结构设计
1.paint
1 | { |
2.firstInputDelay
{
“title”: “前端监控系统”,
“url”: “http://localhost:8080/",
“timestamp”: “1590828477284”,
“userAgent”: “chrome”,
“kind”: “experience”,
“type”: “firstInputDelay”,
“inputDelay”: “3”,
“duration”: “8”,
“startTime”: “4812.344999983907”,
“selector”: “HTML BODY #container .content H1”
}
2.6.3 实现
src/index.html
1 | <body> |
/src/monitor/lib/timing.js
1 | import tracker from '../util/tracker'; |