Datadog RUM で iOSアプリをUXモニタリングする

## はじめに
本記事では、DatadogのRUMの機能を、Xcodeで作成したiOSアプリに仕込む方法について解説します。

## Datadogの設定
Datadogの**UX Monitoring**メニューから**Real User Monitoring**を選択します。
![Screenshot 2023-10-11 at 14.39.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/cc454cb6-d042-be00-4b63-2b458c9c3898.png)

New Applicationをクリックします。
![Screenshot 2023-10-11 at 14.42.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/a9f7798b-8fbf-9dda-0ed0-c210f975f48e.png)

Application typeは「iOS」を選択します。Application nameは任意で良いです。（ここでは「testMobileApp」としています）
![Screenshot 2023-10-11 at 14.44.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/bf8e3ca3-659c-9377-e5dd-5ebf5bb43dd4.png)

## 監視対象のiOSアプリ
今回は、私が作成した既存のITイベント検索アプリを使います。やってることは単純で、connpassのAPIを使って、キーワード検索した結果をiOSアプリの画面にリスト表示し、結果リストのイベント名をクリックするとSafari Viewを起動してイベントページを開くというものです。
![Screenshot 2023-10-11 at 14.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/ff754456-2b7e-b871-6dce-22c249c20e71.png)

ファイル構成は以下の通りです。
|ファイル名|内容|
|---|---|
|ConnpassEventsApp.swift|アプリ本体のストラクト。WindowGroupとしてContentViewを読み込み。|
|ContentView.swift|アプリのUIを定義しているストラクト。今回Datadog RumのIntial処理はここで呼び出すことにした。|
|ConnpassData.swift|connpass APIで取得したデータを管理、ハンドリングするためのクラス。|
|SafariView.swift|結果リストをクリックした際に別ビューでイベントページを表示するためのSafariView。|
|DatadogRumInit.swift|Datadog RUM のInitializeを実装しているストラクト。今回新たに追加。|

## Datadog RUM で環境変数を設定
Datadogでデータを見たときになんのデータか分かるように、環境変数の**dd.env**に **"meijo-prod"** を設定します。このアプリを名城大学の授業向けに作ったので、ここではこのようにしていますが、この値は何でもOKです。設定すると左側のコードスニペットに内容が反映されるので、このコードスニペットをコピーします。
![Screenshot 2023-10-11 at 15.02.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/6aa82f3e-b0d4-dd4d-b606-d441b933b0ef.png)

## Xcodeのプロジェクトにライブラリを読み込む
AppleのSwift Package Managerを使って統合するには、Package.swiftに依存関係として以下を追加します。（バージョンは今後変わっていく可能性があるので適宜変更してください）
```
.package(url: "https://github.com/Datadog/dd-sdk-ios.git", .upToNextMajor(from: "2.0.0"))
```

CocoaPodsを使ってライブラリ「dd-sdk-ios」をインストールする場合はこちら。
```
pod 'DatadogCore'
pod 'DatadogRUM'
```

Carthage（カーセージ/カルタゴ）の場合はこちら。
```
github "DataDog/dd-sdk-ios"
```

XcodeではGUIベースでライブラリを追加することもできます。プロジェクトを右クリックし、「Add Package Dependencies」から「dd-sdk-ios」を追加します。
![Screenshot 2023-10-12 at 9.45.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/0bf84b54-bbed-9252-0c9d-37a9f881de20.png)


## iOSアプリにDatadog RUM 初期処理のコードを記述
**DatadogRumInit.swift**にDatadogで生成されたコードスニペットを貼り付ける形で記載します。
![Screenshot 2023-10-11 at 15.05.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/4dbed872-b3bc-ad41-b1ff-3130623d2f02.png)

SwiftではswiftファイルのTop Levelに直接処理は記述できないので、**DatadogRumInit**というストラクトを作成し、**ddInit**という関数を定義しています。

```
import Foundation
import DatadogCore
import DatadogRUM

let appID = "dd173261-5b45-4e19-af30-0cb2bf58679d"
let clientToken = "pubd323c6d27671593d6338dc7b659c8e3d"
let environment = "meijo-prod"

struct DatadogRumInit {
    func ddInit() {
        print("ddInitが呼ばれました")
        Datadog.initialize(
            with: Datadog.Configuration(
                clientToken: clientToken,
                env: environment,
                site: .us1
            ),
            trackingConsent: .granted
        )

        RUM.enable(
            with: RUM.Configuration(
                applicationID: appID,
                uiKitViewsPredicate: DefaultUIKitRUMViewsPredicate(),
                uiKitActionsPredicate: DefaultUIKitRUMActionsPredicate()
            )
        )
    }
}
```

アプリ起動時、最初にUIを描画するために呼ばれる**ContentView.swift**の最初に、先程作成した **ddInit()** を呼び出すコードを記述しました。
![Screenshot 2023-10-11 at 15.09.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/25433735-4a23-a23d-b07e-f7546900c5ba.png)

```
let druminit: () = DatadogRumInit().ddInit()
```

## Xcodeで作成したアプリを実行し操作する
Xcode上で追加コードを記述したアプリをビルド、実行し、エミュレーターでアプリを操作します。適当に操作すると、Datadogへのデータ送信が開始します。
![Screenshot 2023-10-11 at 14.49.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/d383ee4c-ae9a-c263-12ee-2d5b21e3cfb8.png)

## Datadogでの確認
数分かかりますが、通信が確立したことを確認するとDatadogのRUM設定画面の3番「Verify your installation」に「Data is reporting successfully!」と表示されます。
![Screenshot 2023-06-06 at 0.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/e2a9844a-d8b4-8fed-35c4-f4548d5cae9a.png)

RUMのアプリケーション一覧から、今回作成した**testMobileApp**を選択すると、デフォルトで生成されたモニター画面（ダッシュボード）が表示され、取得したデータが表示されているのが確認できます。
![Screenshot 2023-10-11 at 15.14.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/e021191d-3415-435f-6e50-34e9939fcf13.png)

**Session & Replays** を選択してみると、こちらにもデータが反映されているのがわかります。
![Screenshot 2023-10-11 at 15.14.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/97d4aee0-cea2-643a-e2e2-91da199d802e.png)

## 終わりに
いかがでしたでしょうか？非常に簡単にiOSアプリにRUMを仕込むことができることが分かったと思います。一方で、RUMは本格的に利用しようとするとそれなりにコストもかかります。バランスよく必要なところに上手く利用していけると良いですね。

以上です。