在追踪前端 JS 错误时,需要通过追踪 JS 代码堆栈来定位报错位置。RUM 支持采集 JS 错误堆栈信息,通过上传的 SourceMap 文件即可解析 JS 堆栈。但由于 RUM 支持管理多个版本的 SourceMap 文件,仅通过文件名往往无法准确关联异常堆栈中的 JS 文件和对应的 SourceMap 文件。通过使用 RUM 前端构建工具插件,可以向打包生成的 JS 文件和 SourceMap 文件注入 UUID,以在两者间建立双向关联,从而在打开 RUM 异常明细界面时能够自动解析和展示堆栈信息,无需手动选择 SourceMap 文件。
前提条件
确保您的Web应用已接入用户体验监控,具体操作,请参见接入Web & H5应用。
支持的前端构建工具类型
目前 RUM Web & H5 SourceMap 自动解析功能支持以下前端构建工具:
-
Webpack
-
Vite
使用RUM前端构建工具插件
Webpack
-
安装 RUM Webpack 前端构建工具插件 npm 包。
npm install @arms/rum-webpack-plugin --save -
在 Webpack 配置文件中应用 RUM 前端构建工具插件,并通过设置 devtool 属性使 Webpack 生成 SourceMap 文件。
import { RumWebpackPlugin } from '@arms/rum-webpack-plugin' const config = { plugins: [new RumWebpackPlugin()], devtool: 'source-map', }; export default config
Vite
-
安装 RUM Vite 前端构建工具插件 npm 包。
npm install @arms/rum-vite-plugin --save -
在 Vite 配置文件中应用 RUM 前端构建工具插件,并通过设置 build.sourcemap 属性使 Vite 生成 SourceMap 文件。
import { rumVitePlugin } from '@arms/rum-vite-plugin' export default defineConfig({ plugins: [rumVitePlugin()], build: { sourcemap: true, }, });
自动上传 SourceMap 文件
为简化操作流程,您可以配置 RUM 前端构建工具插件在注入 UUID 后自动将 SourceMap 文件上传至 RUM 的 OSS 存储中。
配置自动上传 SourceMap 操作过程中需要获取账号的AccessKey ID 和 AccessKey Secret,AccessKey是访问阿⾥云 API 的密钥,出于安全考虑,强烈建议您使用RAM用户完成以下操作,并妥善保管AccessKey。
步骤一:打开批量上传开关
为获取 RUM OSS 的写⼊权限,您需要使用RAM用户登录ARMS控制台,并在目标 RUM 应用的应用设置页面开启 OSS 批量上传文件开关。
开关位于文件管理页签中。
步骤二:获取RAM用户的AccessKeyID 和 AccessKeySecret
为将⽂件上传⾄ RUM OSS 服务,您需要向 RUM 前端构建⼯具插件提供上一步RAM用户的 AccessKey ID 和 AccessKey Secret。
创建时AccessKey,使用场景需选择本地开发环境中使用。具体获取方法,请参见创建RAM用户的AccessKey。
选中该选项后,系统提示使用建议:避免在代码中写入明文 AccessKey 信息,建议使用环境变量配置凭据。勾选 我确认必须创建 AccessKey 后单击 继续创建。
步骤三:配置插件
在 RUM 前端构建工具插件配置中填入 RUM 应用 ID、AccessKey ID、AccessKey Secret 、版本号(用于在 RUM 控制台中对上传的 SourceMap 文件进行分组管理,默认为 1.0.0)以及应用所在的 Region(默认为 cn-hangzhou)。
Webpack
为防止调试时重复上传,使用Webpack打包时仅Production模式会自动上传SourceMap。
import { RumWebpackPlugin } from '@arms/rum-webpack-plugin'
const config = {
plugins: [new RumWebpackPlugin({
pid: '', // RUM 应用 ID
accessKeyId: '',
accessKeySecret: '',
version: '',
region: ''
})],
devtool: 'source-map',
};
export default config
Vite
import { rumVitePlugin } from '@arms/rum-vite-plugin'
export default defineConfig({
plugins: [rumVitePlugin({
pid: '', // RUM 应用 ID
accessKeyId: '',
accessKeySecret: '',
version: '',
region: ''
})],
build: {
sourcemap: true,
},
});
插件配置中的 pid 参数须填写 ARMS 老平台的应用 PID,而非云监控 2.0 平台基于 service_id 生成的新 PID。若填入云监控 2.0 新 PID,SourceMap 上传请求虽会返回成功状态,但文件管理页面中文件列表将显示为空,且无法与异常堆栈正确关联解析(关键词:PID 不一致、文件列表为空)。
解决方法:在 ARMS 老平台获取对应应用的 PID,将插件配置中的 pid 参数值替换为该 PID。
手动上传 SourceMap 文件
步骤一:构建项目
通过前端构建工具提供的 build 命令构建项目代码后,RUM 前端构建工具会在 JS 文件和对应的 SourceMap 文件中注入 UUID。
SourceMap 文件中增加 debugId 字段,表示 SourceMap 文件 UUID 注入成功。
{
"version": 3,
"file": "index.js",
"mappings": "AAAAA,QAAQC,IAAI",
"sources": [
"webpack://examples/./src/index.js"
],
"sourcesContent": [
"console.log('Hello World!');\n"
],
"names": [
"console",
"log"
],
"sourceRoot": "",
"debugId": "e4f083d6-b8d8-4cae-a0ea-16f2e83a6be1"
}
通过浏览器打开页面后,能够在全局对象 Window 上观察到 _armsRumDebugIds 属性则表示 JS 文件 UUID 注入成功。
> window._armsRumDebugIds
< {"Error\n at file:///Users/yy/Projects/rum-bundler-plugin/packages/examples/dist/webpack5/index.js:1:128": "e4f083d6-b8d8-4cae-a0ea-16f2e83a6be1"}
步骤二:手动上传 SourceMap 文件
若不使用自动上传功能,可在 RUM 控制台进行手动上传。在应用设置页面的文件管理区域,上传注入了 UUID的 SourceMap 文件,UUID 列出现对应的 UUID 代表解析成功。
上传时需填写版本号(如1.0.0),然后单击批量上传完成上传。
步骤三:自动解析
通过异常统计页面进入目标异常的异常明细页面,堆栈信息中的每一行都会显示其通过 RUM 前端构建工具插件注入的 UUID,显示 "-" 则代表没有成功上报 UUID。
若已上传了带有对应 UUID 的 SourceMap 文件,堆栈信息中的第一行将会自动解析并展示报错的源代码位置,其他行可通过单击所在行展开自动解析结果。
SourceMap解析后定位到源文件 webpack://demo/index.tsx,报错位置为第14行 throw new Error('test error'),解析后的源代码如下。
import React from 'react';
import Page from '@alicloud/console-components-page';
import TestCode from './TestCode';
const TestPage = () => {
return (
<Page>
<Page.Header title=测试" />
<Page.Content>
<IncidentPlanTable />
<button
onClick={() => {
throw new Error('test error');
}}
>
test
</button>
</Page.Content>
</Page>
);
};
RUM 前端构建工具插件版本说明
|
版本号 |
说明 |
|
|
0.0.8 |
增加构建项目代码后自动上传 SourceMap 文件功能。 |
|
|
0.0.5 |
支持 Webpack、Vite 前端构建工具,通过注入 UUID 在 JS 文件和对应 SourceMap 文件间建立双向联系。 |
|
常见问题
SourceMap 已上传成功但控制台异常明细不显示源代码怎么办?
原因:上传的 SourceMap 文件中未包含源码内容(sourcesContent 字段),导致 RUM 解析堆栈时无法还原源代码。
排查步骤:
-
检查前端构建工具的打包配置,确保生成 SourceMap 时开启了包含源码内容的选项。Webpack 需将
devtool设置为source-map,Vite 需将build.sourcemap设置为true。 -
使用第三方工具(如 decodeSourceMap)在本地校验生成的 SourceMap 文件,确认文件中包含
sourcesContent字段且内容非空。 -
确认 OSS 中存储的 SourceMap 文件格式正确且可访问,文件在上传过程中未发生损坏或截断。
ARMS RUM 是否支持自定义 OSS Bucket 上传 SourceMap?
目前不支持自定义 OSS Bucket。应用实时监控服务已为各地域预置专用 OSS Bucket(例如杭州地域为 arms-rum-sourcemap-hz),无需也无法指定其他 Bucket。
如需使用自动上传功能,请在控制台目标 RUM 应用的应用设置页面文件管理页签中开启 OSS 批量上传文件开关,按照本文「自动上传 SourceMap 文件」章节的步骤配置插件,即可直接将 SourceMap 文件上传至预置 Bucket。
通过 ossutil 等工具手动上传 SourceMap 文件后控制台不显示怎么办?
通过文件夹方式或非标准路径将 SourceMap 文件上传至 OSS,可能导致控制台文件管理界面无法正确展示文件列表。
建议优先使用 RUM 前端构建工具插件(Webpack/Vite)完成 SourceMap 的自动上传和解析。若必须手动上传,请严格按照本文「手动上传 SourceMap 文件」章节的步骤操作:在控制台应用设置页面的文件管理区域,单击批量上传,填写正确的版本号后完成上传,不要通过 ossutil 等第三方工具直接写入 OSS。
接入地域与 ARMS RUM 服务地域不一致时如何配置 Endpoint?
目前用户体验监控 SourceMap 上传服务仅在以下三个地域可用:
|
地域 |
插件 |
|
杭州 |
|
|
新加坡 |
|
|
硅谷 |
|
若应用部署在其他地域(如上海、北京),上传 SourceMap 时不能使用本地域端点。须在前端构建工具插件配置的 region 参数中指定上表中的可用地域,以确保能连接到预置的 OSS Bucket 并完成上传。