tencent cloud

腾讯云可观测平台

动态与公告
产品动态
产品简介
产品概述
产品优势
基本功能
基本概念
应用场景
使用限制
购买指南
云产品监控
应用性能监控
终端性能监控
前端性能监控
云拨测
Prometheus 监控服务
Grafana 服务
事件总线
云压测
快速入门
监控概览
实例分组
云产品监控
应用性能监控
云拨测
云压测
Prometheus 监控服务
Grafana 服务
创建 Dashboard
事件总线
告警服务
云产品监控
云产品监控指标
控制台操作指南
云服务器监控组件
云产品监控对接 Grafana
故障处理
实践教程
应用性能监控
应用性能监控简介
接入指南
控制台操作指南
实践教程
参考信息
常见问题
终端性能监控
终端性能监控概述
控制台操作指南
接入指南
实践教程
前端性能监控
前端性能监控简介
控制台操作指南
接入指南
常见问题
云拨测
产品简介
控制台操作指南
常见问题
云压测
云压测概述
控制台操作指南
实践教程
JavaScript API 列表
常见问题
Prometheus 监控
Prometheus 监控简介
接入指南
控制台操作指南
实践教程
Terraform
常见问题
Grafana 服务
产品简介
控制台操作指南
Grafana 平台常用功能指引
常见问题
Dashboard
什么是 Dashboard
控制台操作指南
告警管理
控制台操作指南
故障处理
常见问题
事件总线
事件总线简介
控制台操作指南
实践教程
常见问题
报表管理
常见问题
腾讯云可观测平台常见问题
告警服务相关
一般性问题
监控图表相关
云服务器监控组件相关
动态阈值告警相关
云监控对接 Grafana 相关
文档阅读指南
相关协议
应用性能监控服务等级协议
APM 隐私协议
APM 数据处理和安全协议
前端性能监控服务等级协议
终端性能监控服务等级协议
云拨测服务等级协议
Prometheus 监控服务服务等级协议
Grafana 服务服务等级协议
云压测服务等级协议
云压测使用限制
Cloud Monitor Service Level Agreement
词汇表

钩子函数

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

onBeforeRequest

该钩子函数会在所有请求发出前调用,参数中会传入请求的所有内容,必须返回待发送内容。
function changeURLArg(url,arg,arg_val) {
var pattern=arg+' = ([^&]*)';
var replaceText = arg+'='+arg_val;
if (url.match(pattern)) {
var tmp = '/('+ arg+'=)([^&]*)/gi';
tmp = url.replace(eval(tmp),replaceText);
return tmp;
}
return url;
}
const aegis = new Aegis({
id: 'pGUVFTCZyewxxxxx',
onBeforeRequest(log) {
if (log.type === 'performance') {
// 页面测速,此时可以修改log内容,如修改页面测速platform
log.url = changeURLArg(log.url, 'platform', type)
}
return log
}
});

// SEND_TYPE {
// LOG = 'log', // 日志
// SPEED = 'speed', // 接口和静态资源测速
// PERFORMANCE = 'performance', // 页面测速
// OFFLINE = 'offline', // 离线日志上传
// WHITE_LIST = 'whiteList', // 白名单
// VITALS = 'vitals', // vitals
// PV = 'pv', // 自定义pv
// EVENT = 'event', // 自定义事件
// CUSTOM = 'custom', // 自定义测速
// SDK_ERROR = 'sdkError', // sdk报错
// }

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: '一般日志(aegis.info 或者 aegis.infoAll)' }
{ 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' }
{ level: 4096, name: 'PV' }
{ level: 8192, name: '自定义事件' }
2. 当该钩子返回 false 时,本条日志将不会进行上报,该功能可用来过滤某些不需要上报的错误,例如:
const aegis = new Aegis({
id: 'pGUVFTCZyewxxxxx',
beforeReport(log) {
if (log.level === '4' && log.msg && log.msg.indexOf('碍眼的错误') !== -1) {
return false
}
return log;
}
});
throw new Error('碍眼的错误'); // 该错误将不会被上报
上面例子中,当上报的错误内容包含碍眼的错误几个关键字时,将不会上报至 RUM 后台中。

onReport

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

beforeReportSpeed

1. 该钩子将会在测速数据上报前(/speed?)被执行,例如:
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: 服务器返回状态码;
6. payload: 提供给开发人员的完整资源请求信息(此数据不上报到 Aegis 后台,用户可自行操作)完整的数据结构如下:
payload.type - 表示该资源请求的类型,用于区分原始请求类型,可取值为:'fetch', 'xhr'
payload.sourceURL - 表示完整的 URL 请求连接
payload.status - 表示请求状态码
payload.headers - 包含所有的请求头,且 value 值都为字符串
payload.data - 表示完整的请求资源,用户可自定义操作(当请求类型为 fetch 时,表示 response 对象;当请求类型为 XHR 时,表示 XMLHttpRequest 对象)
上面的例子中,每当 Aegis 收集到一个资源的加载详情时,将会以该资源的加载情况(上面返回的 msg)作为参数调用 beforeReportSpeed 钩子。
2. 如果您配置了该钩子,Aegis 最终的上报内容将以钩子的执行结果为准。例如:
const aegis = new Aegis({
id: 'pGUVFTCZyewxxxxx',
reportApiSpeed: true,
reportAssetSpeed: true,
beforeReportSpeed(msg) {
msg.type = 'static';
return msg;
}
});
上面的代码中,将所有的 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';
}
}
});
4. 您还可以屏蔽某些资源的测速上报,例如:
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: 2660, ssl: 4, tcp: 4, ttfb: 5}
当 logType 为 'speed' 时,logs 数据类型为 {connectTime: 0, domainLookup: 0, duration: 508.2, isHttps: true, method: "get", status: 200, type: "static", url: "https://xxxxxx", urlQuery: "max_age=1296000"}
当 logType 为 'vitals' 时,logs 数据类型为 {delta: 1100, entries: [PerformancePaintTiming], id: "v1-1629344653118-4916457684758", name: "LCP", value: 1100}
当 logType 为 'log' 时,logs 数据类型为 {msg: "日志详情", level: '4', ext1: '', ext2: '', ext3: '', trace: ''}
说明:
其中 level 枚举值如下:
{ level: '1', name: '接口请求日志(白名单日志)' }
{ level: '2', name: '一般日志(aegis.info 或者 aegis.infoAll)' }
{ 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' }
{ level: 4096, name: 'PV' }
{ level: 8192, name: '自定义事件' }
该钩子返回 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。

帮助和支持

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

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

文档反馈