- 필수 기능
- 시작하기
- Glossary
- 표준 속성
- Guides
- Agent
- 통합
- 개방형텔레메트리
- 개발자
- Administrator's Guide
- API
- Datadog Mobile App
- CoScreen
- Cloudcraft
- 앱 내
- 서비스 관리
- 인프라스트럭처
- 애플리케이션 성능
- APM
- Continuous Profiler
- 스팬 시각화
- 데이터 스트림 모니터링
- 데이터 작업 모니터링
- 디지털 경험
- 소프트웨어 제공
- 보안
- AI Observability
- 로그 관리
- 관리
",t};e.buildCustomizationMenuUi=t;function n(e){let t='
",t}function s(e){let n=e.filter.currentValue||e.filter.defaultValue,t='${e.filter.label}
`,e.filter.options.forEach(s=>{let o=s.id===n;t+=``}),t+="${e.filter.label}
`,t+=`RUM iOS SDK를 아직 설정하지 않은 경우 인앱 설정 지침을 따르거나 RUM iOS 설정 설명서를 참조하세요.
iOS RUM은 사용자 활동, 화면, 오류 및 네트워크 요청과 같은 속성을 자동으로 추적합니다. RUM 이벤트 및 기본 속성에 대한 자세한 내용은 RUM 데이터 수집 설명서를 참조하세요. 커스텀 이벤트를 추적하여 사용자 세션 정보를 보강하고 수집된 속성을 보다 세밀하게 제어할 수 있습니다.
뷰 자동 추적 외에도, viewControllers
같은 특정 개별 뷰가 표시되고 상호작용할 때 추적할 수 있습니다. RUMMonitor.shared()
에서 다음 방법을 사용하여 뷰가 더 이상 표시되지 않을 때 추적을 중지합니다.
.startView(viewController:)
.stopView(viewController:)
예시:
import DatadogRUM
// `UIViewController` 내에서:
let rum = RUMMonitor.shared()
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
rum.startView(viewController: self)
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
rum.stopView(viewController: self)
}
@import DatadogObjc;
// `UIViewController` 내에서:
DDRUMMonitor *rum = [DDRUMMonitor shared];
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[rum startViewWithViewController:self name:nil attributes:nil];
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[rum stopViewWithViewController:self attributes:nil];
}
자세한 내용 및 사용 가능한 선택 사항은 GitHub의RUMMonitorProtocol
를 참조하세요.
동작 자동 추적 외에도, addAction(type:name:)
API를 사용하여 특정 사용자 지정 동작(탭, 클릭, 스크롤)을 추적할 수 있습니다.
.tap
과 같은 즉각적인 RUM 동작을 RUMMonitor.shared()
에 수동 등록하려면 .addAction(type:name:)
을 사용합니다. .scroll
와 같은 연속적인 RUM 동작의 경우 .startAction(type:name:)
또는 .stopAction(type:)
를 사용합니다.
예시:
import DatadogRUM
// `UIViewController`내에서:
let rum = RUMMonitor.shared()
@IBAction func didTapDownloadResourceButton(_ sender: UIButton) {
rum.addAction(
type: .tap,
name: sender.currentTitle ?? ""
)
}
- (IBAction)didTapDownloadResourceButton:(UIButton *)sender {
NSString *name = sender.currentTitle ? sender.currentTitle : @"";
[[DDRUMMonitor shared] addActionWithType:DDRUMActionTypeTap name:name attributes:@{}];
}
참고: .startAction(type:name:)
와 .stopAction(type:)
을 사용할 때 type
작업은 반드시 동일해야 합니다. 이는 RUM iOS SDK가 작업 시작과 완료를 일치시키기 위해 필요합니다.
자세한 내용 및 사용 가능한 옵션은 GitHub의RUMMonitorProtocol
를 참조하세요.
리소스 자동 추적외에도 네트워크 요청 또는 타사 공급자 API와 같은 특정 커스텀 리소스를 추적할 수 있습니다. RUMMonitor.shared()
에서 다음 메서드를 사용하여 RUM 리소스를 수동으로 수집합니다.
.startResource(resourceKey:request:)
.stopResource(resourceKey:response:)
.stopResourceWithError(resourceKey:error:)
.stopResourceWithError(resourceKey:message:)
예시:
import DatadogRUM
// in your network client:
let rum = RUMMonitor.shared()
rum.startResource(
resourceKey: "resource-key",
request: request
)
rum.stopResource(
resourceKey: "resource-key",
response: response
)
// in your network client:
[[DDRUMMonitor shared] startResourceWithResourceKey:@"resource-key"
request:request
attributes:@{}];
[[DDRUMMonitor shared] stopResourceWithResourceKey:@"resource-key"
response:response
attributes:@{}];
참고: 호출하는 리소스의 두 호출에서 resourceKey
로 사용되는 String
이 고유해야 합니다. RUM iOS SDK가 리소스의 시작과 완료를 일치시키는데 필요합니다.
자세한 내용 및 사용 가능한 옵션은 GitHub의RUMMonitorProtocol
를 참조하세요.
특정 오류를 추적하려면, 다음 메서드 중 하나를 사용하여 오류 발생 시 RUMMonitor.shared()
에게 알립니다.
.addError(message:)
.addError(error:)
let rum = RUMMonitor.shared()
rum.addError(message: "error message.")
[[DDRUMMonitor shared] addErrorWithMessage:@"error message." stack:nil source:DDRUMErrorSourceCustom attributes:@{}];
자세한 내용 및 사용 가능한 선택 사항은 GitHub의RUMMonitorProtocol
및 오류 특성 문서를 참조하세요.
RUM iOS SDK에서 자동으로 캡처하는 기본 RUM 속성 외에도 추가 컨텍스트 정보(커스텀 속성 등)를 RUM 이벤트에 추가하여 Datadog 내에서의 가시성을 강화할 수 있습니다.
커스텀 속성을 사용하면 관찰된 사용자 행동에 대한 정보(예: 카트 값, 판매자 계층 또는 광고 캠페인)를 코드 수준 정보(예: 백엔드 서비스, 세션 타임라인, 오류 로그 및 네트워크 상태)로 필터링하고 그룹화할 수 있습니다.
커스텀 전역 속성을 설정하려면 RUMMonitor.shared().addAttribute(forKey:value:)
을 사용합니다.
RUMMonitor.shared().addAttribute(forKey: "<KEY>", value: "<VALUE>")
을 사용합니다.RUMMonitor.shared().addAttribute(forKey: "<KEY>", value: "<UPDATED_VALUE>")
을 사용합니다.RUMMonitor.shared().removeAttribute(forKey: "<KEY_TO_REMOVE>")
을 사용합니다.대량 작업(여러 속성을 한 번에 수정)의 성능을 높이려면 .addAttributes(_:)
및 .removeAttributes(forKeys:)
을 사용합니다.
참고: 키 이름에 공백이나 특수 문자를 사용하는 경우 커스텀 속성에 패싯을 생성할 수 없습니다. 예를 들어, forKey: "Store ID"
대신 forKey: "store_id"
을 사용합니다.
RUM 세션에 사용자 정보를 추가하면 다음 작업을 쉽게 수행할 수 있습니다:
속성 | 유형 | 설명 |
---|---|---|
usr.id | 문자열 | (필수) 고유 사용자 식별자입니다. |
usr.name | 문자열 | (선택 사항) RUM UI에 기본적으로 표시되는 사용자 친화적인 이름입니다. |
usr.email | 문자열 | (선택 사항) 사용자 이메일로, 사용자 이름이 없는 경우 RUM UI에 표시됩니다. |
사용자 세션을 식별하려면 Datadog.setUserInfo(id:name:email:)
API를 사용합니다.
예시:
import DatadogCore
Datadog.setUserInfo(id: "1234", name: "John Doe", email: "john@doe.com")
[DDDatadog setUserInfoWithId:@"1234" name:@"John Doe" email:@"john@doe.com" extraInfo:@{}];
백그라운드 이벤트 추적으로 추가 세션이 발생하여 청구 금액에 영향을 미칠 수 있습니다. 자세한 내용은 Datadog 지원팀에 문의하세요.
애플리케이션이 백그라운드에서 동작할 때(예: 활성 뷰를 사용할 수 없음) 크래시 및 네트워크 요청과 같은 이벤트를 추적할 수 있습니다.
백그라운드 이벤트를 추적하려면 초기화 중에 Datadog 설정에 다음 스니펫을 추가합니다.
import DatadogRUM
RUM.enable(
with: RUM.Configuration(
...
trackBackgroundEvents: true
)
)
Datadog 설정을 생성할 때 Datadog.Configuration
에서 다음 속성을 사용하여 라이브러리를 초기화할 수 있습니다.
backgroundTasksEnabled
UIApplication
메서드 beginBackgroundTask(expirationHandler:)
및 endBackgroundTask:
를 사용하여 백그라운드 업로드를 수행할지 결정합니다. 해당 플래그를 활성화하면 앱이 백그라운드에서 작동하는 시간이 30초 증가할 수 있습니다. 업로드할 항목이 없거나, 인터넷이 연결이 없는 경우 또는 배터리가 부족한 경우와 같이 업로드에 방해가 되는 상황에서는 일반적으로 작업이 중지됩니다. 기본적으로 해당 플래그는 false
로 설정되어 있습니다.batchSize
.small
, .medium
, 및 .large
입니다.bundle
clientToken
encryption
DataEncryption
프로토콜을 준수하는 오브젝트를 제공하여 온디스크 데이터 지속성에 사용하는 데이터 암호화입니다.env
staging
또는 production
)을 기준으로 이벤트를 필터링하는 데 사용할 수 있습니다.proxyConfiguration
serverDateProvider
ServerDateProvider
구현을 설정하면 SDK 인스턴스와 Datadog 서버의 동기화가 해제됩니다. 이로 인해 RUM 세션 또는 분산 추적에서 상당한 시간 차이가 발생할 수 있습니다.service
site
.us1
입니다.uploadFrequency
.frequent
, .average
, 및 .rare
가 포함됩니다.RUM을 활성화할 때 RUM.Configuration
에서 다음 속성을 사용할 수 있습니다.
actionEventMapper
appHangThreshold
0.1
초입니다. 보고를 비활성화하려면 이 값을 nil
로 설정합니다. 자세한 내용은 앱 중단 보고 추가하기를 참조하세요.applicationID
customEndpoint
errorEventMapper
longTaskEventMapper
longTaskThreshold
0.1
초로 전송됩니다.networkSettledResourcePredicate
nextViewActionPredicate
onSessionStart
resourceEventMapper
sessionSampleRate
sessionSampleRate
값은 0.0
과 100.0
사이여야 합니다. 0.0
값은 세션이 전송되지 않음을 뜻하고, 100.0
은 모든 세션이 Datadog으로 전송됨을 뜻합니다. 기본값은 100.0
입니다.telemetrySampleRate
0
과 100
사이의 값이어야 합니다. 해당 값은 기본적으로 20
으로 설정되어 있습니다.trackAnonymousUser
true
로 설정되어 있습니다.trackFrustrations
true
로 설정되어 있습니다.trackBackgroundEvents
false
로 설정되어 있습니다.trackWatchdogTerminations
false
입니다.uiKitActionsPredicate
DefaultUIKitRUMActionsPredicate
를 설정하여 predicate
기본 구현을 사용하거나 앱에 맞게 커스텀한 자체 UIKitRUMActionsPredicate
를 구현할 수 있습니다.uiKitViewsPredicate
UIViewControllers
을 RUM 작업으로 추적하도록 활성화합니다. DefaultUIKitRUMViewsPredicate
를 설정하여 predicate
기본 구현을 사용하거나 앱에 맞게 맞춤형으로 자체 UIKitRUMViewsPredicate
를 구현할 수 있습니다.urlSessionTracking
URLSession
작업(네트워크 요청)을 RUM 리소스로 추적할 수 있도록 활성화합니다. firstPartyHostsTracing
파라미터는 first-party
리소스로 분류되고(RUM이 활성화된 경우) 추적 정보가 삽입된 호스트(추적 기능이 활성화된 경우)를 정의합니다. resourceAttributesProvider
파라미터는 RUM iOS SDK가 수집한 각 리소스별로 호출되고 인터셉트된 리소스에 커스텀 속성을 제공하는 클로저를 정의합니다. 해당 클로저는 작업 정보와 함께 호출되며, 커스텀 리소스 속성을 반환하거나 속성을 첨부할 필요가 없는 경우 nil
을 반환할 수 있습니다.viewEventMapper
vitalsUpdateFrequency
.frequent
(100ms마다), .average
(500ms마다), .rare
(1초마다), .never
(바이탈 모니터링 비활성화)가 포함됩니다.UIKit 및 SwiftUI로 뷰를 자동 추적할 수 있습니다.
뷰를 자동 추적하려면(UIViewControllers
), RUM을 활성화할 때 uiKitViewsPredicate
선택 사항을 사용합니다. 기본적으로 뷰의 이름은 뷰 컨트롤러의 클래스 이름으로 지정됩니다. 이를 사용자 지정하려면 UIKitRUMViewsPredicate
프로토콜을 따르는 predicate
구현을 직접 제공합니다.
public protocol UIKitRUMViewsPredicate {
func rumView(for viewController: UIViewController) -> RUMView?
}
@objc
public protocol DDUIKitRUMViewsPredicate: AnyObject {
func rumView(for viewController: UIViewController) -> DDRUMView?
}
rumView(for:)
구현 내에서 앱은 지정된 UIViewController
인스턴스가 RUM 뷰를 시작할지(값을 반환할지) 아니면 시작하지 않을지(nil
반환)를 결정해야 합니다. 반환된 RUMView
값은 name
을 지정해야 하며, 생성된 RUM 뷰에 대해 추가 attributes
을 제공할 수 있습니다.
예를 들어, 앱의 각 뷰 컨트롤러에 명시적인 형식 검사를 하도록 조건자를 설정할 수 있습니다.
class YourCustomPredicate: UIKitRUMViewsPredicate {
func rumView(for viewController: UIViewController) -> RUMView? {
switch viewController {
case is HomeViewController: return .init(name: "Home")
case is DetailsViewController: return .init(name: "Details")
default: return nil
}
}
}
@interface YourCustomPredicate : NSObject<DDUIKitRUMViewsPredicate>
@end
@implementation YourCustomPredicate
- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController {
if ([viewController isKindOfClass:[HomeViewController class]]) {
return [[DDRUMView alloc] initWithName:@"Home" attributes:@{}];
}
if ([viewController isKindOfClass:[DetailsViewController class]]) {
return [[DDRUMView alloc] initWithName:@"Details" attributes:@{}];
}
return nil;
}
@end
앱의 아키텍처에 따라 보다 동적인 솔루션을 고안할 수도 있습니다.
예를 들어, 뷰 컨트롤러가 accessibilityLabel
을 일관되게 사용하는 경우 접근성 레이블 값으로 뷰의 이름을 지정할 수 있습니다.
class YourCustomPredicate: UIKitRUMViewsPredicate {
func rumView(for viewController: UIViewController) -> RUMView? {
guard let accessibilityLabel = viewController.accessibilityLabel else {
return nil
}
return RUMView(name: accessibilityLabel)
}
}
@interface YourCustomPredicate : NSObject<DDUIKitRUMViewsPredicate>
@end
@implementation YourCustomPredicate
- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController {
if (viewController.accessibilityLabel) {
return [[DDRUMView alloc] initWithName:viewController.accessibilityLabel attributes:@{}];
}
return nil;
}
@end
참고: 앱이 실행되는 동안 RUM iOS SDK는 rumView(for:)
를 여러 번 호출합니다. Datadog은 빠른 단일 스레드로 구성하고 유지할 것을 권장합니다.
SwiftUI로 뷰를 자동 추적하려면 RUM을 활성화할 때 swiftUIViewsPredicate
옵션을 사용하세요.
SwiftUI 뷰 이름을 추출하는 메커니즘은 리플렉션(Reflection)에 의존합니다. 따라서 뷰 이름이 항상 의미가 있는 것은 아닙니다. 의미 있는 이름을 추출할 수 없는 경우 AutoTracked_HostingController_Fallback
또는 AutoTracked_NavigationStackController_Fallback
같은 일반 이름이 사용됩니다.
기본 조건자(DefaultSwiftUIRUMViewsPredicate
)를 사용하거나 SwiftUIRUMViewsPredicate
프로토콜을 직접 구현하여 뷰 이름을 사용자 지정 또는 필터링할 수 있습니다.
public protocol SwiftUIRUMViewsPredicate {
func rumView(for extractedViewName: String) -> RUMView?
}
// Example: Custom predicate to ignore fallback names and rename views
class CustomSwiftUIPredicate: SwiftUIRUMViewsPredicate {
func rumView(for extractedViewName: String) -> RUMView? {
if extractedViewName == "AutoTracked_HostingController_Fallback" ||
extractedViewName == "AutoTracked_NavigationStackController_Fallback" {
return nil // Ignore fallback names
}
if extractedViewName == "MySpecialView" {
return RUMView(name: "Special")
}
return RUMView(name: extractedViewName)
}
}
@protocol DDSwiftUIRUMViewsPredicate <NSObject>
- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName;
@end
@interface CustomSwiftUIPredicate : NSObject <DDSwiftUIRUMViewsPredicate>
@end
@implementation CustomSwiftUIPredicate
- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName {
if ([extractedViewName isEqualToString:@"AutoTracked_HostingController_Fallback"] ||
[extractedViewName isEqualToString:@"AutoTracked_NavigationStackController_Fallback"]) {
return nil; // Ignore fallback names
}
if ([extractedViewName isEqualToString:@"MySpecialView"]) {
return [[DDRUMView alloc] initWithName:@"Special" attributes:@{}];
}
return [[DDRUMView alloc] initWithName:extractedViewName attributes:@{}];
}
@end
참조:
Datadog은 앱이 SwiftUI로만 빌드된 경우에도 UIKit 뷰 추적을 활성화할 것을 권장합니다.
탭 바는 자동 추적되지 않습니다. 수동 추적을 사용하여 각 탭 뷰를 추적합니다.
자동 추적과 수동 추적을 모두 사용하는 경우 중복 이벤트가 표시될 수 있습니다. 이를 방지하려면 단일 계측 메서드를 사용하거나 사용자 지정 조건자로 중복을 필터링합니다.
UIKit으로 사용자 탭 동작을 자동 추적하려면 RUM을 활성화할 때 uiKitActionsPredicate
옵션을 설정합니다.
SwiftUI으로 사용자 탭 동작을 자동 추적하려면 RUM을 활성화할 때 swiftUIActionsPredicate
옵션을 활성화합니다.
참조:
SwiftUI_Button
, SwiftUI_NavigationLink
)으로 안정적으로 추적됩니다.SwiftUI_Unidentified_Element
로 보고됩니다.DefaultSwiftUIRUMActionsPredicate
를 사용하거나 직접 입력하여 동작을 필터링하거나 이름을 바꿀 수 있습니다. 안정적인 iOS 18 이상만 추적하려는 경우 다음과 같이 레거시 탐지(iOS 17 이하)를 비활성화할 수도 있습니다.// Use the default predicate by disabling iOS 17 and below detection
let predicate = DefaultSwiftUIRUMActionsPredicate(isLegacyDetectionEnabled: false)
// Use your own predicate
class CustomSwiftUIActionsPredicate: SwiftUIRUMActionsPredicate {
func rumAction(for componentName: String) -> RUMAction? {
// Custom logic to filter or rename actions
return RUMAction(name: componentName)
}
}
// Use the default predicate by disabling iOS 17 and below detection
DDDefaultSwiftUIRUMActionsPredicate *swiftUIActionsPredicate = [[DDDefaultSwiftUIRUMActionsPredicate alloc] initWithIsLegacyDetectionEnabled:NO];
// Use your own predicate
@protocol DDSwiftUIRUMActionsPredicate <NSObject>
- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName;
@end
@interface CustomSwiftUIActionsPredicate : NSObject <DDSwiftUIRUMActionsPredicate>
@end
@implementation CustomSwiftUIActionsPredicate
- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName {
// Custom logic to filter or rename actions
return [[DDRUMAction alloc] initWithName:componentName attributes:@{}];
}
@end
하단 테이블은 iOS 17과 iOS 18이 서로 다른 사용자 상호작용을 보고하는 방법을 보여줍니다.
컴포넌트 | iOS 18 보고 이름 | iOS 17 보고 이름 |
---|---|---|
버튼 | SwiftUI_Button | SwiftUI_Unidentified_Element |
NavigationLink | NavigationLink | SwiftUI_Unidentified_Element |
메뉴 | SwiftUI_Menu(및 해당 항목은 _UIContextMenuCell로 표시) | SwiftUI_Menu(및 해당 항목은 _UIContextMenuCell로 표시) |
링크 | SwiftUI_Button | SwiftUI_Unidentified_Element |
리소스(네트워크 요청)를 자동 추적하고 첫 바이트 수신 시간 또는 DNS 조회와 같은 타이밍 정보를 수집하려면 RUM을 활성화할 때 urlSessionTracking
선택 사항을 사용하고 URLSessionInstrumentation
을 활성화합니다.
URLSessionInstrumentation.enable(
with: .init(
delegateClass: <YourSessionDelegate>.self
)
)
let session = URLSession(
configuration: .default,
delegate: <YourSessionDelegate>(),
delegateQueue: nil
)
DDURLSessionInstrumentationConfiguration *config = [[DDURLSessionInstrumentationConfiguration alloc] initWithDelegateClass:[<YourSessionDelegate> class]];
[DDURLSessionInstrumentation enableWithConfiguration:config];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]
delegate:[[<YourSessionDelegate> alloc] init]
delegateQueue:nil];
앱에 계측하려는 위임 유형이 두 개 이상 있는 경우 각 위임 유형에 대해 URLSessionInstrumentation.enable(with:)
를 호출할 수 있습니다.
또한 urlSessionTracking
으로 자사 호스트를 설정할 수 있습니다. 이렇게 하면 지정된 도메인과 일치하는 리소스를 RUM에서 ‘자사(퍼스트 파티)‘로 분류하고, 추적 정보를 백엔드에 전파합니다(추적을 사용 설정한 경우). 네트워크 트레이스는 조정 가능한 샘플링 비율로 샘플링됩니다. 기본적으로 20%의 샘플링이 적용됩니다.
예를 들어, example.com
을 자사 호스트로 설정하고 RUM 및 추적 기능을 모두 사용하도록 설정할 수 있습니다.
import DatadogRUM
RUM.enable(
with: RUM.Configuration(
applicationID: "<rum application id>",
uiKitViewsPredicate: DefaultUIKitRUMViewsPredicate(),
uiKitActionsPredicate: DefaultUIKitRUMActionsPredicate(),
urlSessionTracking: RUM.Configuration.URLSessionTracking(
firstPartyHostsTracing: .trace(hosts: ["example.com"], sampleRate: 20)
)
)
)
URLSessionInstrumentation.enable(
with: .init(
delegateClass: <YourSessionDelegate>.self
)
)
let session = URLSession(
configuration: .default,
delegate: <YourSessionDelegate>(),
delegateQueue: nil
)
이렇게 하면 계측된 session
을 통해 전송된 모든 요청을 추적합니다. example.com
도메인과 일치하는 요청은 ‘자사’(퍼스트 파티)로 표시되며 추적 정보가 백엔드로 전송되어 트레이스와 RUM 리소스를 연결합니다.
@import DatadogObjc;
DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@"<rum application id>"];
DDRUMURLSessionTracking *urlSessionTracking = [DDRUMURLSessionTracking new];
[urlSessionTracking setFirstPartyHostsTracing:[DDRUMFirstPartyHostsTracing alloc] initWithHosts:@[@"example.com"] sampleRate:20];
[configuration setURLSessionTracking:urlSessionTracking];
[DDRUM enableWith:configuration];
리소스에 커스텀 속성을 추가하려면 RUM을 활성화할 때 URLSessionTracking.resourceAttributesProvider
옵션을 사용합니다. 속성 공급자 클로저를 설정하면 추적된 리소스에 첨부할 추가 속성을 반환할 수 있습니다.
예를 들어, RUM 리소스에 HTTP 요청 및 응답 헤더를 추가할 수 있습니다.
RUM.enable(
with: RUM.Configuration(
...
urlSessionTracking: RUM.Configuration.URLSessionTracking(
resourceAttributesProvider: { request, response, data, error in
return [
"request.headers" : redactedHeaders(from: request),
"response.headers" : redactedHeaders(from: response)
]
}
)
)
)
요청을 추적하지 않으려면 위임 유형에 대해 URLSessionInstrumentation을 비활성화합니다.
URLSessionInstrumentation.disable(delegateClass: <YourSessionDelegate>.self)
[DDURLSessionInstrumentation disableWithDelegateClass:[<YourSessionDelegate> class]];
Logger
를 통해 전송된 모든 ‘오류’ 및 ‘중요’ 로그는 자동으로 RUM 오류로 보고되고 현재 RUM 뷰와 연결됩니다.
import DatadogLogs
let logger = Logger.create()
logger.error("message")
logger.critical("message")
@import DatadogObjc;
DDLogger *logger = [DDLogger create];
[logger error:@"message"];
[logger critical:@"message"];
이와 유사하게, 오류로 표시된 모든 완료된 스팬은 RUM 오류로 보고됩니다.
import DatadogTrace
let span = Tracer.shared().startSpan(operationName: "operation")
// ... capture the `error`
span.setError(error)
span.finish()
// ... capture the `error`
id<OTSpan> span = [[DDTracer shared] startSpan:@"operation"];
[span setError:error];
[span finish];
RUM 이벤트가 Datadog으로 전송되기 전에 해당 속성을 수정하거나 이벤트를 완전히 삭제하려면 iOS RUM SDK를 설정할 때 Event Mappers API를 사용하세요.
let configuration = RUM.Configuration(
applicationID: "<rum application id>",
viewEventMapper: { RUMViewEvent in
return RUMViewEvent
}
resourceEventMapper: { RUMResourceEvent in
return RUMResourceEvent
}
actionEventMapper: { RUMActionEvent in
return RUMActionEvent
}
errorEventMapper: { RUMErrorEvent in
return RUMErrorEvent
}
longTaskEventMapper: { RUMLongTaskEvent in
return RUMLongTaskEvent
}
)
DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@"<rum application id>"];
[configuration setViewEventMapper:^DDRUMViewEvent * _Nonnull(DDRUMViewEvent * _Nonnull RUMViewEvent) {
return RUMViewEvent;
}];
[configuration setErrorEventMapper:^DDRUMErrorEvent * _Nullable(DDRUMErrorEvent * _Nonnull RUMErrorEvent) {
return RUMErrorEvent;
}];
[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) {
return RUMResourceEvent;
}];
[configuration setActionEventMapper:^DDRUMActionEvent * _Nullable(DDRUMActionEvent * _Nonnull RUMActionEvent) {
return RUMActionEvent;
}];
[configuration setLongTaskEventMapper:^DDRUMLongTaskEvent * _Nullable(DDRUMLongTaskEvent * _Nonnull RUMLongTaskEvent) {
return RUMLongTaskEvent;
}];
각 맵퍼는 시그니처가 (T) -> T?
인 Swift 클로저이며, 여기서 T
는 구체적인 RUM 이벤트 유형입니다. 이렇게 하면 이벤트가 전송되기 전에 이벤트의 일부를 변경할 수 있습니다.
예를 들어, RUM 리소스의 url
에서 민감한 정보를 삭제하려면 커스텀 redacted(_:) -> String
함수을 구현하고 resourceEventMapper
에서 사용합니다.
let configuration = RUM.Configuration(
applicationID: "<rum application id>",
resourceEventMapper: { RUMResourceEvent in
var RUMResourceEvent = RUMResourceEvent
RUMResourceEvent.resource.url = redacted(RUMResourceEvent.resource.url)
return RUMResourceEvent
}
)
DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@"<rum application id>"];
[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) {
return RUMResourceEvent;
}];
오류, 리소스 또는 작업 매퍼에서 nil
을 반환하면 이벤트가 완전히 삭제되고 Datadog으로 전송되지 않습니다. 뷰 이벤트 매퍼에서 반환되는 값은 nil
이 아니어야 합니다(뷰를 삭제하려면 UIKitRUMViewsPredicate
구현을 사용자 정의합니다. 자세한 내용은 뷰 자동 추적을 참조하세요).
이벤트 유형에 따라 일부 특정 속성만 수정할 수 있습니다:
이벤트 유형 | 속성 키 | 설명 |
---|---|---|
RUMActionEvent | RUMActionEvent.action.target?.name | 액션의 이름. |
RUMActionEvent.view.url | 이 작업에 연결된 보기의 URL. | |
RUMErrorEvent | RUMErrorEvent.error.message | 오류 메시지. |
RUMErrorEvent.error.stack | 오류의 스택 트레이스. | |
RUMErrorEvent.error.resource?.url | 오류가 참조하는 리소스의 URL. | |
RUMErrorEvent.view.url | 이 오류에 연결된 보기의 URL. | |
RUMResourceEvent | RUMResourceEvent.resource.url | 리소스의 URL. |
RUMResourceEvent.view.url | 이 리소스에 연결된 보기의 URL. | |
RUMViewEvent | RUMViewEvent.view.name | 보기의 이름. |
RUMViewEvent.view.url | 보기 URL. | |
RUMViewEvent.view.referrer | 페이지의 초기 보기에 연결된 URL. |
RUM 세션 ID를 검색하면 문제 해결에 도움이 될 수 있습니다. 예를 들어 지원 요청, 이메일 또는 버그 보고서에 세션 ID를 첨부하면 나중에 지원 팀이 Datadog에서 사용자 세션을 찾을 수 있습니다.
sessionStarted
이벤트를 기다리지 않고 런타임 중에 RUM 세션 ID에 액세스할 수 있습니다.
RumMonitor.shared().currentSessionID(completion: { sessionId in
currentSessionId = sessionId
})
GDPR 규정을 준수하기 위해 RUM iOS SDK는 초기화 시 추적 동의 값이 필요합니다.
trackingConsent
설정은 다음 값 중 하나가 될 수 있습니다:
.pending
: RUM iOS SDK는 데이터 수집 및 일괄 처리 작업을 시작하지만 해당 데이터를 Datadog으로 전송하지는 않습니다. RUM iOSSDK는 새로운 추적 동의 값을 기다렸다가 일괄 처리된 데이터로 실행할 작업을 결정합니다..granted
: RUM iOS SDK가 데이터 수집을 시작하고 Datadog으로 해당 데이터를 전송합니다..notGranted
: RUM iOS SDK는 어떠한 데이터도 수집하지 않습니다. 로그, 트레이스, 또는 RUM 이벤트가 Datadog으로 전송되지 않습니다.RUM iOS SDK 초기화 후 추적 동의 값을 변경하려면 Datadog.set(trackingConsent:)
API 호출을 사용합니다. RUM iOS SDK에서 새로운 값에 따라 동작을 변경합니다.
예를 들어 현재 추적 동의가 .pending
인 경우는 다음과 같습니다.
.granted
로 변경하면 RUM iOS SDK는 현재 및 향후 모든 데이터를 Datadog 으로 전송합니다..notGranted
로 변경하면 RUM iOS SDK는 현재 데이터를 모두 삭제하고 향후 데이터를 수집하지 않습니다.Datadog.addUserExtraInfo(_:)
API로 이전에 설정한 속성에 추가 사용자 속성을 추가할 수 있습니다.
import DatadogCore
Datadog.addUserExtraInfo(["company": "Foo"])
iOS SDK는 먼저 이벤트를 로컬에 저장하고 인테이크 사양이 충족될 때만 이벤트를 업로드합니다.
Datadog.clearAllData()
API로 SDK에 저장된 모든 미전송 데이터를 삭제할 수 있습니다.
import DatadogCore
Datadog.clearAllData()
Datadog.stopInstance()
API로 SDK 인스턴스(또는 이름이 nil
인 경우 기본 인스턴스)가 더 이상 데이터를 수집하고 업로드하지 않도록 중지할 수 있습니다.
import DatadogCore
Datadog.stopInstance()
이 메서드를 호출하면 SDK 및 모든 활성 기능(예: RUM)이 비활성화됩니다. 데이터 수집을 재개하려면 SDK를 다시 초기화해야 합니다. 설정을 동적 변경하려는 경우 이 API를 사용할 수 있습니다.
추가 유용한 문서, 링크 및 기사: