RUM 配置¶
RUM 初始化配置¶
FTSdk.initRUMWithConfig(
new FTRUMConfig()
.setRumAppId(RUM_APP_ID)
.setEnableTraceUserView(true)
.setDeviceMetricsMonitorType(DeviceMetricsMonitorType.ALL.getValue())
.setEnableTraceUserAction(true)
.setEnableTraceUserResource(true)
.setEnableTrackAppUIBlock(true)
.setEnableTrackAppCrash(true)
.setEnableTrackAppANR(true)
.setExtraMonitorTypeWithError(ErrorMonitorType.ALL.getValue())
);
FTSdk.initRUMWithConfig(
FTRUMConfig()
.setRumAppId(RUM_APP_ID)
.setEnableTraceUserView(true)
.setDeviceMetricsMonitorType(DeviceMetricsMonitorType.ALL.getValue())
.setEnableTraceUserAction(true)
.setEnableTraceUserResource(true)
.setEnableTrackAppUIBlock(true)
.setEnableTrackAppCrash(true)
.setEnableTrackAppANR(true)
.setExtraMonitorTypeWithError(ErrorMonitorType.ALL.getValue())
)
| 方法名 | 类型 | 必须 | 含义 |
|---|---|---|---|
| setRumAppId | String | 是 | 设置 Rum AppId。对应设置 RUM appid,才会开启 RUM 的采集功能,获取 appid 方法 |
| setSamplingRate | Float | 否 | 设置采集率,取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 1。作用域为同一 session_id 下所有 View、Action、LongTask、Error 数据 |
| setSessionErrorSampleRate | Float | 否 | 设置错误采集率。当会话未被 setSamplingRate 采样时,若会话期间发生错误,可以采集到错误前 1 分钟范围的数据。取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 0。作用域为同一 session_id 下所有 View、Action、LongTask、Error 数据,ft-sdk 1.6.11 以上支持 |
| setEnableTrackAppCrash | Boolean | 否 | 是否上报 App 崩溃日志,默认为 false,开启后会在错误分析中显示错误堆栈数据。关于崩溃日志中混淆内容转换的问题,可参考 符号文件上传。ft-sdk 1.5.1 以上版本,可以通过 extraLogCatWithJavaCrash、extraLogCatWithNativeCrash 设置在 Java Crash 和 Native Crash 是否显示 logcat |
| setExtraMonitorTypeWithError | Array | 否 | 设置辅助监控信息,添加附加监控数据到 Rum 崩溃数据中。ErrorMonitorType.BATTERY 为电池余量,ErrorMonitorType.MEMORY 为内存用量,ErrorMonitorType.CPU 为 CPU 占有率,默认不设置 |
| setDeviceMetricsMonitorType | Array | 否 | 设置 View 监控信息,在 View 周期中,添加监控数据。DeviceMetricsMonitorType.BATTERY 监控当前页的最高电流输出情况,DeviceMetricsMonitorType.MEMORY 监控当前应用使用内存情况,DeviceMetricsMonitorType.CPU 监控 CPU 跳动次数,DeviceMetricsMonitorType.FPS 监控屏幕帧率。监控周期可选 DetectFrequency.DEFAULT 500 毫秒、DetectFrequency.FREQUENT 100 毫秒、DetectFrequency.RARE 1 秒,默认不设置 |
| setEnableTrackAppANR | Boolean | 否 | 是否开启 ANR 检测,默认为 false。ft-sdk 1.5.1 以上版本,可以通过 extraLogCatWithANR 设置 ANR 中是否显示 logcat |
| setEnableTrackAppUIBlock | Boolean, long | 否 | 是否开启 UI 卡顿检测,默认为 false,ft-sdk 1.6.4 以上版本可以通过 blockDurationMs 控制检测时间范围 [100,),单位毫秒,默认是 1 秒 |
| setEnableTraceUserAction | Boolean | 否 | 是否自动追踪用户操作,目前只支持用户启动和点击操作。该配置依赖 ft-plugin,默认为 false |
| setEnableTraceUserView | Boolean | 否 | 是否自动追踪用户页面操作,该配置依赖 ft-plugin,默认为 false |
| setEnableTraceUserViewInFragment | Boolean | 否 | 是否自动追踪 Fragment 类型页面数据,该配置依赖 ft-plugin,默认为 false,ft-sdk 1.6.11 以上支持 |
| setEnableTraceUserResource | Boolean | 否 | 是否自动追动用户网络请求,该配置依赖 ft-plugin,仅支持 OkHttp,默认为 false |
| setEnableResourceHostIP | Boolean | 否 | 是否采集请求目标域名地址的 IP。作用域:只影响 EnableTraceUserResource 为 true 的默认采集。自定义 Resource 采集,需要使用 FTResourceEventListener.FTFactory(true) 来开启这个功能。另外,单个 OkHttp 对相同域名存在 IP 缓存机制,相同 OkHttpClient,在连接服务端 IP 不发生变化的前提下,只会生成一次 |
| setResourceUrlHandler | Callback | 否 | 设置需要过滤的 Resource 条件,默认不过滤 |
| setOkHttpEventListenerHandler | Callback | 否 | ASM 设置全局 OkHttp EventListener,默认不设置 |
| setOkHttpResourceContentHandler | Callback | 否 | ASM 设置全局 FTResourceInterceptor.ContentHandlerHelper,默认不设置,ft-sdk 1.6.7 以上支持,自定义 Resource |
| addGlobalContext | Dictionary | 否 | 添加自定义标签,用于用户监测数据源区分,如果需要使用追踪功能,则参数 key 为 track_id,value 为任意数值,添加规则注意事项请查阅此处 |
| setRumCacheLimitCount | int | 否 | 本地缓存 RUM 限制数量 [10_000,),默认是 100_000,ft-sdk 1.6.6 以上支持 |
| setEnableTraceWebView | Boolean | 否 | 是否开启通过 Android SDK 采集 WebView 数据,默认为 true,ft-sdk 1.6.12 以上支持 |
| setAllowWebViewHost | Array | 否 | 设置允许数据追踪的 WebView host 地址,null 为全采集,默认为 null,ft-sdk 1.6.12 以上支持 |
| setViewActivityTrackingHandler | FTViewActivityTrackingHandler | 否 | 用于自定义 Activity 视图的跟踪方式。当 Activity 生命周期事件发生时,此处理器会被调用来决定如何跟踪该 Activity,默认不做处理,ft-sdk 1.6.13 以上支持 |
| setViewFragmentTrackingHandler | FTViewFragmentTrackingHandler | 否 | 用于自定义 Fragment 视图的跟踪方式。当 Fragment 生命周期事件发生时,此处理器会被调用来决定如何跟踪该 Fragment。默认不做处理,ft-sdk 1.6.13 以上支持 |
| setActionTrackingHandler | FTActionTrackingHandler | 否 | 用于自定义用户操作的跟踪方式。当用户执行操作时,此处理器会被调用来决定如何跟踪该操作,默认不做处理,ft-sdk 1.6.13 以上支持 |
RUM 手动埋点¶
在 FTRUMConfig 配置 enableTraceUserAction、enableTraceUserView、enableTraceUserResource、setEnableTrackAppUIBlock、setEnableTrackAppCrash 和 setEnableTrackAppANR 来实现 Action、View、Resource、LongTask、Error 的自动采集。若需自定义采集,可通过 FTRUMGlobalManager 手动上报。
Action¶
使用方法¶
/**
* 添加 Action
*
* @param actionName action 名称
* @param actionType action 类型
* @param property 附加属性参数(可选)
*/
public void startAction(String actionName, String actionType, HashMap<String, Object> property)
/**
* 添加 Action, 此类数据无法关联 Error,Resource,LongTask 数据
*
* @param actionName action 名称
* @param actionType action 类型
* @param duration 纳秒,持续时间(可选)
* @param property 扩展属性(可选)
*/
public void addAction(String actionName, String actionType, long duration, HashMap<String, Object> property)
/**
* 添加 action
*
* @param actionName action 名称
* @param actionType action 类型
* @param property 附加属性参数(可选)
*/
fun startAction(actionName: String, actionType: String, property: HashMap<String, Any>)
/**
* 添加 Action
*
* @param actionName action 名称
* @param actionType action 类型
* @param duration 纳秒,持续时间(可选)
* @param property 扩展属性(可选)
*/
fun addAction(actionName: String, actionType: String, duration: Long, property: HashMap<String, Any>)
startAction内部有计算耗时算法,计算期间会尽量与附近发生的Resource、LongTask、Error数据做数据关联,设有 100 ms 频繁触发保护,建议用于用户操作类型的数据。如果有频繁调用的需求请使用addAction,这个数据不会与startAction发生冲突,并且不与当下Resource、LongTask、Error进行数据关联。
代码示例¶
// 场景1
FTRUMGlobalManager.get().startAction("login", "action_type");
// 场景2: 动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
FTRUMGlobalManager.get().startAction("login", "action_type", map);
// 场景1
FTRUMGlobalManager.get().addAction("login", "action_type");
// 场景2: 动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
FTRUMGlobalManager.get().addAction("login", "action_type", map);
// 场景1
FTRUMGlobalManager.get().startAction("login", "action_type")
// 场景2: 动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
FTRUMGlobalManager.get().startAction("login", "action_type", map)
// 场景1
FTRUMGlobalManager.get().addAction("login", "action_type")
// 场景2: 动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
FTRUMGlobalManager.get().addAction("login", "action_type", map)
View¶
使用方法¶
/**
* view 起始
*
* @param viewName 当前页面名称
* @param property 附加属性参数(可选)
*/
public void startView(String viewName, HashMap<String, Object> property)
/**
* view 结束
*
* @param property 附加属性参数(可选)
*/
public void stopView(HashMap<String, Object> property)
/**
* 更新当前 view loading_time 指标,单位纳秒
*
* @param duration duration
*/
public void updateLoadTime(long duration)
/**
* view 起始
*
* @param viewName 当前页面名称
* @param property 附加属性参数(可选)
*/
fun startView(viewName: String, property: HashMap<String, Any>)
/**
* view 结束
*
* @param property 附加属性参数(可选)
*/
fun stopView(property: HashMap<String, Any>)
/**
* 更新当前 view loading_time 指标,单位纳秒
*
* @param duration duration
*/
fun updateLoadTime(duration: Long)
代码示例¶
@Override
protected void onResume() {
super.onResume();
// 场景 1
FTRUMGlobalManager.get().startView("Current Page Name");
// 场景 2: 动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
map.put("ft_key_will_change", "ft_value");
FTRUMGlobalManager.get().startView("Current Page Name", map)
}
@Override
protected void onPause() {
super.onPause();
// 场景 1
FTRUMGlobalManager.get().stopView();
// 场景 2 : 动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key_will_change", "ft_value_change"); //ft_key_will_change 的值会在 stopView 时被更新为 ft_value_change
FTRUMGlobalManager.get().stopView(map);
}
override fun onResume() {
super.onResume()
// 场景 1
FTRUMGlobalManager.get().startView("Current Page Name")
// 场景 2: 动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
map["ft_key_will_change"] = "ft_value"
FTRUMGlobalManager.get().startView("Current Page Name", map)
}
override fun onPause() {
super.onPause()
// 场景 1
FTRUMGlobalManager.get().stopView()
// 场景 2 : 动态参数
val map = HashMap<String, Any>()
map["ft_key_will_change"] = "ft_value_change" // ft_key_will_change 这个数值,会在 stopView 时候被修改为 ft_value_change
FTRUMGlobalManager.get().stopView(map)
}
Error¶
使用方法¶
/**
* 添加错误信息
*
* @param log 日志
* @param message 消息
* @param errorType 错误类型, ErrorType
* @param state 程序运行状态
* @param dateline 发生时间,纳秒(可选)
* @param property 附加属性(可选)
*/
public void addError(String log, String message, long dateline, ErrorType errorType,
AppState state, HashMap<String, Object> property)
/**
* 添加错误信息
*
* @param log 日志
* @param message 消息
* @param errorType 错误类型, String
* @param state 程序运行状态
* @param dateline 发生时间,纳秒(可选)
* @param property 附加属性(可选)
*/
public void addError(String log, String message, long dateline, String errorType,
AppState state, HashMap<String, Object> property)
/**
* 添加错误信息
*
* @param log 日志
* @param message 消息
* @param errorType 错误类型, ErrorType
* @param state 程序运行状态
* @param dateline 发生时间,纳秒(可选)
* @param property 附加属性(可选)
*/
fun addError(log: String, message: String, dateline: Long, errorType: ErrorType, state: AppState, property: HashMap<String, Any>)
/**
* 添加错误信息
*
* @param log 日志
* @param message 消息
* @param errorType 错误类型, String
* @param state 程序运行状态
* @param dateline 发生时间,纳秒(可选)
* @param property 附加属性(可选)
*/
fun addError(log: String, message: String, dateline: Long, errorType: String, state: AppState, property: HashMap<String, Any>)
代码示例¶
// 场景 1:
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN);
// 场景 2: 延迟记录发生的错误,这里的时间一般为错误发生的时间
FTRUMGlobalManager.get().addError("error log", "error msg", 16789000000000000000L, ErrorType.JAVA, AppState.RUN);
// 场景 3:动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN, map);
// 场景 1:
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN)
// 场景 2: 延迟记录发生的错误,这里的时间一般为错误发生的时间
FTRUMGlobalManager.get().addError("error log", "error msg", 16789000000000000000, ErrorType.JAVA, AppState.RUN)
// 场景 3:动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN, map)
LongTask¶
使用方法¶
代码示例¶
Resource¶
使用方法¶
/**
* resource 起始
*
* @param resourceId 资源 Id
* @param property 附加属性参数(可选)
*/
public void startResource(String resourceId, HashMap<String, Object> property)
/**
* resource 终止
*
* @param resourceId 资源 Id
* @param property 附加属性参数(可选)
*/
public void stopResource(final String resourceId, HashMap<String, Object> property)
/**
* 设置网络传输内容
*
* @param resourceId resourceId
* @param params params
* @param netStatusBean netStatusBean
*/
public void addResource(String resourceId, ResourceParams params, NetStatusBean netStatusBean)
/**
* resource 起始
*
* @param resourceId 资源 Id(可选)
*/
fun startResource(resourceId: String, property: HashMap<String, Any>)
/**
* resource 终止
*
* @param resourceId 资源 Id
* @param property 附加属性参数(可选)
*/
fun stopResource(resourceId: String, property: HashMap<String, Any>)
/**
* 设置网络传输内容
*
* @param resourceId resourceId
* @param params params
* @param netStatusBean netStatusBean
*/
fun addResource(resourceId: String, params: ResourceParams, netStatusBean: NetStatusBean)
代码示例¶
// 场景 1
// 请求开始
FTRUMGlobalManager.get().startResource("resourceId");
// ...
// 请求结束
FTRUMGlobalManager.get().stopResource("resourceId");
// 最后,在请求结束之后,发送请求相关的数据指标
ResourceParams params = new ResourceParams();
params.setUrl("https://guance.com");
params.setResponseContentType(response.header("Content-Type"));
params.setResponseConnection(response.header("Connection"));
params.setResponseContentEncoding(response.header("Content-Encoding"));
params.setResponseHeader(response.headers().toString());
params.setRequestHeader(request.headers().toString());
params.setResourceStatus(response.code());
params.setResourceMethod(request.method());
NetStatusBean bean = new NetStatusBean();
bean.setTcpStartTime(60000000);
// ...
FTRUMGlobalManager.get().addResource("resourceId", params, bean);
// 场景 2 :动态参数使用
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
map.put("ft_key_will_change", "ft_value");
FTRUMGlobalManager.get().startResource("resourceId", map);
// ...
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key_will_change", "ft_value_change"); // ft_key_will_change 这个数值,会在 stopResource 时候被修改为 ft_value_change
FTRUMGlobalManager.get().stopResource(uuid, map);
// 场景 1
// 请求开始
FTRUMGlobalManager.get().startResource("resourceId")
// 请求结束
FTRUMGlobalManager.get().stopResource("resourceId")
// 最后,在请求结束之后,发送请求相关的数据指标
val params = ResourceParams()
params.url = "https://guance.com"
params.responseContentType = response.header("Content-Type")
params.responseConnection = response.header("Connection")
params.responseContentEncoding = response.header("Content-Encoding")
params.responseHeader = response.headers.toString()
params.requestHeader = request.headers.toString()
params.resourceStatus = response.code
params.resourceMethod = request.method
val bean = NetStatusBean()
bean.tcpStartTime = 60000000
// ...
FTRUMGlobalManager.get().addResource("resourceId", params, bean)
// 场景 2 :动态参数使用
val map = hashMapOf<String, Any>(
"ft_key" to "ft_value",
"ft_key_will_change" to "ft_value"
)
FTRUMGlobalManager.get().startResource("resourceId", map)
// ...
val map = hashMapOf<String, Any>(
"ft_key_will_change" to "ft_value_change"
)
// ft_key_will_change 这个数值,会在 stopResource 时候被修改为 ft_value_change
FTRUMGlobalManager.get().stopResource(uuid, map)
| 方法名 | 必须 | 含义 | 说明 |
|---|---|---|---|
| NetStatusBean.fetchStartTime | 否 | 请求开始时间 | |
| NetStatusBean.tcpStartTime | 否 | tcp 连接时间 | |
| NetStatusBean.tcpEndTime | 否 | tcp 结束时间 | |
| NetStatusBean.dnsStartTime | 否 | dns 开始时间 | |
| NetStatusBean.dnsEndTime | 否 | dns 结束时间 | |
| NetStatusBean.responseStartTime | 否 | 响应开始时间 | |
| NetStatusBean.responseEndTime | 否 | 响应结束时间 | |
| NetStatusBean.sslStartTime | 否 | ssl 开始时间 | |
| NetStatusBean.sslEndTime | 否 | ssl 结束时间 | |
| NetStatusBean.property | 否 | 附加属性 | |
| ResourceParams.url | 是 | url 地址 | |
| ResourceParams.requestHeader | 否 | 请求头参数 | |
| ResourceParams.responseHeader | 否 | 响应头参数 | |
| ResourceParams.responseConnection | 否 | 响应 connection | |
| ResourceParams.responseContentType | 否 | 响应 ContentType | |
| ResourceParams.responseContentEncoding | 否 | 响应 ContentEncoding | |
| ResourceParams.resourceMethod | 否 | 请求方法 | GET, POST 等 |
| ResourceParams.responseBody | 否 | 返回 body 内容 | |
| ResourceParams.property | 否 | 附加属性 |
用户信息绑定与解绑¶
使用 FTSdk 进行用户绑定和解绑。
使用方法¶
UserData¶
| 方法名 | 含义 | 必须 | 注意 |
|---|---|---|---|
| setId | 设置用户 ID | 否 | |
| setName | 设置用户名 | 否 | |
| setEmail | 设置邮箱 | 否 | |
| setExts | 设置用户扩展 | 否 | 添加规则请查阅 应用接入 |
代码示例¶
// 可以在用户登录成功后调用此方法用来绑定用户信息
FTSdk.bindRumUserData("001");
UserData userData = new UserData();
userData.setName("test.user");
userData.setId("test.id");
userData.setEmail("test@mail.com");
Map<String, String> extMap = new HashMap<>();
extMap.put("ft_key", "ft_value");
userData.setExts(extMap);
FTSdk.bindRumUserData(userData);
// 可以在用户退出登录后调用此方法来解绑用户信息
FTSdk.unbindRumUserData();
// 可以在用户登录成功后调用此方法用来绑定用户信息
FTSdk.bindRumUserData("001")
// 绑定用户更多数据
val userData = UserData()
userData.name = "test.user"
userData.id = "test.id"
userData.email = "test@mail.com"
val extMap = HashMap<String, String>()
extMap["ft_key"] = "ft_value"
userData.setExts(extMap)
FTSdk.bindRumUserData(userData)
// 可以在用户退出登录后调用此方法来解绑用户信息
FTSdk.unbindRumUserData()