DynatraceによるモバイルアプリのReal User Monitoring

Dynatraceでは、一般的なウェブアプリケーションだけでなくモバイルアプリケーションに対するReal User Monitoring (RUM)に関する機能も提供しています。本機能を使用することでモバイルアプリにおけるユーザーエクスペリエンスの監視を行い、最適化することを実現することができます。モバイルアプリの監視は以前とは比べものにならないほど重要になってきています。

本記事では、Dynatraceによるモバイルアプリの監視方法について紹介していきます。

Dynatraceでは15日間の無料トライアルを利用することができるので、自分の環境でも簡単に試してみることができます。
[Dynatraceフリートライアル](https://www.dynatrace.com/ja/trial/)

# 設定方法

今回は、Androidアプリに対する監視方法について紹介していきます。
といってもAndroidアプリの場合には基本的にはGradle pluginとして提供されているため、アプリケーションそのものへの変更はほとんど必要なくとても簡単に行うことができます。また、iOSでも設定方法はほとんど変わりません。

## [Dynatrace] Mobile Appの作成

Dynatrace UIにログインをしたら、左のメニューバーから`Manage` - `Deploy Dynatrace`を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/462af19f-b3e0-b34b-a6ce-9697efe4d5f1.png)

画面を下にスライドさせるとMobile app Monitoringという項目があるので、`Set up mobile monitoring`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/cff4850a-3c5e-237c-7a92-d7719ca167d7.png)

アプリケーション名を入力し、`Create mobile app`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/9a46c6be-d6aa-b2ff-1ebf-962cacc2d89f.png)

アプリケーションの設定画面が表示されます。Data privacy設定で`Enable user opt-in mode`を有効にするとアプリケーションの利用ユーザーがどこまで監視を許可するか設定することが可能となります。Session Replayを利用したい場合は、**有効にする必要**があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/34be769b-ccdb-b1c7-9d88-6fdbb66a6f6a.png)

`Instrumentation wizard`をプラットフォーム毎の設定方法を選択する画面が表示されます。
今回はAndroidアプリの監視を行うため、`Android`アイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/65a754d8-c48f-ea3e-4813-78bc59d85e13.png)

`Groovy`もしくは`Kotlin`から適切な方を選択します。
Dynatraceで必要なライブラリ類はMavenCentralにホストされているので、トップレベルの**build.gradle**ファイルに登録されているか確認します。
Android Studioでアプリを作成する場合には通常、含まれているかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/35711c80-3940-b611-76d9-855a8f830818.png)

トップレベルの**build.gradle**ファイルの`buildscript`ブロック内の`dependencies`ブロック内に表示されたclasspathを追加します。
`Copy`ボタンをクリックすることで、クリップボードにコピーされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/7084f85c-0ac8-ae7d-5b61-d97f3f1d4089.png)

同様にプラグインの設定をトップレベルの**build.gradle**に追加をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/dd2afcf5-d9d2-e5e7-0b24-6b8b4ff94833.png)

**build.gradle**ファイルは以下のようになります（applicationIdとbeaconUrlは環境毎に異なるため空白にしてあります）。

```gradle:build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.0.3"
        classpath 'com.dynatrace.tools.android:gradle-plugin:8.+'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

apply plugin: 'com.dynatrace.instrumentation'
dynatrace {
    configurations {
        sampleConfig {
            autoStart {
                applicationId ''
                beaconUrl ''
            }
            userOptIn true
            agentBehavior.startupLoadBalancing true
        }
    }
}
```

`userOptIn`が有効になっているため、ユーザープライバシーオプションの設定を追加します。本来であればプライバシー設定の画面を作成してユーザーが選択できるようにするべきなのですが、今回はテスト目的なので、表示されているコードを貼り付けます。
詳細については、[公式サイト](https://www.dynatrace.com/support/help/how-to-use-dynatrace/real-user-monitoring/setup-and-configuration/web-applications/additional-configuration/configure-real-user-monitoring-according-to-gdpr/#enable-user-opt-in-mode-for-your-mobile-app-)に記載がございます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/8b99c83c-ca93-aa98-7195-4f06ca397868.png)

今回は`MainActivity.java`ファイル配下の`onCreate`メソッドに追加します。

```java:MainActivity.java
import com.dynatrace.android.agent.Dynatrace;
import com.dynatrace.android.agent.conf.DataCollectionLevel;
import com.dynatrace.android.agent.conf.UserPrivacyOptions;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Privacy settings configured below are only provided
        // to allow a quick start with capturing monitoring data.
        // This has to be requested from the user
        // (e.g. in a privacy settings screen) and the user decision
        // has to be applied similar to this example.
        Dynatrace.applyUserPrivacyOptions(UserPrivacyOptions.builder()
                .withDataCollectionLevel(DataCollectionLevel.USER_BEHAVIOR)
                .withCrashReportingOptedIn(true)
                .build());
```

上記が完了したら、アプリケーションをビルドして実行します。これだけでDynatraceによるアプリケーションの監視が開始されます。

# Dynatraceによる情報確認

実際にどのようなデータがDynatraceで取得できているか確認してみましょう。

左メニューの`Digital Experience`から`Mobile`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/0491941d-f227-c9d6-7f07-27e6fa98a377.png)

先ほど作成したアプリケーションが表示されているので、名前をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/1138b78a-f993-213a-9bff-8d2279e9260d.png)

`User experience`でユーザーが利用しているということが確認できています。また、`Analyze user sessions`ボタンをクリックすることでユーザー毎のセッション情報を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/4c0692f6-7575-0dcf-4ede-539bd835b7ca.png)

今回のケースでは2ユーザーによって3セッション作られていることが確認できます。試しに`Anonymous (3311082304)`をクリックしてさらに詳細を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/c9a30cb2-d3f3-a699-5f95-7ac3fd029b03.png)

2つのセッション情報が表示されていることが確認できます。`上の方のセッション(12:02)`をクリックしてさらに詳細を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/db3e47a3-220c-f663-1022-c0bbf542f198.png)

このセッションが作成された際のOSのバージョン、アプリケーションバージョン、画面解像度、デバイス名や位置情報などを確認することができます。また、Analysis配下では、セッション開始からどのようなイベントが行われたか表示されます。この例では、mobileDemoアプリが起動してから表示ボタンがタッチされ、その後にクリアボタンがタッチされていることが確認できます。各イベントのDetails矢印から`Perform waterfall analysis`ボタンをクリックすることで該当イベントに関する詳細を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/f0690c42-4054-d434-d031-d2bab52c1599.png)

イベントの詳細ページではセッションページの情報に加えて、バッテリー情報やメモリ情報などといった情報も確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/c13b661e-09f0-4016-1f94-ab03f1f49545.png)

また、下の例のようにあるイベントが他のイベントを呼び出す場合にはその情報も併せて確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/a5cd9821-266b-4417-717b-03440ea48332.png)

このようにDynatraceではアプリケーションのソースコードをほとんど変更せずにユーザーのセッション情報の取得を行うことができます。
ただし、任意のタイミングで任意の情報を取得したいということも当然出てくると思います。その場合には次に紹介するカスタムイベントを設定することで実現可能です。

## カスタムイベントの設定

Dynatraceではデフォルトで以下のリスナーとメソッドに関する計測を自動実行します。

* Android
    - android.app.Activity.onOptionsItemSelected
    - android.view.MenuItem$OnMenuItemClickListener
    - android.view.View$OnClickListener
    - android.widget.AdapterView$OnItemClickListener
    - android.widget.AdapterView$OnItemSelectedListener
* AndroidX
    - androidx.viewpager.widget.ViewPager$OnPageChangeListener
    - androidx.swiperefreshlayout.widget.SwipeRefreshLayout$OnRefreshListener
* Android Support
    - android.support.v4.view.ViewPager$OnPageChangeListener
    - android.support.v4.widget.SwipeRefreshLayout$OnRefreshListener

詳細は[Monitoring capabilities of Dynatrace Android Gradle plugin \| Dynatrace Documentation](https://www.dynatrace.com/support/help/how-to-use-dynatrace/real-user-monitoring/setup-and-configuration/mobile-apps/instrument-android-app/instrumentation-via-plugin/monitoring-capabilities/#user-action-monitoring)を参考ください。

これら以外のイベントや任意の情報を取得したい場合は、カスタムイベントを作成する必要があります。

以下のサンプルは、displayボタンを押した場合に入力された文字列をDynatraceにレポートします。また、clearボタンを押した場合は、`click clear`という文字列をレポートします。

```java
private class HelloListener implements View.OnClickListener {
    @Override
    public void onClick(View view) {
        EditText input = findViewById(R.id.etName);
        TextView output = findViewById(R.id.tvOutput);
        DTXAction action = Dynatrace.enterAction("click"); //アクションの定義

        int id = view.getId();

        switch(id) {
            case R.id.btDisplay:
                String inputStr = input.getText().toString();
                action.reportValue("display", inputStr); // inputStrの内容をdisplayという名前でレポート
                output.setText(inputStr + "さん、こんにちは！");
                break;
            case R.id.btClear:
                input.setText("");
                action.reportValue("clear", "click clear"); // 固定の文字列をレポート
                output.setText("");
                break;
        }
        action.leaveAction(); // アクションの終了
    }
}
```



コードの追加が完了したら、アプリケーションをビルドして実行します。

セッション情報の詳Analysisを確認すると**click**が表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/4ad976bc-0bbe-d728-6242-0bdd03361862.png)

`Datails`を開いて`Perform waterfall analysis`ボタンをクリックし、イベントの詳細ページを開きます。画面下部に**Reported values**で`reportValue`で指定したNameとValueを確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/6babcf61-14be-3c08-c489-ce0469abafa0.png)

`reportValue`メソッドでレポートできる型は文字列以外にも、int型、double型などにも対応しております。
[DTXAction \(Dynatrace Android OneAgent API \- 8\.229\.1\.1003\)](https://www.dynatrace.com/support/doc/javadoc/oneagent/android/agent/com/dynatrace/android/agent/DTXAction.html)に詳細が記載されております。
カスタムイベントを作成するだけでなく既存のアクションを拡張、修正することも可能です。詳細は[Monitoring capabilities of Dynatrace Android Gradle plugin \| Dynatrace Documentation](https://www.dynatrace.com/support/help/how-to-use-dynatrace/real-user-monitoring/setup-and-configuration/mobile-apps/instrument-android-app/instrumentation-via-plugin/monitoring-capabilities/#tabgroup-user-action-modification-example--java)をご確認ください。

また、値だけでなくエラーもレポートすることが可能です。こちらも詳細は[OneAgent SDK for Android \| Dynatrace Documentation](https://www.dynatrace.com/support/help/how-to-use-dynatrace/real-user-monitoring/setup-and-configuration/mobile-apps/instrument-android-app/instrumentation-via-oneagent-sdk/oneagent-sdk-for-android/?_ga=2.43013285.1211146269.1635993876-940408398.1620371447#user-action-monitoring)に記載されております。

## カスタムイベントを実行したセッションの一覧表示

左メニューの`Digital Experience`から`Session segmentation`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/f38ef99e-0622-ddc0-6160-b5592de7df64.png)

`Filterd by`フィールドで`User action name`を選び、先ほど作成したカスタムアクション名を入力します。そうすることでこのアクションを実行したユーザーセッションのみを表示することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/0550632c-a963-87a3-d316-222aa9cb95a2.png)

## カスタムプロパティの設定

Dynatraceではさらに便利な機能として、カスタムプロパティという機能があります。アプリケーションから送られてきた`reportValue`を**カスタムプロパティ**として設定することでユーザーセッションの一覧に表示することが可能となります。

左メニューの`Digital Experience`から`Mobile`をクリックします。そして、表示されたアプリケーション一覧からカスタムプロパティを設定したいアプリケーションを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/511cabe2-cf6b-be2c-a118-4971e65f71d7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/1138b78a-f993-213a-9bff-8d2279e9260d.png)

右上にある`…`をクリックし`Edit`を選択して設定画面を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/f75c2331-7ec2-c918-8b98-357b0e261884.png)

設定項目のうち`Session and user action properties`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/0abb5dbd-8566-d5ef-3414-e0271d0c3757.png)

`Add property`ボタンをクリックして、必要な項目を入力します。

* `Name`フィールドにはSDKがレポートする値を入力します。
* `Display name`、`Key`にも同様の値を入力します。
* 必要に応じて`Store as user action property`と`Store as session property`を有効にします。少なくともどちらか片方は有効にする必要があります。
全て入力が終わったら`Save property`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/4f29441e-710d-b260-dd17-0fa036c08b47.png)

以上の手順で、カスタムプロパティを作成することができます。

## カスタムプロパティのセッション一覧の表示

カスタムイベントを実行したセッションの一覧表示と同様の手順で`Session segmentation`を表示します。`Filtered by`でSession propertiesから先ほど作成したproperty種別を選択します。今回の例では**String**ですので、`String property`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/dc68f6c3-a3dd-a43b-ea73-561168e13e63.png)

フィルタリング内容が表示されますので、絞り込むことで該当のセッションの一覧を表示することが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65441/ad90f752-ae31-c43f-582a-e03760d85c1c.png)

1点注意点として、カスタムプロパティを作成した以降のセッションが対象となります。また、Live Sessionはフィルタリングの対象外となります。

# おわりに

モバイルアプリの利用はこれからますます増加していくと言われています。そのような状況の中で利用者のユーザーエクスペリエンスを測定し満足度を向上させることは非常に重要です。Dynatraceではモバイルアプリへの導入も非常に容易に行うことが可能です。今回紹介しきれなかった機能も含め、モバイルアプリの監視に非常に有用ですので、気になった方はぜひ試してみてください。