iOS and tvOS Monitoring Setup
Overview
This page describes how to instrument your applications for both Real User Monitoring (RUM) or Error Tracking with the iOS SDK. You can follow the steps below to instrument your applications for RUM (includes Error Tracking), or Error Tracking if you have purchased it as a standalone product.
Setup
To start sending RUM or Error Tracking data from your iOS or tvOS application to Datadog:
Step 1 - Declare the iOS SDK as a dependency
Declare the iOS library as a dependency depending on your package manager. Swift Package Manager (SPM) is recommended.
To integrate using Apple’s Swift Package Manager, add the following as a dependency to your Package.swift
:
.package(url: "https://github.com/Datadog/dd-sdk-ios.git", .upToNextMajor(from: "2.0.0"))
In your project, link the following libraries:
You can use CocoaPods to install dd-sdk-ios
:
pod 'DatadogCore'
pod 'DatadogRUM'
You can use Carthage to install dd-sdk-ios
:
github "DataDog/dd-sdk-ios"
In Xcode, link the following frameworks:
DatadogInternal.xcframework
DatadogCore.xcframework
DatadogRUM.xcframework
Step 2 - Specify application details in the UI
Navigate to Digital Experience > Add an Application.
Select iOS
as the application type and enter an application name to generate a unique Datadog application ID and client token.
To instrument your web views, click the Instrument your webviews toggle. For more information, see Web View Tracking.
To disable automatic user data collection for client IP or geolocation data, use the toggles for those settings. For more information, see RUM iOS Data Collected.
To ensure the safety of your data, you must use a client token. If you used only Datadog API keys to configure the dd-sdk-ios
library, they would be exposed client-side in the iOS application’s byte code.
For more information about setting up a client token, see the Client token documentation.
Step 3 - Initialize the library
In the initialization snippet, set an environment name, service name, and version number. In the examples below, app-name
specifies the variant of the application that generates data.
For more information, see Using Tags.
import DatadogCore
Datadog.initialize(
with: Datadog.Configuration(
clientToken: "<client token>",
env: "<environment>",
service: "<service name>"
),
trackingConsent: trackingConsent
)
@import DatadogObjc;
DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
[DDDatadog initializeWithConfiguration:configuration
trackingConsent:trackingConsent];
import DatadogCore
Datadog.initialize(
with: Datadog.Configuration(
clientToken: "<client token>",
env: "<environment>",
site: .eu1,
service: "<service name>"
),
trackingConsent: trackingConsent
)
@import DatadogObjc;
DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite eu1];
[DDDatadog initializeWithConfiguration:configuration
trackingConsent:trackingConsent];
import DatadogCore
Datadog.initialize(
with: Datadog.Configuration(
clientToken: "<client token>",
env: "<environment>",
site: .us3,
service: "<service name>"
),
trackingConsent: trackingConsent
)
@import DatadogObjc;
DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite us3];
[DDDatadog initializeWithConfiguration:configuration
trackingConsent:trackingConsent];
import DatadogCore
Datadog.initialize(
with: Datadog.Configuration(
clientToken: "<client token>",
env: "<environment>",
site: .us5,
service: "<service name>"
),
trackingConsent: trackingConsent
)
@import DatadogObjc;
DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite us5];
[DDDatadog initializeWithConfiguration:configuration
trackingConsent:trackingConsent];
import DatadogCore
Datadog.initialize(
with: Datadog.Configuration(
clientToken: "<client token>",
env: "<environment>",
site: .us1_fed,
service: "<service name>"
),
trackingConsent: trackingConsent
)
@import DatadogObjc;
DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite us1_fed];
[DDDatadog initializeWithConfiguration:configuration
trackingConsent:trackingConsent];
import DatadogCore
Datadog.initialize(
with: Datadog.Configuration(
clientToken: "<client token>",
env: "<environment>",
site: .ap1,
service: "<service name>"
),
trackingConsent: trackingConsent
)
@import DatadogObjc;
DDConfiguration *configuration = [[DDConfiguration alloc] initWithClientToken:@"<client token>" env:@"<environment>"];
configuration.service = @"<service name>";
configuration.site = [DDSite ap1];
[DDDatadog initializeWithConfiguration:configuration
trackingConsent:trackingConsent];
The iOS SDK automatically tracks user sessions depending on options provided at the SDK initialization. To add GDPR compliance for your EU users and other initialization parameters to the SDK configuration, see the Set tracking consent documentation.
Sample session rates
Configuring the session sample rate does not apply to Error Tracking.
To control the data your application sends to Datadog RUM, you can specify a sampling rate for RUM sessions while initializing the RUM iOS SDK. The rate is a percentage between 0 and 100. By default, sessionSamplingRate
is set to 100 (keep all sessions).
For example, to only keep 50% of sessions use:
let configuration = RUM.Configuration(
applicationID: "<rum application id>",
sessionSampleRate: 50
)
DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@"<rum application id>"];
configuration.sessionSampleRate = 50;
Set tracking consent (GDPR compliance)
To be compliant with the GDPR regulation, the iOS SDK requires the tracking consent value at initialization.
The trackingConsent
setting can be one of the following values:
.pending
: The iOS SDK starts collecting and batching the data but does not send it to Datadog. The iOS SDK waits for the new tracking consent value to decide what to do with the batched data..granted
: The iOS SDK starts collecting the data and sends it to Datadog..notGranted
: The iOS SDK does not collect any data. No logs, traces, or events are sent to Datadog.
To change the tracking consent value after the iOS SDK is initialized, use the Datadog.set(trackingConsent:)
API call. The iOS SDK changes its behavior according to the new value.
For example, if the current tracking consent is .pending
:
- If you change the value to
.granted
, the RUM iOS SDK sends all current and future data to Datadog; - If you change the value to
.notGranted
, the RUM iOS SDK wipes all current data and does not collect future data.
Step 4 - Start sending data
Initialize the Datadog Monitor
Configure and register the Datadog Monitor. You only need to do it once, usually in your AppDelegate
code:
import DatadogRUM
RUM.enable(
with: RUM.Configuration(
applicationID: "<rum application id>",
uiKitViewsPredicate: DefaultUIKitRUMViewsPredicate(),
uiKitActionsPredicate: DefaultUIKitRUMActionsPredicate(),
urlSessionTracking: RUM.Configuration.URLSessionTracking()
)
)
@import DatadogObjc;
DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@"<rum application id>"];
configuration.uiKitViewsPredicate = [DDDefaultUIKitRUMViewsPredicate new];
configuration.uiKitActionsPredicate = [DDDefaultUIKitRUMActionsPredicate new];
[configuration setURLSessionTracking:[DDRUMURLSessionTracking new]];
[DDRUM enableWith:configuration];
Enable URLSessionInstrumentation
To monitor requests sent from the URLSession
instance as resources, enable URLSessionInstrumentation
for your delegate type and pass the delegate instance to the URLSession
:
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];
Instrument views
The Datadog iOS SDK for allows you to instrument views of SwiftUI
applications. The instrumentation also works with hybrid UIKit
and SwiftUI
applications.
To instrument a SwiftUI.View
, add the following method to your view declaration:
import SwiftUI
import DatadogRUM
struct FooView: View {
var body: some View {
FooContent {
...
}
.trackRUMView(name: "Foo")
}
}
The trackRUMView(name:)
method starts and stops a view when the SwiftUI
view appears and disappears from the screen.
Instrument tap actions
The Datadog iOS SDK allows you to instrument tap actions of SwiftUI
applications. The instrumentation also works with hybrid UIKit
and SwiftUI
applications.
To instrument a tap action on a SwiftUI.View
, add the following method to your view declaration:
import SwiftUI
import DatadogRUM
struct BarView: View {
var body: some View {
Button("BarButton") { {
...
}
.trackRUMTapAction(name: "Bar")
}
}
Track background events
Tracking background events may lead to additional sessions, which can impact billing. For questions, contact Datadog support.
You can track events such as crashes and network requests when your application is in the background (for example, no active view is available).
Add the following snippet during initialization in your Datadog configuration:
import DatadogRUM
RUM.enable(
with: RUM.Configuration(
...
trackBackgroundEvents: true
)
)
Track iOS errors
iOS Crash Reporting and Error Tracking displays any issues in your application and the latest available errors. You can view error details and attributes including JSON in the RUM Explorer.
Sending data when device is offline
The iOS SDK ensures availability of data when your user device is offline. In cases of low-network areas, or when the device battery is too low, all events are first stored on the local device in batches. They are sent as soon as the network is available, and the battery is high enough to ensure the iOS SDK does not impact the end user’s experience. If the network is not available while your application is in the foreground, or if an upload of data fails, the batch is kept until it can be sent successfully.
This means that even if users open your application while offline, no data is lost.
Note: The data on the disk is automatically discarded if it gets too old to ensure the iOS SDK does not use too much disk space.
Supported versions
See Supported versions for a list operating system versions and platforms that are compatible with the RUM iOS SDK.
Further Reading
Additional helpful documentation, links, and articles: