ARMS用户体验监控提供一系列SDK配置项,让您能够通过设置参数来满足额外需求。本文介绍Web & H5应用常用的SDK配置。
SDK 配置
| 参数 | 类型 | 描述 | 是否必填 | 默认值 | 
| pid | string | 应用ID | 是 | - | 
| endpoint | string | 上报地址 | 是 | - | 
| env | string | 应用环境: 
 | 否 | prod | 
| version | string | 应用版本 | 否 | - | 
| user | object | User配置 | 否 | user.id由SDK默认生成 | 
| spaMode | string | SPA模式,监听页面事件并重新上报PV,适用于单页面应用场景。 
 | 否 | false | 
| beforeReport | function | Repoter发送RUM事件之前 | 否 | - | 
| reportConfig | object | 上报配置,详细说明请参见reportConfig 配置。 | 否 | - | 
| sessionConfig | object | Session的采样、存储等配置,详细说明请参见sessionConfig 配置。 | 否 | - | 
| collectors | object | 各Collector(采集器)配置 | 否 | - | 
| parseViewName | function | 解析视图名称(view.name),入参为当前页面的URL。 | 否 | - | 
| parseResourceName | function | 解析资源名称(resource.name),入参为当前资源的URL。 | 否 | - | 
| evaluateApi | function | 自定义解析API事件,详细说明请参见 evaluateApi 配置。 | 否 | - | 
| filters | object | 事件过滤配置,详情说明请参见 filters 配置。 | 否 | - | 
| whiteScreen | object | 白屏监控配置,详细说明请参见 whiteScreen 配置。 | 否 | - | 
| properties | object | 自定义属性,可对所有事件生效,详情说明请参见 properties 配置。 | 否 | - | 
| remoteConfig | object | 动态配置,详情说明请参见动态配置。 | 否 | - | 
使用CDN加载情况下,访问 SDK 监控实例,请使用全局命名空间 RumSDK.default。
const ArmsRum = window.RumSDK.default;
// 访问 RumSDK 需确保SDK已经完成加载
// 如果SDK加载前没有定义 __rum 配置,可在此初始化
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpoint",
});
// 以下继续使用,NPM 和 CDN 一致
ArmsRum.setConfig('env', 'pre');
user 配置
| 参数 | 类型 | 描述 | 是否必填 | 默认值 | 
| id | string | 用户ID,不可修改。 | 否 | 由SDK默认生成 | 
| tags | string | 标签 | 否 | - | 
| name | string | 名称 | 否 | - | 
示例
如果需要关联业务自有账号体系,建议使用user.name或者user.tags ,而不是修改user.id。强制覆盖SDK生成的user.id ,会影响UV的计算。
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpoint",
  user: {
    name: 'your user.name',
    tags: 'your user.tags',
  },
});
reportConfig 配置
| 参数 | 类型 | 描述 | 是否必填 | 默认值 | 
| flushTime | number | 上报时间间隔 取值范围:[0, 10000] | 否 | 3000 | 
| maxEventCount | number | 一次上报最大数量 取值范围:[1, 100] | 否 | 20 | 
示例
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpoint",
  reportConfig: {
    flushTime: 0, // 立即上报
    maxEventCount: 50, // 一次最多上报数量
  },
});
sessionConfig 配置
| 参数 | 类型 | 描述 | 是否必填 | 默认值 | 
| sampleRate | number | Session采样率:[0, 1] 50%采样率就是0.5。 | 否 | 1 | 
| maxDuration | number(ms) | Session最大持续时间,默认24小时。 | 否 | 86400000 | 
| overtime | number(ms) | Session超时时间,默认一小时。 | 否 | 3600000 | 
| storage | string | Session相关的数据存储位置。 
 | 否 | localStorage | 
Storage存储了user.id和session信息 :
- _arms_uid:唯一标识用户ID,对应user.id。 
- _arms_session:具备语义化的Session信息。 - sessionId:Session唯一标识。 
- sampled:是否命中采样。 
- startTime:Session的开始时间戳。 
- lastTime:Session最后一次活跃时间戳。 
 
`${sessionId}-${sampled}-${startTime}-${lastTime}`示例
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpoint",
  sessionConfig: {
    sampleRate: 0.5, // 采样率50%
    maxDuration: 86400000,
    overtime: 3600000,
    storage: 'cookie',
  },
});
collectors 配置
Collector是RUM SDK用于收集页面监控数据的最小单元。目前RUM SDK内置了API、static Resource等丰富的采集器。
| 参数 | 类型 | 描述 | 是否必填 | 默认值 | 
| perf | boolean | object | 监听页面的性能数据。 | 否 | true | 
| webvitals | boolean | object | 监听页面的WebVitals数据。 | 否 | true | 
| api | boolean | object | 监听API请求。 | 否 | true | 
| staticResource | boolean | object | 监听静态资源请求。 | 否 | true | 
| consoleError | boolean | object | 监听Console错误。 | 否 | true | 
| jsError | boolean | object | 监听JS错误。 | 否 | true | 
| action | boolean | object | 监听用户行为。 | 否 | true | 
示例
关闭监听用户Click行为。
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpoint",
  collectors: {
    action: false,
  },
});
evaluateApi 配置
evaluateApi提供对API(XMLHttpRequest/fetch)事件的自定义解析。以下为SDK传入的三个参数:
| 参数 | 类型 | 描述 | 
| options | object | 请求参数,包括url、headers、data等,根据具体请求方式有所差异。 | 
| response | object | 请求响应体。 | 
| error | Error | 可选参数,当请求失败才会传入。 | 
该函数支持异步函数,返回Promise<IApiBaseAttr>,IApiBaseAttr的定义如下:
| 参数 | 类型 | 描述 | 是否必填 | 
| name | string | API名称,一般是对URL的收敛,最大1000字符。 例如URL为 重要  该字段的优先级高于parseResourceName返回的内容。 | 否 | 
| message | string | API信息,一个简短的描述API概况字符串,最大1000字符。 | 否 | 
| success | number | 请求成功状态: 
 | 否 | 
| duration | number | API总耗时。 | 否 | 
| status_code | number | string | API状态码。 | 否 | 
| snapshots | string | API快照。 说明  可用于存储reqHeaders、params、resHeaders等,具体字段组成方式可自行决定。该字段主要用于排查接口异常的原因,没有索引,不能根据该字段进行筛选或聚合,只接受字符串类型,最大5000字符。 | 否 | 
示例
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpoint",
  evaluateApi: async (options, response, error) => {
    let respText = '';
    // 当前为使用fetch请求的情况
    if (response && response.text) {
      respText = await response.text();
    }
    // 返回的字段会覆盖默认内容,不返回的字段会依然使用SDK自定生成内容
    return {
      name: 'my-custom-api',
      success: error ? 0 : 1,
      // 以下可选
      snapshots: JSON.stringify({
        params: 'page=1&size=10', // 请求入参
        response: respText.substring(0, 2000), // 返回值
        reqHeaders: '', // 请求头
        resHeaders: '', // 响应头
      }),
      properties: {
        prop_msg: 'custom msg',
        prop_num: 1,
      },
    };
  },
});
filters 配置
filters 用于过滤无需上报的事件,目前支持 resource 和 exception 两种事件。
| 参数 | 类型 | 描述 | 是否必填 | 
| resource | MatchOption | MatchOption[] | 对采集到的资源事件进行过滤,包括静态资源和API(XMLHttpRequest/fetch)。 | 否 | 
| exception | MatchOption | MatchOption[] | 对采集到的异常事件进行过滤。 | 否 | 
MatchOption
type MatchOption = string | RegExp | ((value: string) => boolean);- string:匹配任何以该值开头的URL,如 - https://api.aliyun.com可以匹配- https://api.aliyun.com/v1/resource。
- RegExp:使用提供的RegExp和URL执行test。 
- function:以URL作为参数进行计算,返回true表示匹配。 
当传入为 MatchOption[] 时,条件顺序执行,有一项满足就会被过滤。
示例
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpoint",
  filters: {
    // 过滤异常
    exception: [
      'Test error', // 以'Test error'开头的error.message
      /^Script error\.?$/, // 正则表达式匹配 error.message
      (msg) => {
        return msg.includes('example-error');
      },
    ],
    // 过滤资源或API
    resource: [
      'https://example.com/', // 以'https://example.com/'开头的resource
      /localhost/i,
      (url) => {
        return url.includes('example-resource');
      },
    ],
  },
});
whiteScreen 配置
白屏监控仅支持浏览器端(Chrome 40+,IE 9+)。
| 参数 | 类型 | 描述 | 
| detectionRules | 
 | 包含一个或多个白屏检测规则,按配置顺序和延时大小触发检测。 | 
DetectionRule
| 参数 | 类型 | 是否必填 | 描述 | 默认值 | 
| target | 
 | 是 | 指定白屏检测的目标元素的选择器。当检测触发时,系统将对匹配此选择器的元素区域进行白屏检测。 | 无 | 
| test_when | 
 | 是 | 列出触发白屏检测的事件,检测将在这些事件发生后启动,可选值: 
 | 无 | 
| delay | 
 | 否 | 配合 | 
 | 
| tester | 
 | 是 | 定义使用的白屏检测方法。 
 | 无 | 
| ignoreUrlList | 
 | 否 | 需要忽略检测的URL列表,当页面URL与列表中的任何一个匹配时,不进行白屏检测。 | 
 | 
| configOptions | 
 | 否 | 和 | 详见 | 
CustomTestResult的类型声明:
type CustomTesterResult = {
  /**
   * 是否存在内容,如果为`true`则表示有内容,`false`表示发生白屏。
   */
  hasContent: boolean;
  /**
   * 错误信息
   */
  message?: string;
  /**
   * 异常的快照数据
   */
  snapshot?: Record<string, any>;
}ConfigOptions
参数仅在关联方法中生效。
| 参数 | 类型 | 关联方法 | 描述 | 默认值 | 
| colorRange | 
 | 
 | 视为白屏的颜色集合,用于像素比对时判断当前像素区块是否为“全白”,格式为 | 
 | 
| fillColor | 
 | 
 | 填充颜色。在截图时会对图片、视频、canvas、svg、iframe 等元素进行色块填充,填充色不能是 | 
 | 
| horizontalOffset | 
 | 
 | 白屏检测区域左侧边缘相对于目标元素左侧边缘的水平偏移量,用于过滤目标元素的左侧菜单。 | 
 | 
| verticalOffset | 
 | 
 | 白屏检测区域上边缘相对于目标元素上边缘的垂直偏移量,用于过滤目标元素的 topBar。 | 
 | 
| pixels | 
 | 
 | 指定白屏检测时,采样像素区块的大小,区块的大小为 | 
 | 
| threshold | 
 | 
 
 | 白屏率阈值,当白屏率大于该值时,认为发生白屏。 | 
 | 
| dpr | 
 | 
 | 设置快照图片的缩放比例。 | 
 | 
| ignoreElements | 
 | 
 | 需要忽略检测的元素的 CSS 选择器,这些元素在截图时将被忽略。 | 
 | 
| sampleMethod | 
 | 
 | 采样方法: 
 | 
 | 
| checkPoints | 
 | 
 | 设置径向的采样点数量。 
 | 
 | 
| whiteBoxElements | 
 | 
 | 白屏元素的 CSS 选择器列表,当采样点的顶层 DOM 元素匹配此列表中的选择器时,增加白屏计数。 | 
 | 
| debug | 
 | 
 
 | 是否开启调试模式,在调试模式下可以在开发者工具里看到打印的检测信息。 | 
 | 
示例
SCREENSHOT 截图检测法
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpint",
  whiteScreen: {
    detectionRules: [{
      target: '#root',
      test_when: ['LOAD', 'ERROR', 'ROUTE_CHANGE', 'LEAVE'],
      delay: 5000,
      tester: 'SCREENSHOT',
      configOptions: {
        colorRange: ['rgb(255, 255, 255)', 'rgb(0, 0, 0)'],
        threshold: 0.9,
        pixels: 10,
        horizontalOffset: 210,
        verticalOffset: 50,
      },
    }],
  },
});
SAMPLE 采样法
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpoint",
  whiteScreen: {
    detectionRules: [{
      target: '#root',
      test_when: ['LOAD', 'ERROR', 'ROUTE_CHANGE', 'LEAVE'],
      delay: 5000,
      tester: 'SAMPLE',
      configOptions: {
        sampleMethod: 2,
        checkPoints: 10,
        threshold: 0.9,
        whiteBoxElements: ['.el-skeleton'],
      },
    }],
  },
});
CUSTOM 自定义检测函数
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpoint",
  whiteScreen: {
    detectionRules: [{
      target: '#root',
      test_when: ['LOAD', 'ERROR', 'ROUTE_CHANGE', 'LEAVE'],
      delay: 5000,
      tester: async (element) => {
        // 自定义检测函数主题
        return {
          hasContent: false,
          message: '自定义的错误信息',
          snapshot: {
            // 键值对可自定义
            checkPoints: 100,
            rate: 0.99,
            checkdata: '......',
          },
        };
      },
    }],
  },
});
properties 配置
Properties是RUM提供的自定义属性,可为任何上报事件配置该属性。
| 参数 | 类型 | 描述 | 是否必填 | 
| [key: string] | string | number | 
 | 否 | 
使用evaluateApi、sendCustom、sendException、sendResource等可以单独为某个事件增加properties,仅对单个事件生效。
全局properties和事件properties在存储时会进行合并。事件properties优先级高于全局properties,合并时相同的key,事件properties会覆盖全局properties。合并后properties键值对数量不可超过20对,超出会基于key进行排序后移除。
示例
全局配置properties时,所有上报的事件都会拥有。
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpoint",
  properties: {
    prop_string: 'xx',
    prop_number: 2,
    // key 和 value 超出范围会被截断
    more_than_50_key_limit_012345678901234567890123456789: 'yy',
    more_than_2000_value_limit: new Array(2003).join('1'),
    // 以下不符合要求的键值对会被移除
    prop_null: null,
    prop_undefined: undefined,
    prop_bool: true,
  },
});
动态配置
RUM 支持对SDK采集上报配置进行动态下发,会在应用初次加载时被SDK动态载入,并逐项覆盖集成SDK初始化时设置的静态配置。其实现上分为控制台和SDK两部分。
控制台配置
需要先在控制台进行配置,路径是“应用列表”> 进入到需要配置的应用 >“应用设置”> “SDK配置”。配置完成并测试后点击“确认更新动态配置”即可将配置推送到远程OSS端进行存储。
SDK配置
要支持动态配置下发,还需要在SDK初始化的配置内添加remoteConfig字段。SDK在初始化的时候会根据该字段去获取远程OSS配置,并根据获取到的配置更新探针,上报等功能。
CDN方式引入SDK的初始化方式:
window.__rum = {
  pid: "your app id",
  endpoint: "your endpoint",
  remoteConfig: {
    // web 应用所在的Region,如新加坡为ap-southeast-1
    region: "cn-hangzhou"
  }
};
// 通过CDN方式引入SDK
<script async src="https://xxid-sdk.rum.aliyuncs.com/v2/browser-sdk.js"></script>
SDK 获取到远程配置之后,除了即时更新功能外,还会将该配置存储到本地,以便下次SDK启动的时候会优先使用本地存储的配置进行初始化。
此外需要注意,如果SDK是以CDN方式指定版本,则需要版本号在0.0.37及以上。
其他配置
RUM SDK支持配置基于IP和UserAgent等解析所得到的公共属性,主动配置字段优先级高于自动解析。
| 参数 | 类型 | 描述 | 是否必填 | 
| device | object | 设备信息 | 否 | 
| os | object | 系统、容器信息 | 否 | 
| geo | object | 行政地理信息 | 否 | 
| isp | object | 运营商信息 | 否 | 
| net | object | 网络信息 | 否 | 
以上字段具体可配置项请参考日志数据说明中公共属性部分。
示例
ArmsRum.init({
  pid: "your app id",
  endpoint: "your endpoint",
  geo: {
    country: 'your custom country info',
    city: 'your custom city info',
  },
});
SDK API
RUM SDK开放API,用于修改上报自定义数据,动态修改SDK配置等。
getConfig
获取SDK配置。
setConfig
修改SDK配置。
// 指定 key 设置
ArmsRum.setConfig('env', 'pre');
// 覆盖设置
const config = ArmsRum.getConfig();
ArmsRum.setConfig({
  ...config,
  version: '1.0.0',
  env: 'pre',
});sendCustom
上报自定义事件,必须包含type和name两个属性,否则无法上报。属性的具体业务意义可参考下表,实际使用需要自行定义业务语义。
| 参数 | 类型 | 描述 | 是否必填 | 
| type | string | 类型 | 是 | 
| name | string | 名称 | 是 | 
| group | string | 分组 | 否 | 
| value | number | 值 | 否 | 
| properties | object | 自定义属性 | 否 | 
ArmsRum.sendCustom({
  // 必选
  type: 'CustomEvnetType1',
  name: 'customEventName2',
  // 可选
  group: 'customEventGroup3',
  value: 111.11,
  properties: {
    prop_msg: 'custom msg',
    prop_num: 1,
  },
});
sendException
上报自定义异常数据,必须包含name和message两个属性,否则无法上报。
| 参数 | 类型 | 描述 | 是否必填 | 
| name | string | 异常名称 | 是 | 
| message | string | 异常信息 | 是 | 
| file | string | 异常发生文件 | 否 | 
| stack | string | 异常堆栈信息 | 否 | 
| line | number | 异常发生的行数 | 否 | 
| column | number | 异常发生的列数 | 否 | 
| properties | object | 自定义属性 | 否 | 
ArmsRUM.sendException({
  // 必选
  name: 'customErrorName',
  message: 'custom error message',
  // 可选
  file: 'custom exception filename',
  stack: 'custom exception error.stack',
  line: 1,
  column: 2,
  properties: {
    prop_msg: 'custom msg',
    prop_num: 1,
  },
});
sendResource
上报自定义资源,必须包含name、type和duration三个属性,否则无法上报。
| 参数 | 类型 | 描述 | 是否必填 | 
| name | string | 资源名。 | 是 | 
| type | string | 资源类型,例如:css、javascript、xmlhttprequest、fetch、api、image、font、other。 | 是 | 
| duration | string | 请求耗时。 | 是 | 
| success | number | 请求成功状态: 
 | 否 | 
| method | string | 请求方法。 | 否 | 
| status_code | number | string | 请求状态码。 | 否 | 
| message | string | 请求消息。 | 否 | 
| url | string | 请求地址。 | 否 | 
| trace_id | string | 链路追踪ID。 | 否 | 
| properties | object | 自定义属性。 | 否 | 
ArmsRum.sendResource({
  // 以下必选
  name: 'getListByPage',
  message: 'success',
  duration: 800,
  // 以下可选
  url: 'https://www.aliyun.com/data/getListByPage',
  properties: {
    prop_msg: 'custom msg',
    prop_num: 1,
  },
});