用户体验监控提供了一系列SDK配置项,让您能够通过设置参数来满足额外需求。本文介绍鸿蒙(HarmonyOS)应用常用的SDK配置。
启动配置接口
启动配置类的接口需通过链式调用方式与AlibabaCloudRum.withServiceId("${your_serviceId}").withWorkspace("${your_workspace}").withEndpoint("${your_endpoint}").start(this.context.getApplicationContext())一同配置,且需要在调用start函数之前、调用withServiceId函数之后进行相关配置,在start函数后配置无效,可同时配置多项。
自定义APP版本
自定义设备App版本号后,SDK将会上报此版本号,不再使用默认获取的版本号。
withAppVersion(appVersion: string):AlibabaCloudRum参数 | 类型 | 是否必填 | 说明 | 参数限制 |
appVersion | string | 是 | 自定义的版本号 | 字符串长度大于0,小于等于64 |
示例:
AlibabaCloudRum.withServiceId("${your_serviceId}")
.withWorkspace("${your_workspace}")
.withEndpoint("${your_endpoint}")
.withAppVersion("${your_appVersion}")
.start(this.context.getApplicationContext());自定义应用环境
区分应用的环境。
withAppEnvironment(environment: string):AlibabaCloudRum参数 | 类型 | 是否必填 | 说明 | 参数限制 |
environment | string | 是 | 应用环境 | 字符串长度大于0,小于等于64 |
示例:
import {AppEnvironment} from '@alibabacloud_rum/harmony_sdk'
AlibabaCloudRum.withServiceId("${your_serviceId}")
.withWorkspace("${your_workspace}")
.withEndpoint("${your_endpoint}")
.withAppEnvironment("${your_appEnvironment}")
.start(this.context.getApplicationContext());自定义应用包名
设置应用包名字段。
withAppBundleName(bundleName: string):AlibabaCloudRum参数 | 类型 | 是否必填 | 说明 | 参数限制 |
bundleName | string | 是 | 应用包名 | 字符串长度大于0,小于等于64 |
代码示例:
import {AppEnvironment} from '@alibabacloud_rum/harmony_sdk'
AlibabaCloudRum.withServiceId("${your_serviceId}")
.withWorkspace("${your_workspace}")
.withEndpoint("${your_endpoint}")
.withAppBundleName("${your_appBundleName}")
.start(this.context.getApplicationContext());设置用户渠道ID
区分应用发布的渠道。
withChannelID(channelID: string): AlibabaCloudRum参数 | 类型 | 是否必填 | 说明 | 参数限制 |
channelID | string | 是 | 自定义的渠道号 | 符串长度大于0,小于等于256 |
示例:
AlibabaCloudRum.withServiceId("${your_serviceId}")
.withWorkspace("${your_workspace}")
.withEndpoint("${your_endpoint}")
.withChannelID("${your_channelID}")
.start(this.context.getApplicationContext());设置设备ID
自定义设备ID。
withDeviceID(deviceID: string): AlibabaCloudRum参数 | 类型 | 是否必填 | 说明 | 参数限制 |
deviceID | string | 是 | 自定义的设备ID | 符串长度大于0,小于等于256 |
示例:
AlibabaCloudRum.withServiceId("${your_serviceId}")
.withWorkspace("${your_workspace}")
.withEndpoint("${your_endpoint}")
.withDeviceID("${your_deviceId}")
.start(this.context.getApplicationContext());数据获取接口
获取设备ID
如果在SDK启动时设置了withDeviceID接口,那么会返回自定义的设备ID。
static getDeviceID(): string示例:
const deviceID = AlibabaCloudRum.getDeviceID();
console.log("ARSDK: "+deviceID);自定义信息设置接口
自定义用户名称
SDK支持设置与用户相关的信息,从而完成性能数据与实际用户相关联的需求场景。
static setUserName(userName: string);参数 | 类型 | 是否必填 | 说明 | 参数限制 |
userName | string | 是 | 用户名称标识 | 字符串可为空或空串。 字符串小于等于256,且不包含特殊字符(只允许数字、字母、中文、冒号、空格、斜杠、下划线、连字符、英文句号、星号、叹号、@、#,空或空串无效),否则接口调用失败 |
示例:
AlibabaCloudRum.setUserName("testName");自定义用户扩展信息
SDK 支持设置更加详细的用户附加信息,从而满足数据分析与实际用户相关联的需求场景。
设置用户更加详细的附加信息
static setUserExtraInfo(attributes: Map<string, Object>);参数
类型
是否必填
说明
参数限制
attributes
Map<string, Object>
是
用户附加信息
Map中kv最多64对 超过则保留其中64个,key长度小于256,超过则该key无效,且不包含特殊字符(只允许数字、字母、冒号、空格、斜杠、下划线、连字符、英文句号、@,空或空串无效);value小于512,超过则截取
示例:
const userInfo = new Map<string, Object>(); userInfo.set("aliasName", "lemonx"); userInfo.set("userRegion", "hangzhou"); userInfo.set("type", "svip"); AlibabaCloudRum.setUserExtraInfo(userInfo);追加用户更加详细的附加信息
static addUserExtraInfo(attributes: Map<string, Object>);参数
类型
是否必填
说明
参数限制
attributes
Map<string, Object>
是
用户附加信息
Map中kv最多64对 超过则保留其中64个,key长度小于256,超过则该key无效,且不包含特殊字符(只允许数字、字母、冒号、空格、斜杠、下划线、连字符、英文句号、@,空或空串无效);value小于512,超过则截取
示例:
const userInfo = new Map<string, Object>(); userInfo.set("age", "18"); AlibabaCloudRum.addUserExtraInfo(userInfo);
自定义全局属性
自定义全局属性设置后,新产生的数据会自动携带该业务属性信息,用于分析与业务属性相关联的需求。
static setExtraInfo(attributes: Map<string, Object>); 参数 | 类型 | 是否必填 | 说明 | 参数限制 |
attributes | Map<string, Object> | 是 | 属性信息 | Map中kv最多64对 超过则保留其中64个,key长度小于256,超过则该key无效,且不包含特殊字符(只允许数字、字母、冒号、空格、斜杠、下划线、连字符、英文句号、@,空或空串无效);value小于512,超过则截取 |
示例:
const properties = new Map<string, Object>();
properties.set("param1", "test1");
properties.set("param2", "test2");
AlibabaCloudRum.setExtraInfo(userInfo);追加全局属性。
static addExtraInfo(attributes: Map<string, Object>); 参数 | 类型 | 是否必填 | 说明 | 参数限制 |
attributes | Map<string, Object> | 是 | 属性信息 | Map中kv最多64对 超过则保留其中64个,key长度小于256,超过则该key无效,且不包含特殊字符(只允许数字、字母、冒号、空格、斜杠、下划线、连字符、英文句号、@,空或空串无效);value小于512,超过则截取 |
示例:
const properties = new Map<string, Object>();
properties.set("param3", "test3");
AlibabaCloudRum.addExtraInfo(userInfo);调用 setExtraInfo 方法时会清空历史设置的属性信息。如您需要追加新的属性信息,建议您通过 addExtraInfo 方法。
自定义异常
传参类型为 Error:调用接口并传入相应参数,可完成自定义异常数据的统计功能。
static setCustomException(error: Error); //直接将 Exception 或 Throwable 对象传入即可参数
类型
是否必填
说明
参数限制
error
Error
是
异常对象
系统抛出的异常对象,非null
示例:
try { throw new Error("Test"); } catch (err) { AlibabaCloudRum.setCustomException(err); }传参类型为自定义参数:更为灵活的重载配置如下,可用于业务型异常上报,对应参数可填充符合参数限制的任意内容,控制台直接展示。
static setCustomException(errorType: string, causeBy?: string, errorDump?: string);参数
类型
是否必填
说明
参数限制
errorType
string
是
异常类型(必要)
字符串长度大于0,小于等于256,否则接口调用失败。
causeBy
string
否
异常原因
字符串可为空或空串。
字符串小于等于512,超长截取。
errorDump
string
否
异常信息
超出10000字符时会被切割
示例:
try { throw new Error("Test"); } catch (err) { if (err instanceof Error) { AlibabaCloudRum.setCustomException(err.name, err.message, err.stack); } }
自定义事件
调用接口并传入相应参数,可完成自定义事件数据统计功能。
static setCustomEvent(eventName: string, group?: string, value?: number, snapshots?: string, attributes?: Map<string, string>)参数 | 类型 | 是否必填 | 说明 | 参数限制 |
eventName | string | 是 | 事件名称 | 字符串长度小于等于256,超长会截取 |
group | string | 否 | 事件分组 | 字符串可为空或空串。 字符串小于等于256,超长截取。 |
value | number | 否 | 事件值 | - |
snapshots | string | 否 | 事件快照 | 字符串可为空或空串。 字符串小于等于7000,超长截取。 |
attributes | Map<string, Object> | 否 | kv存储信息 | 可为空,转JSON后长度在7000字符以内 |
示例:
AlibabaCloudRum.setCustomEvent("注册");
const info = new Map<string, string>();
info.set("eventNumber","10001");
info.set("eventName", "alibaba");
info.set("eventXX", "xxx");
AlibabaCloudRum.setCustomEvent("登录失败", "事件分组", undefined, "事件快照", info);自定义日志
调用接口并传入相应参数,可完成自定义日志数据统计功能。
static setCustomLog(content: string, name: string, snapshots?: string, level?: string, attributes?: Map<string, Object>);参数 | 类型 | 是否必填 | 说明 | 参数限制 |
content | string | 是 | 日志信息 | 字符串长度大于0小于等于10000,超长截取。 |
name | string | 是 | 日志名称 | 字符串长度大于0且小于等于256。 |
snapshots | string | 否 | 日志快照 | 字符串可为空或空串。 字符串小于等于7000,超长截取。 |
level | string | 否 | 日志等级 | 字符串长度大于0且小于等于 256,默认为 INFO。 |
attributes | Map<string, Object> | 否 | 日志附加信息 | Map可为空或空集。 转JSON后,字符串长度与content共享,否则接口调用失败。 |
示例:
AlibabaCloudRum.setCustomLog("日志内容1");
const logInfo = new Map<string, string>();
logInfo.set("logXX","xxx");
AlibabaCloudRum.setCustomEvent("日志内容2", "日志名称", "日志快照", "ERROR", logInfo);自定义资源
SDK支持上报自定义网络资源请求数据,可以记录 HTTP/HTTPS 等类型请求的详细信息,包括请求状态、性能指标和链路追踪信息。当前鸿蒙端支持的网络框架包含系统网络库hms.collaboration.rcp、ohos.net.http、ohos.net.webSocket、ohos.net.socket.TCPSocket以及三方网络库 axios。对于目前尚未支持采集的三方网络库,比如 retrofit,可以调用自定义资源 API 进行手动埋点上报数据。
static setCustomResource(type: string, url: string, method: string, statusCode: number, errorMessage: string,
success: boolean, provider?: string, measuring?: ResourceMeasuring, traceContext?: TraceContext);参数 | 类型 | 是否必填 | 参数说明 | 参数限制 |
type | string | 是 | 资源类型 | 字符串长度大于0且小于等于64,超长截取。 |
url | string | 是 | 请求的完整 URL 地址 | 字符串长度大于0且小于等于1024,超长截取。 |
method | string | 是 | HTTP 请求方法 | 字符串长度大于0且小于等于24,超长截取。 |
statusCode | number | 是 | HTTP 响应状态码 | HTTP 状态码,如:200、404、500等。 |
errorMessage | string | 是 | 错误信息描述 | 字符串长度大于0且小于等于256,超长截取。 |
success | boolean | 是 | 请求是否成功 | true,成功;false,失败。 |
provider | string | 否 | 服务提供商标识,如: | 字符串长度大于0且小于等于256,超长截取。 |
measuring | ResourceMeasuring | 否 | 资源性能指标 | ResourceMeasuring 类型,类型定义详见下文。 |
traceContext | TraceContext | 否 | 链路追踪上下文信息 | TraceContext 类型,类型定义详见下文。 |
ResourceMeasuring 用于记录网络请求的性能指标。
属性名 | 类型 | 是否必填 | 说明 | 参数限制 |
duration | number | 是 | 资源加载总耗时 | 单位:毫秒(ms) |
size | number | 是 | 资源大小 | 单位:字节(byte) |
connectDuration | number | 否 | TCP 连接耗时 | 单位:毫秒(ms),默认 0 |
sslDuration | number | 否 | SSL/TLS 握手耗时 | 单位:毫秒(ms),默认 0 |
dnsDuration | number | 否 | DNS 解析耗时 | 单位:毫秒(ms),默认 0 |
redirectDuration | number | 否 | 重定向耗时 | 单位:毫秒(ms),默认 0 |
firstByteDuration | number | 否 | 首字节耗时(TTFB) | 单位:毫秒(ms),默认 0 |
downloadDuration | number | 否 | 下载响应耗时 | 单位:毫秒(ms),默认 0 |
示例:
使用示例:
// 创建性能指标
const measuring = new ResourceMeasuring(
1250, // duration: 总耗时 1250ms
102400, // size: 100KB
50, // connectDuration: TCP连接 50ms
30, // sslDuration: SSL握手 30ms
20, // dnsDuration: DNS解析 20ms
0, // redirectDuration: 无重定向
100, // firstByteDuration: 首字节 100ms
1050 // downloadDuration: 下载 1050ms
);
AlibabaCloudRum.setCustomResource(
'api',
'https://api.example.com/data/list',
'POST',
200,
'',
true,
'cdn',
undefined,
measuring
);进阶功能-自定义链路追踪
如果需要进阶配合自定义链路追踪功能,需要手动将生成的追踪头插入到 HTTP 请求中,并将 TraceContext 作为参数传入 setCustomResource 中,以实现分布式链路追踪。
TraceContext用于分布式链路追踪的上下文信息,支持 W3C Trace Context 和 Apache SkyWalking 协议。
参数 | 类型 | 是否必填 | 说明 | 参数限制 |
protocol | TraceProtocol | 是 | 链路追踪协议类型 |
|
traceId | string | 是 | Trace ID | 调用 |
spanId | string | 是 | Span ID | 调用 |
parentSpanId | string | 否 | 父 Span ID | 格式要求同 spanId,可选 |
sampled | number | 否 | 采样标志 | 1=采样,0=不采样,默认 1 |
示例:
import {
TraceContext,
TraceProtocol,
TraceIdGenerator,
TraceHeaderWriter,
ResourceMeasuring,
AlibabaCloudRum
} from '@alibabacloud_rum/harmony_sdk'
// 1. 创建 TraceContext
const traceId = TraceIdGenerator.generateTraceId(TraceProtocol.W3C);
const spanId = TraceIdGenerator.generateSpanId(TraceProtocol.W3C);
const traceContext = new TraceContext(TraceProtocol.W3C, traceId, spanId, undefined, 1);
// 2. 生成追踪头
const traceHeaders = TraceHeaderWriter.generateHeadersRecord(traceContext);
// 3. 发起 HTTP 请求,带上追踪头
// ... 将 traceHeaders 插入到网络请求的 header 中
// 4. 创建性能指标
const measuring = new ResourceMeasuring(
1250, // duration: 总耗时 1250ms
102400, // size: 100KB
);
// 5. 上报自定义数据
AlibabaCloudRum.setCustomResource(
'api',
'https://api.example.com/data',
'POST',
response.responseCode,
'',
true,
undefined,
measuring,
traceContext // 传入 TraceContext
);