Datadog RUMをiOSアプリに入れてみた

[前回 Datadogを最も基本的な形でiOSに導入した](https://qiita.com/nacho4d/items/7b784f91985fe436f320)。数行のコードでSDKを初期化できて、ログを出す度に呼べばいい。単純で良い感じ。

前回は Log & Tracing機能のみのモードでDatadog SDKを利用した。そのために Configurationの　`builderUsing(clientToken:environment:)`を利用した。 clientTokenを自分で生成しました (Datadogのコンソール > Organization Settings > Client Tokens > New Client Token)。


今回はRUM (Real time user monitoring)という機能を検証したい。そのために Configurationの`builderUsing(rumApplicationId:clientToken:environment:)`メソッドを利用する。Log & Tracing機能のみのモードと違ってclient tokenを自分で作成しない。**RUMアプリケーションを作成する過程で自動的にclient tokenも生成される　新application idと新client tokenをセットで用いる必要がある。**

[Datadog SDKのソースがわかりやすい](https://github.com/DataDog/dd-sdk-ios/blob/develop/Sources/Datadog/DatadogConfiguration.swift#L309-L324)ので　Githubでみたい方どうそ！

## ① Datadogコンソール上でRUM Applicationを作成

RUM機能を使う場合は Datadogサイト上でアプリケーションを作成する。RUM ApplicationIdの生成は [UX Monitoring > RUM Applications > New Application](https://app.datadoghq.com/rum/list). 「New Application」ボタン押下すると セットアップ方法が長い１ページで案内されてわかりやすい。 作成されたApplication idとclient tokenで通信があるときまで ステップ3の「Verify your installation」で「Waiting for data...」と表示される。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83390/65dbc0f4-1efc-ec04-c493-f99e1e655ad6.png" width="120">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83390/e9443e7c-1114-97d2-410c-8890b74b2232.png" width="248">

:::note info
新しく生成されたクライアントトークンがClient Tokens一覧画面で確認できる（やはり pubで始まるね）!

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83390/7c541e8c-5394-d7da-80db-c14e3324571e.png" width="300">
:::


## ② RUM機能ありでSDKの初期化の実装

上記のコードの通りに実装する。新しく生成されたApplication IDと新しいclient tokenを利用する。

```diff_swift
  import Datadog

  /// Initialize Datadog for RUM
  Datadog.initialize(
      appContext: .init(),
      trackingConsent: .granted,
      configuration: Datadog.Configuration
          .builderUsing(
+             rumApplicationID: SecretsVault.current.dataDogRumApplicationId,
              clientToken: SecretsVault.current.datadogClientToken,
              environment: SecretsVault.current.datadogEnvironment
          )
+         .trackUIKitRUMViews()
+         .trackUIKitRUMActions()
+         .trackRUMLongTasks()
          .build()
  )
```
iOSアプリ起動し動作してみて　Chromeで確認すると「Waiting for data...」が「Data is reporting successfully」に変わり、正常稼働確認完了！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83390/84d3b2ac-10fd-b8ab-bd51-bf1473a8a283.png" width="600">


## ③ [オプション] クラッシュレポート収集

iOSアプリ開発者ならば　クラッシュレポートをXcodeで見ることが多いと思うが、ザードパーティのツールでみたい場面もある。

- iOS開発者ではない方（必ずしもXcode環境を整えることできない方々　お客様、プロジェクトマネージャー、サーバーエンジニアなど）がクラッシュの傾向を確認したい場面
- Xcodeのクラッシュレポートに十分な情報がない場面。Xcodeのクラッシュレポートに情報を付加することができない。完全にannonymousで利用者のプライバシー的にいいが、サーバーのログなどと紐つけたい、関係性を見つけたい場合もある。利用者のプライバシーを保ちながら調査のしやすさを向上する端末id,requestidなどを追加したい場面


### Datadog SDKでクラッシュレポート収集の設定

[Datadog - iOS Crash Reporting and Error Tracking](https://docs.datadoghq.com/real_user_monitoring/error_tracking/ios/?tab=swiftpackagemanager)正式ガイドの通り　実装する。(DatadogCrashReportingをターゲットに追加する必要がある）

```diff_swift
  import Datadog
+ import DatadogCrashReporting

  /// Initialize Datadog for RUM
  Datadog.initialize(
      appContext: .init(),
      trackingConsent: .granted,
      configuration: Datadog.Configuration
          .builderUsing(
              rumApplicationID: SecretsVault.current.dataDogRumApplicationId,
              clientToken: SecretsVault.current.datadogClientToken,
              environment: SecretsVault.current.datadogEnvironment
          )
          .trackUIKitRUMViews()
          .trackUIKitRUMActions()
          .trackRUMLongTasks()
+         .enableCrashReporting(using: DDCrashReportingPlugin())
          .build()
  )
```


### Symbolication用にDSYMのアップロード

iOSの場合は symbolication処理が必要だから symbol情報を持つDSYMファイルのアップロードが必要。

- 当然ながらDSYMファイルが生成される設定になっていることが必要。デフォルトではXcodeのReleaseビルドではDSYMファイルが生成されるためOK（AppStore用のビルド（アーカイブ）はデフォルトでReleaseのConfigurationを使うため）。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83390/8f0e662b-fa74-3f27-5411-e144a52ddfc8.png" width="500">

- DSYMファイルの親フォルダーは `DWARF_DSYM_FOLDER_PATH` にある
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83390/950e7555-f498-a35d-71c5-b6bf7ef7808c.png" width="500">

- DSYMファイルのアップロードコマンドを実行するにはAPI Keyが必要。[Organization Settings > API Keys](https://app.datadoghq.com/organization-settings/api-keys)で作成可能

上記の情報でコマンドが打てる


```zsh
export DATADOG_API_KEY="<API KEY>"
npx @datadog/datadog-ci dsyms upload /Users/ignacio/Library/Developer/Xcode/DerivedData/DataDogExampleApp-ebhfyomivkoozheszhzupvdbvtan/Build/Products/Debug-iphoneos
```

## ④ [オプション] クラッシュレポートを見る

クラッシュが発生した後で Datadogサイトでエラー情報を見つけることができる。

- **Error Tracking画面から**: UX Monitoring > Error Trackingからアクセス <br><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83390/64f2a8e5-3393-4c4d-9a65-038d1c507f0f.png" width="150"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83390/38a50b90-d688-db2b-cb9c-4d4e408ca938.png" width="210">
- **Analysis画面から**: UX Monitoring > Analysis > Sessions and Replaysタブで In Errorsを選択し、isCrashで絞る <br><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83390/fcca904d-bae9-b5a5-e520-dd0ddc681614.png" width="150"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83390/b170f13a-de79-fb0d-72fc-2981172d0e6d.png" width="195">

## ハマったポイント

- RUMアプリケーションを作成して　動作確認は問題なさそうに見えるが、ずっと「Waiting for data...」表示のまま、どうやらSafariで現在2023/03/22時点で正常に動いていない。Chromeに同じURLをロードしたら「Data is reporting successfully!」に変わっていた。