跳转至

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 以上支持
issueDataProvider FTIssueDataProvider 否 为 SDK 自动采集的 Crash 和 ANR RUM Error 同步添加自定义字段。需要分别开启 enableTrackAppCrash 或 enableTrackAppANR,SDK 1.6.7 以上支持。使用方法请参见 Error 自定义字段
viewTrackingHandler FTViewTrackingHandler 否 自定义追踪 View 逻辑,用于决定哪些 ViewController 需要作为 RUM View 进行监控和自定义 View Name。生效条件:enableTraceUserView = YES。SDK 1.5.18 以上支持,使用示例请看 这里
swiftUIViewTrackingHandler FTSwiftUIViewTrackingHandler 否 实验性。自定义 SwiftUI View 自动采集逻辑,用于筛选自动提取到的 SwiftUI View Name,并自定义 RUM View Name。生效条件:enableTraceUserView = YES 且该配置不为空。若无需自定义筛选或命名,可设置 FTDefaultSwiftUIViewTrackingHandler。该实验性 API 后续版本可能调整,SDK 1.6.4 以上支持,使用示例请看 这里
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 以上支持
采样率参数命名

SDK 1.6.6 及以上版本中,samplerate 已废弃,当前仍可使用并与 sampleRate 映射到同一值。新代码建议使用 sampleRate;1.6.6 以下版本请继续使用 samplerate。

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"])
}

SwiftUI View 采集

SwiftUI View 支持自动采集和手动采集:

  • 自动采集(实验性):由 SDK 自动识别页面,并通过 FTRumConfig.swiftUIViewTrackingHandler 统一进行筛选和命名。使用方式请参见 SwiftUI View 自动采集(实验性)。
  • 手动采集:在具体 SwiftUI View 上使用 .ftTrackRUMView(name:property:),显式标记页面的开始和结束,并自定义 View Name 和属性。适合需要稳定页面名称、精确控制 View 生命周期,或自动提取的名称不符合预期的场景。
import SwiftUI
import GuanceSDK
struct HomeView: View {
    var body: some View {
        VStack {
            Text("Home")
        }
        .ftTrackRUMView(
            name: "Home",
            property: ["page_type": "home"]
        )
    }
}

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 事件. 无丢弃逻辑,不会绑定 Resource、Error、LongTask 事件
///
/// 与 `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 事件.无丢弃逻辑,不会绑定 Resource、Error、LongTask 事件
///
/// 与 `startAction:actionType:property:` 启动的 RUM Action 互不影响。
/// - Parameters:
///   - actionName: 事件名称
///   - actionType: 事件类型
///   - property: 事件自定义属性(可选)
open func addAction(_ actionName: String, actionType: String, property: [AnyHashable : Any]?)

代码示例

// startAction
[[FTExternalDataManager sharedManager] startAction:@"action" actionType:@"click" property:@{@"action_property":@"testActionProperty1"}];
// addAction
[[FTExternalDataManager sharedManager] addAction:@"action" actionType:@"click" property:@{@"action_property":@"testActionProperty1"}];
// startAction
FTExternalDataManager.shared().startAction("custom_action", actionType: "click",property: nil)
// addAction
FTExternalDataManager.shared().addAction("custom_action", actionType: "click",property: nil)

SwiftUI Action 手动采集

SwiftUI Action 需要在业务交互处手动补充。对于 Button、NavigationLink、List 条目或自定义手势等 SwiftUI 组件,请在确认发生用户操作的位置主动记录 RUM Action。

SwiftUI Action 支持两种手动采集方式:

  • 在已有事件闭包中调用:使用 FTRUMSwiftUI.trackTapAction(name:property:),不会额外添加手势,适合 Button、NavigationLink、List、滚动视图或已有自定义手势的场景。
  • 使用 View Modifier:使用 .ftTrackRUMTapAction(name:property:count:),会为当前 View 添加一个 simultaneousGesture,适合普通 View 的简单点击采集。

注意:如果同一个点击事件已经通过 FTExternalDataManager 手动采集,请避免再次使用 SwiftUI Action 手动采集,防止重复上报。

import SwiftUI
import GuanceSDK
struct ProductView: View {
    var body: some View {
        Button("Buy") {
            FTRUMSwiftUI.trackTapAction(
                name: "buy_click",
                property: ["source": "product_detail"]
            )

            // 执行业务点击逻辑
            buy()
        }
    }

    private func buy() {
        // ...
    }
}
import SwiftUI
import GuanceSDK
struct ProductCard: View {
    var body: some View {
        Text("Buy")
            .ftTrackRUMTapAction(
                name: "buy_click",
                property: ["source": "product_card"]
            )
    }
}

FTRUMSwiftUI.trackTapAction(name:property:) 是更推荐的手动采集方式,尤其适用于已有点击闭包的组件;.ftTrackRUMTapAction(name:property:count:) 是便捷写法,但由于会额外添加点击手势,在 List、NavigationLink、滚动容器或复杂手势组合中可能影响原有交互,建议改为在原有点击闭包中调用 FTRUMSwiftUI.trackTapAction(name:property:)。

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

使用方法

/// 添加 卡顿 事件
/// - Parameters:
///   - stack: 卡顿堆栈
///   - duration: 卡顿时长(纳秒)
///   - property: 事件自定义属性(可选)
- (void)addLongTaskWithStack:(NSString *)stack duration:(NSNumber *)duration property:(nullable NSDictionary *)property;
/// 添加 卡顿 事件
/// - Parameters:
///   - stack: 卡顿堆栈
///   - duration: 卡顿时长(纳秒)
///   - property: 事件自定义属性(可选)
func addLongTask(withStack: String, duration: NSNumber, property: [AnyHashable : Any]?)

代码示例

// 场景1
[[FTExternalDataManager sharedManager] addLongTaskWithStack:@"stack string" duration:@1000000000];
// 场景2: 动态参数
[[FTExternalDataManager sharedManager] addLongTaskWithStack:@"stack string" duration:@1000000000 property:@{@"custom_key":@"custom_value"}];
// 场景1
FTExternalDataManager.shared().addLongTask(withStack: "stack string", duration: 1000000000)
// 场景2: 动态参数
FTExternalDataManager.shared().addLongTask(withStack: "stack string", duration: 1000000000 ,property: [["custom_key":"custom_value"]])

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)

文档评价

文档内容是否对您有帮助?