문제 해결¶
SDK 초기화 예외 검증¶
Debug 환경에서 Guance SDK를 구성하고 애플리케이션을 처음 실행한 후 Xcode의 디버거 콘솔을 확인하세요. SDK는 어설션(assertion)을 사용하여 여러 구성의 정확성을 검사하며, 구성이 잘못된 경우 크래시가 발생하고 관련 경고를 출력합니다.
예: SDK 구성 시 datakit metrics 쓰기 주소를 설정하지 않으면 프로그램이 크래시되고 콘솔에 경고⚠️가 출력됩니다.
*** Assertion failure in +[FTMobileAgent startWithConfigOptions:], FTMobileAgent.m:53
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'datakit metrics 쓰기 주소를 설정해 주세요.'
Debug 디버그 활성화¶
Debug 환경에서는 FTMobileConfig의 enableSDKDebugLog = YES 설정을 활성화하고, Release 환경에서는 비활성화하는 것을 권장합니다. SDK의 디버그 로그는 [FTLog] 접두사로 식별되며, [FTLog]를 사용하여 필터링할 수 있습니다.
참고: scheme에서 OS_ACTIVITY_MODE=disable을 설정한 경우 SDK 디버그 로그가 정상적으로 출력되지 않을 수 있으므로, 디버그 시에는 이 설정을 해제하는 것이 좋습니다.
Release 버전 배포 시에는 Debug 디버그를 비활성화하는 것을 권장합니다.
로그 예시¶
데이터 동기화¶
// 다음은 정상 동기화 로그입니다.
[FTLog][INFO] -[FTTrackDataManger flushWithEvents:type:] [line 143] ↵
이벤트 업로드 시작(이번 업로드 이벤트 수:2)
[FTLog][INFO] -[FTRequestLineBody getRequestBodyWithEventArray:] [line 149]
Upload Datas Type:RUM
Line RequestDatas:
...... datas ......
[FTLog][INFO] -[FTTrackDataManger flushWithEvents:type:]_block_invoke [line 157] ↵
Upload Response statusCode : 200
1.3.10 버전 이전에는 Upload Response statusCode : 200이 출력되지 않습니다. 콘솔에 오류 로그가 있는지 확인하고, 오류 로그가 없으면 업로드가 성공한 것입니다.
오류 로그: Network failure: ...... 또는 서버 예외, 잠시 후 다시 시도 ......
1.5.16 버전 이후부터는 로그에서 [NETWORK]를 검색하여 모든 데이터 동기화 관련 로그를 확인할 수 있습니다.
SDK 내부 로그를 캐시 파일로 변환¶
// 기본 경로: 1.4.11-1.4.12 /Library/Caches/FTLogs/FTLog xxxx-xx-xx--xx/xx/xx/xxx.log
// >= 1.4.13 /Documents/FTLogs/FTLog.log
// >= 1.4.11
[[FTLog sharedInstance] registerInnerLogCacheToLogsDirectory:nil fileNamePrefix:nil];
// >= 1.4.13
// 방법 1: 기본 경로
[[FTLog sharedInstance] registerInnerLogCacheToDefaultPath]
// 방법 2: 경로 지정
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject
stringByAppendingPathComponent:@"ExampleName.log"];
[[FTLog sharedInstance] registerInnerLogCacheToLogsFilePath:filePath];
내부 로그의 완전성을 보장하려면 SDK 초기화 전에 이 설정을 적용해야 합니다.
SDK가 정상적으로 실행되지만 데이터가 없음¶
-
Datakit가 정상적으로 실행 중인지 확인
-
SDK 업로드 주소
datakitUrl또는datawayUrl이 올바르게 구성되고 초기화되었는지 확인합니다. debug 모드에서 로그를 확인하여 업로드 문제를 진단합니다. -
datakit가 해당 워크스페이스로 데이터를 업로드하고 있는지, 오프라인 상태인지 확인합니다. Guance에 로그인하여 [인프라]를 확인하면 이 문제를 확인할 수 있습니다.
데이터 수집 성공 확인¶
Logger¶
FTLoggerConfig의 enableCustomLog = YES 설정을 활성화하여 사용자 정의 로그 수집 및 업로드를 활성화합니다.
SDK가 로그를 수집하면 Xcode 디버거 콘솔에서 SDK 디버그 로그를 확인할 수 있습니다.
[FTLog][INFO] -[FTRecordModel initWithSource:op:tags:fields:tm:] [line 36] write data = {
op = Logging;
opdata = {
fields = {
message = "xxxxx수집된 로그 내용XXXXX";
};
source = "df_rum_ios_log";
tags = {
......
}
}
}
op = Logging; 이 표시되면 Logger 기능이 정상적으로 활성화되었고 데이터가 성공적으로 수집되었음을 의미합니다.
RUM¶
SDK 버전이 1.4.14 미만인 경우 Resource 데이터와 Action 데이터(launch action 제외)는 View와 바인딩되므로 View가 수집되는 상태에서만 정상적으로 수집할 수 있습니다.
View 수집:
FTRumConfig의enableTraceUserView = YES설정을 활성화하여 자동 수집을 활성화하거나-startViewWithName으로 수동 수집합니다.
Xcode 디버거 콘솔에서 SDK 디버그 로그를 확인합니다.
[FTLog][INFO] -[FTRecordModel initWithSource:op:tags:fields:tm:] [line 36] write data = {
op = RUM;
opdata = {
fields = {
.......
};
source = action;
tags = {
........
}
}
}
op = RUM; 이 표시되면 RUM 기능이 정상적으로 활성화되었고 데이터가 성공적으로 수집되었음을 의미합니다.
Trace¶
enableLinkRumData = YES를 설정하면 RUM Resource 데이터에 표시됩니다. Xcode 디버거 콘솔에서 SDK 디버그 로그를 확인합니다.
[FTLog][INFO] -[FTRecordModel initWithSource:op:tags:fields:tm:] [line 36] write data = {
op = RUM;
opdata = {
fields = {
duration = 5873084;
"request_header" = "Accept:*/*\nx-datadog-parent-id:12914452039873665275\nx-datadog-trace-id:6849912365449426814\nx-datadog-origin:rum\nAccept-Language:en-US,en;q=0.9\nAccept-Encoding:gzip, deflate\nx-datadog-sampling-priority:2";
......
};
source = resource;
tags = {
......
"span_id" = 12914452039873665275;
"trace_id" = 6849912365449426814;
......
};
};
op = RUM; source = resource; 데이터를 찾고 tags에 span_id와 trace_id가 포함되어 있으면 Trace 기능이 정상적으로 활성화되었음을 의미합니다.
데이터 손실¶
일부 데이터 손실¶
- RUM의 특정 Session 데이터 또는 Log, Trace의 일부 데이터가 손실된 경우
FTRUMConfig, FTLoggerConfig, FTTraceConfig에서 sampleRate < 1을 설정했는지 먼저 확인해야 합니다.
- RUM의 Resource 이벤트 또는 Action 이벤트(launch action 제외)가 손실된 경우
View 자동 수집이 활성화되어 있는지 또는 Open API를 사용한 수동 수집이 있는지 확인해야 합니다. Resource 이벤트 또는 Action 이벤트는 View와 바인딩되므로 View가 수집되는 상태에서만 정상적으로 수집할 수 있습니다.
- SDK 버전 <= 1.4.14에서 일부 데이터가 손실되고 Xcode 디버거 콘솔에 다음과 같은 디버그 로그가 표시되는 경우
SDK에 전달된 NSDictionary 유형 매개변수가 다음 요구 사항을 충족하는지 확인하세요.
-
모든 딕셔너리 키는 NSString
-
모든 객체는 NSString, NSNumber, NSArray, NSDictionary 또는 NSNull
-
NSNumber는 NaN 또는 무한대가 아님
키와 값 모두 NSString을 사용하는 것이 좋습니다.
- 데이터를 업로드하는 장치의 네트워크와 datakit가 설치된 장치의 네트워크 및 부하 문제를 확인합니다.
Error 데이터 손실 Crash 유형 데이터¶
-
Crash 수집 기능이 활성화되어 있는지 확인
-
SDK 초기화가 Crash 전에 완료되었는지 확인
-
Crash를 캡처하는 기능이 있는 다른 타사 구성 요소를 사용하는지 확인. 사용하는 경우 FTMobileSDK 초기화를 해당 구성 요소 뒤에 배치
-
Xcode 디버그 단계인지 확인
SDK는 UNIX 신호 및 Mach 예외를 사용하여 크래시를 캡처합니다. 이 두 캡처 방식 모두 Xcode에서 기본적으로 활성화된 Debug executable의 영향을 받습니다. SDK가 이러한 예외를 캡처하기 전에 가로채기 때문에 디버그 단계에서도 크래시를 정상적으로 캡처하려면 Debug executable 기능을 수동으로 비활성화하거나 Xcode 연결 디버그 없이 테스트해야 합니다.
참고: Debug executable을 비활성화하면 중단점 디버그 기능이 작동하지 않습니다.
버전 호환성 문제¶
RUM Resource 이벤트의 성능 지표 누락¶
영향 버전: SDK 버전 1.3.10 이하
SDK는 iOS 9 이상을 지원합니다. RUM Resource 이벤트의 성능 지표는 iOS 10 이상의 시스템 API를 사용하여 수집해야 합니다. 따라서 사용자 장치의 시스템이 iOS 10 미만인 경우 수집된 Resource 이벤트에서 성능 지표 부분이 누락됩니다.
RUM Error 데이터의 carrier 속성이 --로 표시됨¶
iOS 16.4 이상에서 CoreTelephony의 CTCarrier가 더 이상 사용되지 않으며(Deprecated) 대체 API가 없습니다. 더 이상 사용되지 않는 메서드를 사용하면 정적 값 --가 반환됩니다.
WebView¶
[xxViewController retain]: message sent to deallocated instance xxx¶
영향 버전: SDK 버전 1.4.10 이하
원인: WebView를 사용할 때 WebView에 옵저버를 추가했지만, 옵저버가 해제되기 전에 WebView에서 해당 옵저버를 제거하지 않은 경우입니다. SDK 내부에서 WebView에 대한 강한 참조를 유지하고 있기 때문에 WebView가 해제되지 않고, 이후 관찰 중인 KeyPath가 변경될 때 옵저버에 알림을 보내지만 옵저버가 이미 해제되어 EXC_BAD_ACCESS 오류가 발생합니다.
수정 제안:
-
SDK 버전 업그레이드
-
또는 옵저버가 해제되기 전에 해당 옵저버를 제거합니다.

