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 | 예 | RUM 애플리케이션 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, 네이티브 HTTP에만 적용됩니다. 주의: [NSURLSession sharedSession]을 통해 시작된 네트워크 요청은 성능 데이터를 수집할 수 없습니다. SDK 1.5.9 이상에서는 Swift의 URLSession async/await APIs를 통해 시작된 네트워크 요청 수집을 지원합니다. |
| resourceUrlHandler | FTResourceUrlHandler | 아니요 | 리소스 수집 규칙을 사용자 정의합니다. 기본값은 필터링하지 않습니다. NO를 반환하면 수집, YES를 반환하면 수집하지 않음을 의미합니다. |
| errorMonitorType | FTErrorMonitorType | 아니요 | 오류 이벤트 모니터링 보충 유형입니다. 수집된 충돌 데이터에 모니터링 정보를 추가합니다. FTErrorMonitorBattery는 배터리 잔량, FTErrorMonitorMemory는 메모리 사용량, FTErrorMonitorCpu는 CPU 점유율입니다. 기본값은 설정되지 않음입니다. |
| deviceMetricsMonitorType | FTDeviceMetricsMonitorType | 아니요 | View의 성능 모니터링 유형입니다. 기본값은 설정되지 않음입니다. 수집된 View 데이터에 해당 모니터링 항목 정보를 추가합니다. FTDeviceMetricsMonitorMemory는 현재 애플리케이션의 메모리 사용량 모니터링, FTDeviceMetricsMonitorCpu는 CPU 사용량 모니터링, FTDeviceMetricsMonitorFps는 화면 프레임 속도 모니터링입니다. |
| monitorFrequency | FTMonitorFrequency | 아니요 | View 성능 모니터링 샘플링 주기입니다. 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는 더 이상 사용되지 않습니다(Deprecated). 현재는 계속 사용할 수 있으며 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 수명 주기를 정밀하게 제어해야 하거나, 자동 추출된 이름이 예상과 다른 경우에 적합합니다.
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]?)
코드 예시¶
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 수동 수집을 중복 사용하지 않도록 주의하여 중복 보고를 방지하세요.
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¶
사용 방법¶
코드 예시¶
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)