tencent cloud

前端性能监控

产品简介
产品概述
产品功能
应用场景
购买指南
计费概述
购买方式
欠费说明
快速入门
操作指南
应用接入
数据总览
页面性能
性能数据分析
异常分析
页面访问
API 监控
静态资源
自定义测速
自定义事件
应用管理
访问管理
告警策略
接入指南
Web 应用场景
小程序场景
API 文档
History
Introduction
API Category
Making API Requests
Console APIs
Business System and Project Information APIs
Custom Speed Test APIs
Custom Event APIs
API Monitoring APIs
Exception Analysis APIs
Page View APIs
Static Resource Monitoring APIs
Log APIs
Page Performance APIs
Data Types
Error Codes
常见问题
产品相关问题
技术排查相关问题
使用相关问题
服务协议
RUM 隐私协议
RUM 数据处理和安全协议
前端性能监控服务协议
终端性能监控隐私协议
终端性能监控数据处理和安全协议

钩子函数

PDF
聚焦模式
字号
最后更新时间: 2024-01-22 19:39:30
您可以使用钩子函数对某些资源的测速上报进行自定义配置,系统将会为您计算、统计函数执行时间等。您可以在自定义测速多维度分析函数执行耗时。

beforeReport

1. 该钩子将会在日志上报(对应上报接口为 /collect?)前执行,例如:
const aegis = new Aegis({
id: 'pGUVFTCZyewxxxxx',
beforeReport(log) {
// 监听到下面抛出的错误
console.log(log); // {level: "4", msg: "发生错误啦!!!!"}
return log;
}
});

throw new Error('发生错误啦!!!!');
说明:
上述 log 将会有以下几个字段:
1. level: 日志等级,例如:当 level 为 '4' 时代表错误日志;
2. msg`: 日志内容;
3. 全部日志等级如下:
{ level: '1', name: '接口请求日志(白名单日志)' }
{ level: '2', name: '一般日志' }
{ level: '4', name: 'JS 执行错误' }
{ level: '8', name: 'Promise 错误' }
{ level: '16', name: 'Ajax 请求异常' }
{ level: '32', name: 'JS 加载异常' }
{ level: '64', name: '图片加载异常' }
{ level: '128', name: 'css 加载异常' }
{ level: '256', name: 'console.error (未启用)' }
{ level: '512', name: '音视频资源异常' }
{ level: '1024', name: 'retcode 异常' }
{ level: '2048', name: 'aegis report'
2. 当该钩子返回 false 时,本条日志将不会进行上报,该功能可用来过滤某些不需要上报的错误,例如:
const aegis = new Aegis({
id: 'pGUVFTCZyewxxxxx',
beforeReport(log) {
if (log.level === '4' && log.msg && log.msg.indexOf('碍眼的错误') !== -1) {
return false
}
}
});
throw new Error('碍眼的错误'); // 该错误将不会被上报
上面例子中,当上报的错误内容包含 碍眼的错误 几个关键字时,将不会上报至 RUM 后台中。

onReport

该钩子将在日志上报成功之后执行,用法类似 beforeReport 钩子,唯一不同点在于,该钩子接收到的所有参数都是已经上报完成的日志,而 beforeReport 钩子接收的参数是即将上报的日志。

beforeReportSpeed

1. 该钩子将会在测速数据上报前被执行,例如:
const aegis = new Aegis({
id: 'pGUVFTCZyewxxxxx',
reportApiSpeed: true,
reportAssetSpeed: true,
beforeReportSpeed(msg) {
console.log(msg); // {url: "https://localhost:3001/example.e31bb0bc.js", method: "get", duration: 7.4, status: 200, type: "static"}
return msg
}
});
说明:
上述 msg 将会有以下几个字段:
1. url: 该资源的请求地址。
2. type: 该资源的类型,目前有 fetchstatic 两种,当为 fetch 时,Aegis 将会把该资源当成 API 请求进行上报,static 时则视为静态资源。
3. duration: 该资源请求耗时。
4. method: 请求该资源时使用的 http method。
5. status: 服务器返回状态码。
上面的例子中,每当 Aegis 收集到一个资源的加载详情时,将会以该资源的加载情况(上面的返回的 msg)作为参数调用 beforeReportSpeed 钩子。
2. 如果您配置了该钩子,Aegis 最终的上报内容将以钩子的执行结果为准。例如:
const aegis = new Aegis({
id: 'pGUVFTCZyewxxxxx',
reportApiSpeed: true,
reportAssetSpeed: true,
beforeReportSpeed(msg) {
msg.type = 'static';
}
});
上述代码中,将所有的 msg.type 设置为 static,这意味着所有的资源都将被当成静态资源进行上报,API 请求也将被报至静态资源中。
3. 使用该钩子,您可以校准 Aegis 类型判断错误的请求。

示例

假如您有一条接口 https://example.com/api,该接口的响应头 Content-Typetext/html。正常情况下,RUM 会将该资源当成静态资源进行上报。但在您的业务中,该接口就必须视为 API 请求进行上报,您可以给 Aegis 配置如下钩子进行校正:
const aegis = new Aegis({
id: 'pGUVFTCZyewxxxxx',
reportApiSpeed: true,
reportAssetSpeed: true,
beforeReportSpeed(msg) {
if (msg.url === 'https://example.com/api') {
msg.type = 'fetch';
}
}
});
1. 您还可以屏蔽某些资源的测速上报,例如:
const aegis = new Aegis({
id: 'pGUVFTCZyewxxxxx',
reportApiSpeed: true,
reportAssetSpeed: true,
beforeReportSpeed(msg) {
// 地址中包含‘https://example.com/api’的都不上报
if (msg.url.indexOf('https://example.com/api') !== -1) {
// 返回 ‘false’ 将阻止本条测速日志的上报
return false
}
}
});

beforeRequest

该钩子将会在日志上报前执行,例如:
注意:
SDK 版本应大于等于 1.24.44。
const aegis = new Aegis({
id: 'pGUVFTCZyewxxxxx',
beforeRequest: function(msg) {
if (msg.logs && msg.logs.level === '4' && msg.logs.msg && msg.logs.msg.indexOf('碍眼的错误') !== -1) {
return false
}
return msg;
}
});
其中,msg 将会有以下几个字段:
1. logType:日志类型,有以下值:
custom:自定义测速
event:自定义事件
log:日志
performance:页面测速
pv:页面PV
speed:接口和静态资源测速
vitals:web vitals
2. logs:上报的日志内容:
当 logType 为 'custom' 时,logs 数据类型为 {name: "白屏时间", duration: 3015.7000000178814, ext1: '', ext2: '', ext3: ''}
当 logType 为 'event' 时,logs 数据类型为 {name: "ios", ext1: "", ext2: "", ext3: ""}
当 logType 为 'performance' 时,logs 数据类型为 {contentDownload: 2, dnsLookup: 0, domParse: 501, firstScreenTiming: 2315, resourceDownload: 260, ssl: 4, tcp: 4, ttfb: 5}
当 logType 为 'speed' 时,logs 数据类型为 {connectTime: 0, domainLookup: 0, duration: 508.2, isHttps: true, method: "get", status: 200, type: "tatic", url: "https://xxxxxx", urlQuery: "max_age=1296000"}
当 logType 为 'vitals' 时,logs 数据类型为 {delta: 1100, entries: [PerformancePaintTiming], id: "v1-1629344653118-4916457684758", name: "CP", value: 1100}
当 logType 为 'log' 时,logs 数据类型为 {msg: "日志详情", level: '4', ext1: '', ext2: '', ext3: '', trace: ''}
说明:
其中 level 枚举值如下:
{ level: '1', name: '接口请求日志(白名单日志)' }
{ level: '2', name: '一般日志' }
{ level: '4', name: 'JS 执行错误' }
{ level: '8', name: 'Promise 错误' }
{ level: '16', name: 'Ajax 请求异常' }
{ level: '32', name: 'JS 加载异常' }
{ level: '64', name: '图片加载异常' }
{ level: '128', name: 'css 加载异常' }
{ level: '256', name: 'console.error (未启用)' }
{ level: '512', name: '音视频资源异常' }
{ level: '1024', name: 'retcode 异常' }
{ level: '2048', name: 'aegis report' }
该钩子返回 false 时,本条日志将不会进行上报,该功能可用来过滤某些不需要上报的错误,可以用来过滤不希望上报的日志。

afterRequest

该勾子将会在测速数据上报后被执行,例如:
注意:
SDK 版本应大于等于 1.24.44。
const aegis = new Aegis({
id: "pGUVFTCZyewxxxxx",
afterRequest: function(msg) {
// {isErr: false, result: Array(1), logType: "log", logs: Array(4)}
console.log(msg);
}
});
其中,msg 将会有以下几个字段:
1. isErr:请求上报接口是否错误。
2. result:上报接口的返回结果。
3. logs:上报的日志内容。
4. logType:日志类型,同 beforeRequest 中的 logType。

帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈