RUM 配置¶
RUM 初始化配置¶
FTRumConfig *rumConfig = [[FTRumConfig alloc] initWithAppid:appid];
rumConfig.enableTrackAppCrash = YES;
rumConfig.enableTrackAppANR = YES;
rumConfig.enableTrackAppFreeze = YES;
rumConfig.enableTraceUserAction = YES;
rumConfig.enableTraceUserView = YES;
rumConfig.enableTraceUserResource = YES;
rumConfig.errorMonitorType = FTErrorMonitorAll;
rumConfig.deviceMetricsMonitorType = FTDeviceMetricsMonitorAll;
[[FTSDKAgent sharedInstance] startRumWithConfigOptions:rumConfig];
let rumConfig = FTRumConfig(appid: appid)
rumConfig.enableTraceUserAction = true
rumConfig.enableTrackAppANR = true
rumConfig.enableTraceUserView = true
rumConfig.enableTraceUserResource = true
rumConfig.enableTrackAppCrash = true
rumConfig.enableTrackAppFreeze = true
rumConfig.errorMonitorType = .all
rumConfig.deviceMetricsMonitorType = .all
rumConfig.monitorFrequency = .rare
FTSDKAgent.sharedInstance().startRum(withConfigOptions: rumConfig)
| 属性 | 类型 | 必须 | 含义 |
|---|---|---|---|
appid |
NSString |
是 | 用户访问监测应用 ID 唯一标识。对应设置 RUM appid,才会开启 RUM 采集功能,获取 appid 方法 |
sampleRate |
int |
否 | 采样率。取值范围 [0,100],0 表示不采集,100 表示全采集,默认值 100。作用域为同一 session_id 下所有 View、Action、LongTask、Error 数据 |
enableTrackAppCrash |
BOOL |
否 | 设置是否需要采集崩溃日志,默认 NO |
enableTrackAppANR |
BOOL |
否 | 采集 ANR 卡顿无响应事件,默认 NO |
enableTrackAppFreeze |
BOOL |
否 | 采集 UI 卡顿事件,默认 NO |
enableTraceUserView |
BOOL |
否 | 设置是否追踪用户 View 操作,默认 NO |
enableTraceUserAction |
BOOL |
否 | 设置是否追踪用户 Action 操作,默认 NO |
enableTraceUserResource |
BOOL |
否 | 设置是否追踪用户网络请求,默认 NO,仅作用于 native http |
resourceUrlHandler |
FTResourceUrlHandler |
否 | 自定义采集 Resource 规则。默认不过滤,返回 NO 表示采集,返回 YES 表示不采集。详细说明见 数据采集自定义规则 |
errorMonitorType |
FTErrorMonitorType |
否 | 错误事件监控补充类型。在采集的崩溃数据中添加监控信息,默认不设置 |
monitorFrequency |
FTMonitorFrequency |
否 | 视图的性能监控采样周期 |
deviceMetricsMonitorType |
FTDeviceMetricsMonitorType |
否 | 视图的性能监控类型,在采集的 View 数据中添加对应监控项信息,默认不设置 |
globalContext |
NSDictionary |
否 | 添加自定义标签,用于用户监测数据源区分。如果需要使用追踪功能,则参数 key 为 track_id,value 为任意数值。添加规则请查阅 自定义标签使用 |
RUM 用户数据追踪¶
可以通过 FTRUMConfig 配置开启自动模式,或手动添加。RUM 相关数据通过 FTGlobalRumManager 单例传入,相关 API 如下。
View¶
若设置 enableTraceUserView = YES 开启自动采集,SDK 将自动采集 Window 的生命周期。以 Window 的生命周期 -becomeKeyWindow 定义 View 的开始,-resignKeyWindow 定义 View 的结束。
页面名称以 NSStringFromClass(window.contentViewController.class) > NSStringFromClass(window.windowController.class) > NSStringFromClass(window) 的优先顺序来设置。
如果 Window 内的视图十分复杂,您可以使用以下 API 自定义采集。
使用方法¶
/// 创建页面
///
/// 在 `-startViewWithName` 方法前调用,该方法用于记录页面的加载时间,如果无法获得加载时间该方法可以不调用。
/// - Parameters:
/// - viewName: 页面名称
/// - loadTime: 页面加载时间(纳秒级)
-(void)onCreateView:(NSString *)viewName loadTime:(NSNumber *)loadTime;
/// 进入页面
/// - Parameters:
/// - viewName: 页面名称
/// - property: 事件自定义属性(可选)
-(void)startViewWithName:(NSString *)viewName property:(nullable NSDictionary *)property;
/// 离开页面
/// - 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]?)
/// 离开页面
/// - Parameter property: 事件自定义属性(可选)
open func stopView(withProperty property: [AnyHashable : Any]?)
代码示例¶
- (void)viewDidAppear{
[super viewDidAppear];
[[FTGlobalRumManager sharedManager] startViewWithName:@"TestVC"];
[[FTGlobalRumManager sharedManager] startViewWithName:@"TestVC" property:@{@"custom_key":@"custom_value"}];
}
-(void)viewDidDisappear{
[super viewDidDisappear];
[[FTGlobalRumManager sharedManager] stopView];
[[FTGlobalRumManager sharedManager] stopViewWithProperty:@{@"custom_key":@"custom_value"}];
}
override func viewDidAppear() {
super.viewDidAppear()
FTExternalDataManager.shared().startView(withName: "TestVC")
FTExternalDataManager.shared().startView(withName: "TestVC", property: ["custom_key":"custom_value"])
}
override func viewDidDisappear() {
super.viewDidDisappear()
FTGlobalRumManager.shared().stopView()
FTGlobalRumManager.shared().stopView(withProperty: ["custom_key":"custom_value"])
}
Action¶
使用方法¶
代码示例¶
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]?)
代码示例¶
[[FTGlobalRumManager sharedManager] addErrorWithType:@"type" message:@"message" stack:@"stack"];
[[FTGlobalRumManager sharedManager] addErrorWithType:@"ios_crash" message:@"crash_message" stack:@"crash_stack" property:@{@"custom_key":@"custom_value"}];
[[FTGlobalRumManager sharedManager] addErrorWithType:@"ios_crash" state:FTAppStateUnknown message:@"crash_message" stack:@"crash_stack" property:@{@"custom_key":@"custom_value"}];
FTGlobalRumManager.shared().addError(withType: "custom_type", message: "custom_message", stack: "custom_stack")
FTGlobalRumManager.shared().addError(withType: "custom_type", message: "custom_message", stack: "custom_stack", property: ["custom_key":"custom_value"])
FTGlobalRumManager.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)
代码示例¶
#import "FTMacOSSDK.h"
[[FTGlobalRumManager sharedManager] startResourceWithKey:key];
[[FTGlobalRumManager sharedManager] stopResourceWithKey:key];
FTResourceContentModel *content = [[FTResourceContentModel alloc] init];
content.httpMethod = request.HTTPMethod;
content.requestHeader = request.allHTTPHeaderFields;
content.responseHeader = httpResponse.allHeaderFields;
content.httpStatusCode = httpResponse.statusCode;
content.responseBody = responseBody;
content.error = error;
FTResourceMetricsModel *metricsModel = [[FTResourceMetricsModel alloc] initWithTaskMetrics:metrics];
metricsModel = [[FTResourceMetricsModel alloc] init];
[[FTGlobalRumManager sharedManager] addResourceWithKey:key metrics:metricsModel content:content];
import FTMacOSSDK
FTGlobalRumManager.shared().startResource(withKey: key)
FTGlobalRumManager.shared().stopResource(withKey: resource.key)
let contentModel = FTResourceContentModel(request: task.currentRequest!, response: task.response as? HTTPURLResponse, data: resource.data, error: error)
var metricsModel: FTResourceMetricsModel?
if let metrics = resource.metrics {
metricsModel = FTResourceMetricsModel(taskMetrics: metrics)
}
metricsModel = FTResourceMetricsModel()
FTGlobalRumManager.shared().addResource(withKey: resource.key, metrics: metricsModel, content: contentModel)