RUM 配置¶
RUM 初始化配置¶
//开启 rum
FTRumConfig *rumConfig = [[FTRumConfig alloc]initWithAppid:appid];
rumConfig.enableTraceUserView = YES;
rumConfig.deviceMetricsMonitorType = FTDeviceMetricsMonitorAll;
rumConfig.monitorFrequency = FTMonitorFrequencyRare;
rumConfig.enableTraceUserAction = YES;
rumConfig.enableTraceUserResource = YES;
rumConfig.enableTrackAppFreeze = YES;
rumConfig.enableTrackAppCrash = YES;
rumConfig.enableTrackAppANR = YES;
rumConfig.errorMonitorType = FTErrorMonitorAll;
[[FTMobileAgent sharedInstance] startRumWithConfigOptions:rumConfig];
let rumConfig = FTRumConfig(appid: appid)
rumConfig.enableTraceUserView = true
rumConfig.deviceMetricsMonitorType = .all
rumConfig.monitorFrequency = .rare
rumConfig.enableTraceUserAction = true
rumConfig.enableTraceUserResource = true
rumConfig.enableTrackAppFreeze = true
rumConfig.enableTrackAppCrash = true
rumConfig.enableTrackAppANR = true
rumConfig.errorMonitorType = .all
FTMobileAgent.sharedInstance().startRum(withConfigOptions: rumConfig)
| 属性 | 类型 | 必须 | 含义 |
|---|---|---|---|
| appid | NSString | 是 | 用户访问监测应用 ID 唯一标识。对应设置 RUM appid,才会开启 RUM 的采集功能,获取 appid 方法 |
| samplerate | int | 否 | 采样率。取值范围 [0,100],0 表示不采集,100 表示全采集,默认值为 100。作用域为同一 session_id 下所有 View、Action、LongTask、Error 数据 |
| sessionOnErrorSampleRate | int | 否 | 设置错误采集率,当会话未被 samplerate 采样时,若会话期间发生错误,可以采集到错误前 1 分钟范围的数据,取值范围 [0,100],0 表示不采集,100 表示全采集,默认值为 0。作用域为同一 session_id 下所有 View、Action、LongTask、Error 数据。SDK 1.5.16 以上支持 |
| enableTrackAppCrash | BOOL | 否 | 设置是否需要采集崩溃日志。默认 NO |
| enableTrackAppANR | BOOL | 否 | 采集 ANR 卡顿无响应事件。默认 NO |
| enableTrackAppFreeze | BOOL | 否 | 采集 UI 卡顿事件。默认 NO。可通过 -setEnableTrackAppFreeze:freezeDurationMs: 方法开启采集卡顿并设置卡顿阈值 |
| freezeDurationMs | long | 否 | 设置 UI 卡顿的阈值,取值范围 [100,),单位毫秒,默认 250ms。SDK 1.5.7 以上版本支持 |
| enableTraceUserView | BOOL | 否 | 设置是否追踪用户 View 操作。默认 NO |
| enableTraceUserAction | BOOL | 否 | 设置是否追踪用户 Action 操作。默认 NO。可以通过 view.accessibilityIdentifier 自定义 action_name |
| enableTraceUserResource | BOOL | 否 | 设置是否追踪用户网络请求。默认 NO,仅作用于 native http。注意:通过 [NSURLSession sharedSession] 发起的网络请求无法采集性能数据;SDK 1.5.9 及以上支持采集通过 Swift 的 URLSession async/await APIs 发起的网络请求 |
| resourceUrlHandler | FTResourceUrlHandler | 否 | 自定义采集 resource 规则。默认不过滤。返回 NO 表示要采集,YES 表示不需要采集 |
| errorMonitorType | FTErrorMonitorType | 否 | 错误事件监控补充类型。在采集的崩溃数据中添加监控信息。FTErrorMonitorBattery 为电池余量,FTErrorMonitorMemory 为内存用量,FTErrorMonitorCpu 为 CPU 占有率,默认不设置 |
| deviceMetricsMonitorType | FTDeviceMetricsMonitorType | 否 | 视图的性能监控类型,默认不设置。在采集的 View 数据中添加对应监控项信息。FTDeviceMetricsMonitorMemory 监控当前应用使用内存情况,FTDeviceMetricsMonitorCpu 监控 CPU 跳动次数,FTDeviceMetricsMonitorFps 监控屏幕帧率 |
| monitorFrequency | FTMonitorFrequency | 否 | 视图的性能监控采样周期。FTMonitorFrequencyDefault 500ms(默认),FTMonitorFrequencyFrequent 100ms,FTMonitorFrequencyRare 1000ms |
| enableResourceHostIP | BOOL | 否 | 是否采集请求目标域名地址的 IP。>= iOS 13.0、>= tvOS 13.0 下支持 |
| globalContext | NSDictionary | 否 | 添加自定义标签,用于用户监测数据源区分。如果需要使用追踪功能,则参数 key 为 track_id,value 为任意数值。添加规则请查阅 此处 |
| rumCacheLimitCount | int | 否 | RUM 最大缓存量。默认 100_000,SDK 1.5.8 以上版本支持该参数 |
| rumDiscardType | FTRUMCacheDiscard | 否 | 设置 RUM 丢弃规则。默认 FTRUMCacheDiscard。FTRUMCacheDiscard 当 RUM 数据数量大于最大值时,丢弃追加数据;FTRUMDiscardOldest 当 RUM 数据大于最大值时,丢弃老数据。SDK 1.5.8 以上版本支持该参数 |
| resourcePropertyProvider | FTResourcePropertyProvider | 否 | 通过 block 回调添加 RUM Resource 自定义属性。SDK 1.5.10 以上版本支持该参数。优先级低于 URLSession 自定义采集 |
| enableTraceWebView | BOOL | 否 | 设置开启采集 WebView 数据,默认 YES。SDK 1.5.17 以上支持 |
| allowWebViewHost | NSArray | 否 | 设置允许数据追踪的 WebView host 地址,nil 时全采集,默认为 nil。SDK 1.5.17 以上支持 |
| sessionTaskErrorFilter | FTSessionTaskErrorFilter | 否 | 设置是否拦截 URLSessionTask Error,确认拦截返回 YES,不拦截返回 NO,拦截后 RUM-Error 不采集该条错误。SDK 1.5.17 以上支持 |
| viewTrackingHandler | FTViewTrackingHandler | 否 | 自定义追踪 View 逻辑,用于决定哪些 ViewController 需要作为 RUM View 进行监控和自定义 View Name。生效条件:enableTraceUserView = YES。SDK 1.5.18 以上支持,使用示例请看 这里 |
| actionTrackingHandler | FTActionTrackingHandler | 否 | 自定义追踪 Action 逻辑,用于筛选需要记录的 RUM Action 事件和自定义 Action Name。生效条件:enableTraceUserAction = YES。SDK 1.5.18 以上支持,使用示例请看 这里 |
| crashMonitoring | FTCrashMonitorType | 否 | 配置 SDK 崩溃监控的类型范围,默认为 FTCrashMonitorTypeHighCompatibility(高兼容模式预设宏)。生效条件:enableTrackAppCrash = YES。注意:需要指定 FTCrashMonitorTypeSystem | FTCrashMonitorTypeApplicationState,这些能为报告提供重要信息。SDK 1.5.19 以上支持 |
RUM 用户数据追踪¶
FTRUMConfig 配置 enableTraceUserAction、enableTraceUserView、enableTraceUserResource、enableTrackAppFreeze、enableTrackAppCrash 和 enableTrackAppANR 来实现 Action、View、Resource、LongTask、Error 数据的自动采集追踪获取数据。如果想自定义采集,可以通过 FTExternalDataManager 来上报数据。
View¶
使用方法¶
/// 创建页面
///
/// 在 `-startViewWithName` 方法前调用,该方法用于记录页面的加载时间,如果无法获得加载时间该方法可以不调用。
/// - Parameters:
/// - viewName: 页面名称
/// - loadTime: 页面加载时间(纳秒级)
-(void)onCreateView:(NSString *)viewName loadTime:(NSNumber *)loadTime;
/// 进入页面
/// - Parameters:
/// - viewName: 页面名称
/// - property: 事件自定义属性(可选)
-(void)startViewWithName:(NSString *)viewName property:(nullable NSDictionary *)property;
/// 更新当前 RUM View 的加载时间。
/// 必须在 `-startView` 和 `-stopView` 方法之间调用才能生效。
/// - Parameter duration: 加载时长(纳秒级)。
-(void)updateViewLoadingTime:(NSNumber *)duration;
/// 离开页面
/// - Parameter property: 事件自定义属性(可选)
-(void)stopViewWithProperty:(nullable NSDictionary *)property;
/// 创建页面
///
/// 在 `-startViewWithName` 方法前调用,该方法用于记录页面的加载时间,如果无法获得加载时间该方法可以不调用。
/// - Parameters:
/// - viewName: 页面名称
/// - loadTime: 页面加载时间(ns)
open func onCreateView(_ viewName: String, loadTime: NSNumber)
/// 进入页面
/// - Parameters:
/// - viewName: 页面名称
/// - property: 事件自定义属性(可选)
open func startView(withName viewName: String, property: [AnyHashable : Any]?)
/// 更新当前 RUM View 的加载时间。
/// 必须在 `-startView` 和 `-stopView` 方法之间调用才能生效。
/// - Parameter duration: 加载时长(纳秒级)。
open func updateViewLoadingTime(_ duration: NSNumber)
/// 离开页面
/// - Parameter property: 事件自定义属性(可选)
open func stopView(withProperty property: [AnyHashable : Any]?)
代码示例¶
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
// 场景 1:
[[FTExternalDataManager sharedManager] startViewWithName:@"TestVC"];
// 场景 2:动态参数
[[FTExternalDataManager sharedManager] startViewWithName:@"TestVC" property:@{@"custom_key":@"custom_value"}];
}
-(void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
// 场景 1:
[[FTExternalDataManager sharedManager] stopView];
// 场景 2:动态参数
[[FTExternalDataManager sharedManager] stopViewWithProperty:@{@"custom_key":@"custom_value"}];
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// 场景 1:
FTExternalDataManager.shared().startView(withName: "TestVC")
// 场景 2:动态参数
FTExternalDataManager.shared().startView(withName: "TestVC",property: ["custom_key":"custom_value"])
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
// 场景 1:
FTExternalDataManager.shared().stopView()
// 场景 2:动态参数
FTExternalDataManager.shared().stopView(withProperty: ["custom_key":"custom_value"])
}
Action¶
使用方法¶
/// 启动 RUM Action。
///
/// RUM 会绑定该 Action 可能触发的 Resource、Error、LongTask 事件。避免在 0.1 s 内多次添加,同一个 View 在同一时间只会关联一个 Action,在上一个 Action 未结束时,新增的 Action 会被丢弃。
/// 与 `addAction:actionType:property` 方法添加 Action 互不影响。
///
/// - Parameters:
/// - actionName: 事件名称
/// - actionType: 事件类型
/// - property: 事件自定义属性(可选)
- (void)startAction:(NSString *)actionName actionType:(NSString *)actionType property:(nullable NSDictionary *)property;
/// 添加 Action 事件.无 duration,无丢弃逻辑
///
/// 与 `startAction:actionType:property:` 启动的 RUM Action 互不影响。
/// - Parameters:
/// - actionName: 事件名称
/// - actionType: 事件类型
/// - property: 事件自定义属性(可选)
- (void)addAction:(NSString *)actionName actionType:(NSString *)actionType property:(nullable NSDictionary *)property;
/// 启动 RUM Action。
///
/// RUM 会绑定该 Action 可能触发的 Resource、Error、LongTask 事件。避免在 0.1 s 内多次添加,同一个 View 在同一时间只会关联一个 Action,在上一个 Action 未结束时,新增的 Action 会被丢弃。
/// 与 `addAction:actionType:property` 方法添加 Action 互不影响。
///
/// - Parameters:
/// - actionName: 事件名称
/// - actionType: 事件类型
/// - property: 事件自定义属性(可选)
open func startAction(_ actionName: String, actionType: String, property: [AnyHashable : Any]?)
/// 添加 Action 事件.无 duration,无丢弃逻辑
///
/// 与 `startAction:actionType:property:` 启动的 RUM Action 互不影响。
/// - Parameters:
/// - actionName: 事件名称
/// - actionType: 事件类型
/// - property: 事件自定义属性(可选)
open func addAction(_ actionName: String, actionType: String, property: [AnyHashable : Any]?)
代码示例¶
Error¶
使用方法¶
/// 添加 Error 事件
/// - Parameters:
/// - type: error 类型
/// - message: 错误信息
/// - stack: 堆栈信息
/// - property: 事件自定义属性(可选)
- (void)addErrorWithType:(NSString *)type message:(NSString *)message stack:(NSString *)stack property:(nullable NSDictionary *)property;
/// 添加 Error 事件
/// - Parameters:
/// - type: error 类型
/// - state: 程序运行状态
/// - message: 错误信息
/// - stack: 堆栈信息
/// - property: 事件自定义属性(可选)
- (void)addErrorWithType:(NSString *)type state:(FTAppState)state message:(NSString *)message stack:(NSString *)stack property:(nullable NSDictionary *)property;
/// 添加 Error 事件
/// - Parameters:
/// - type: error 类型
/// - message: 错误信息
/// - stack: 堆栈信息
/// - property: 事件自定义属性(可选)
open func addError(withType: String, message: String, stack: String, property: [AnyHashable : Any]?)
/// 添加 Error 事件
/// - Parameters:
/// - type: error 类型
/// - state: 程序运行状态
/// - message: 错误信息
/// - stack: 堆栈信息
/// - property: 事件自定义属性(可选)
open func addError(withType type: String, state: FTAppState, message: String, stack: String, property: [AnyHashable : Any]?)
代码示例¶
// 场景1
[[FTExternalDataManager sharedManager] addErrorWithType:@"type" message:@"message" stack:@"stack"];
// 场景2: 动态参数
[[FTExternalDataManager sharedManager] addErrorWithType:@"ios_crash" message:@"crash_message" stack:@"crash_stack" property:@{@"custom_key":@"custom_value"}];
// 场景3: 动态参数
[[FTExternalDataManager sharedManager] addErrorWithType:@"ios_crash" state:FTAppStateUnknown message:@"crash_message" stack:@"crash_stack" property:@{@"custom_key":@"custom_value"}];
// 场景1
FTExternalDataManager.shared().addError(withType: "custom_type", message: "custom_message", stack: "custom_stack")
// 场景2: 动态参数
FTExternalDataManager.shared().addError(withType: "custom_type", message: "custom_message", stack: "custom_stack",property: ["custom_key":"custom_value"])
// 场景3: 动态参数
FTExternalDataManager.shared().addError(withType: "custom_type", state: .unknown, message: "custom_message", stack: "custom_stack", property: ["custom_key":"custom_value"])
LongTask¶
使用方法¶
代码示例¶
Resource¶
使用方法¶
/// HTTP 请求开始
/// - Parameters:
/// - key: 请求标识
/// - property: 事件自定义属性(可选)
- (void)startResourceWithKey:(NSString *)key property:(nullable NSDictionary *)property;
/// HTTP 添加请求数据
///
/// - Parameters:
/// - key: 请求标识
/// - metrics: 请求相关性能属性
/// - content: 请求相关数据
- (void)addResourceWithKey:(NSString *)key metrics:(nullable FTResourceMetricsModel *)metrics content:(FTResourceContentModel *)content;
/// HTTP 请求结束
/// - Parameters:
/// - key: 请求标识
/// - property: 事件自定义属性(可选)
- (void)stopResourceWithKey:(NSString *)key property:(nullable NSDictionary *)property;
/// HTTP 请求开始
/// - Parameters:
/// - key: 请求标识
/// - property: 事件自定义属性(可选)
open func startResource(withKey key: String, property: [AnyHashable : Any]?)
/// HTTP 请求结束
/// - Parameters:
/// - key: 请求标识
/// - property: 事件自定义属性(可选)
open func stopResource(withKey key: String, property: [AnyHashable : Any]?)
/// HTTP 添加请求数据
///
/// - Parameters:
/// - key: 请求标识
/// - metrics: 请求相关性能属性
/// - content: 请求相关数据
open func addResource(withKey key: String, metrics: FTResourceMetricsModel?, content: FTResourceContentModel)
代码示例¶
//第一步:请求开始前
[[FTExternalDataManager sharedManager] startResourceWithKey:key];
//第二步:请求完成
[[FTExternalDataManager sharedManager] stopResourceWithKey:key];
//第三步:拼接 Resource 数据
//FTResourceContentModel 数据
FTResourceContentModel *content = [[FTResourceContentModel alloc]init];
content.httpMethod = request.HTTPMethod;
content.requestHeader = request.allHTTPHeaderFields;
content.responseHeader = httpResponse.allHeaderFields;
content.httpStatusCode = httpResponse.statusCode;
content.responseBody = responseBody;
//ios native
content.error = error;
//如果能获取到各阶段的时间数据
//FTResourceMetricsModel
//ios native 获取到 NSURLSessionTaskMetrics 数据 直接使用 FTResourceMetricsModel 的初始化方法
FTResourceMetricsModel *metricsModel = [[FTResourceMetricsModel alloc]initWithTaskMetrics:metrics];
//其他平台 所有时间数据以纳秒为单位
FTResourceMetricsModel *metricsModel = [[FTResourceMetricsModel alloc]init];
//第四步:add resource 如果没有时间数据 metrics 传 nil
[[FTExternalDataManager sharedManager] addResourceWithKey:key metrics:metricsModel content:content];
//第一步:请求开始前
FTExternalDataManager.shared().startResource(withKey: key)
//第二步:请求完成
FTExternalDataManager.shared().stopResource(withKey: resource.key)
//第三步:① 拼接 Resource 数据
let contentModel = FTResourceContentModel(request: task.currentRequest!, response: task.response as? HTTPURLResponse, data: resource.data, error: error)
//② 如果能获取到各阶段的时间数据
//FTResourceMetricsModel
//ios native 获取到 NSURLSessionTaskMetrics 数据 直接使用 FTResourceMetricsModel 的初始化方法
var metricsModel:FTResourceMetricsModel?
if let metrics = resource.metrics {
metricsModel = FTResourceMetricsModel(taskMetrics:metrics)
}
//其他平台 所有时间数据以纳秒为单位
metricsModel = FTResourceMetricsModel()
...
//第四步:add resource 如果没有时间数据 metrics 传 nil
FTExternalDataManager.shared().addResource(withKey: resource.key, metrics: metricsModel, content: contentModel)