概要

まだ SDK をインストールしていない場合は、アプリ内セットアップ手順に従うか、Android RUM セットアップドキュメントを参照してください。

ユーザーセッションの充実

Android RUM は、ユーザーアクティビティ、画面、エラー、ネットワークリクエストなどの属性を自動的に追跡します。RUM イベントおよびデフォルト属性については、RUM データ収集ドキュメントをご参照ください。カスタムイベントを追跡することで、ユーザーセッション情報を充実させ、収集された属性をより細かく制御することが可能になります。

カスタムビュー

ビューを自動追跡するほかに、特定のさまざまなビュー(アクティビティやフラグメントなど)が onResume() ライフサイクルでインタラクティブに確認できるようになったら自動追跡することも可能です。ビューが確認できなくなったら追跡を停止します。ほとんどの場合、このメソッドは、最前面の Activity または Fragment で呼び出す必要があります。

    fun onResume() {
      GlobalRumMonitor.get().startView(viewKey, viewName, viewAttributes)
    }

    fun onPause() {
      GlobalRumMonitor.get().stopView(viewKey, viewAttributes)
    }
    public void onResume() {
         GlobalRumMonitor.get().startView(viewKey, viewName, viewAttributes);
    }

    public void onPause() {
         GlobalRumMonitor.get().stopView(viewKey, viewAttributes);
    }

独自のパフォーマンスタイミングを追加

RUM のデフォルト属性に加えて、addTiming API を使用して、アプリケーションが時間を費やしている場所を測定できます。タイミング測定は、現在の RUM ビューの開始を基準にしています。たとえば、ヒーロー画像が表示されるまでにかかる時間を計ることができます。

   fun onHeroImageLoaded() {
         GlobalRumMonitor.get().addTiming("hero_image")
   } 
    public void onHeroImageLoaded() {
         GlobalRumMonitor.get().addTiming("hero_image");
    }

タイミングが送信されると、タイミングは @view.custom_timings.<timing_name> としてアクセス可能になります (例: @view.custom_timings.hero_image)。RUM 分析またはダッシュボードでグラフを作成する前に、メジャーを作成する必要があります。

カスタムアクション

アクションを自動追跡するほかに、RumMonitor#addAction で特定のカスタムユーザーアクション (タップ、クリック、スクロールなど) を追跡することも可能です。継続的なアクションの追跡 (リストをスクロールするユーザーの追跡) には、RumMonitor#startAction および RumMonitor#stopAction を使用します。

アクションタイプは、“カスタム”、“クリック”、“タップ”、“スクロール”、“スワイプ”、“戻る” のいずれかを指定する必要があることに注意してください。

    fun onUserInteraction() { 
         GlobalRumMonitor.get().addAction(actionType, name, actionAttributes)
    }
    public void onUserInteraction() {
         GlobalRumMonitor.get().addAction(actionType, name, actionAttributes);
    }

リソースの強化

リソースを自動的に追跡する場合、追跡する各ネットワークリクエストにカスタム属性を追加するために、カスタムの RumResourceAttributesProvider インスタンスを提供します。例えば、ネットワークリクエストのヘッダを追跡したい場合は、以下のような実装を作成し、DatadogInterceptor のコンストラクタに渡します。

class CustomRumResourceAttributesProvider : RumResourceAttributesProvider {
    override fun onProvideAttributes(
        request: Request,
        response: Response?,
        throwable: Throwable?
    ): Map<String, Any?> {
        val headers = request.headers
        return headers.names().associate {
            "headers.${it.lowercase(Locale.US)}" to headers.values(it).first()
        }
    }
}
public class CustomRumResourceAttributesProvider implements RumResourceAttributesProvider {
    @NonNull
    @Override
    public Map<String, Object> onProvideAttributes(
            @NonNull Request request,
            @Nullable Response response,
            @Nullable Throwable throwable
    ) {
        Map<String, Object> result = new HashMap<>();
        Headers headers = request.headers();

        for (String key : headers.names()) {
            String attrName = "headers." + key.toLowerCase(Locale.US);
            result.put(attrName, headers.values(key).get(0));
        }

        return result;
    }
}

カスタムリソース

リソースを自動追跡するほかに、メソッド(GETPOST など)を使用して、RumMonitor#startResource でリソースを読み込みながら特定のカスタムリソース(ネットワークリクエストやサードパーティプロバイダ API など)を追跡することも可能です。完全に読み込まれたら RumMonitor#stopResource で追跡を停止し、リソースの読み込み中にエラーが発生した場合は RumMonitor#stopResourceWithError で停止します。

    fun loadResource() {
         GlobalRumMonitor.get().startResource(resourceKey, method, url, resourceAttributes)
         try {
           // リソースをロードします
           GlobalRumMonitor.get().stopResource(resourceKey, resourceKind, additionalAttributes)
         } catch (e: Exception) {
           GlobalRumMonitor.get().stopResourceWithError(resourceKey, message, origin, e)
         } 
    }
    public void loadResource() {
         GlobalRumMonitor.get().startResource(resourceKey, method, url, resourceAttributes);
         try {
             // リソースをロードします
             GlobalRumMonitor.get().stopResource(resourceKey, resourceKind, additionalAttributes);
         } catch (Exception e) {
             GlobalRumMonitor.get().stopResourceWithError(resourceKey, message, origin, e);
         }
    }

カスタムエラー

特定のエラーを追跡するには、エラーが発生したときにメッセージ、ソース、例外、追加属性でモニターに通知します。エラー属性ドキュメントをご参照ください。

   GlobalRumMonitor.get().addError(message, source, throwable, attributes)

カスタムグローバル属性の追跡

RUM Android SDK により自動的に取得されるデフォルトの RUM 属性に加えて、カスタム属性などのコンテキスト情報を RUM イベントに追加し、Datadog 内の可観測性を強化することも可能です。カスタム属性により、コードレベルの情報(バックエンドサービス、セッションタイムライン、エラーログ、ネットワークの状態など)を利用して、観察されたユーザー行動(カート内の金額、マーチャントティア、広告キャンペーンなど)を分類することができます。

ユーザーセッションの追跡

RUM セッションにユーザー情報を追加すると、次のことが簡単になります。

  • 特定のユーザーのジャーニーをたどる
  • エラーの影響を最も受けているユーザーを把握する
  • 最も重要なユーザーのパフォーマンスを監視する
RUM UI のユーザー API

以下の属性は任意で、少なくとも 1 つ提供する必要があります。

属性タイプ説明
usr.id文字列一意のユーザー識別子。
usr.name文字列RUM UI にデフォルトで表示されるユーザーフレンドリーな名前。
usr.email文字列ユーザー名が存在しない場合に RUM UI に表示されるユーザーのメール。Gravatar をフェッチするためにも使用されます。

ユーザーセッションを識別するには、setUserInfo API を使用します。例:

Datadog.setUserInfo('1234', 'John Doe', 'john@doe.com')

属性の追跡

    // 今後のすべての RUM イベントに属性を追加
    GlobalRumMonitor.get().addAttribute(key, value)

    // 今後のすべての RUM イベントから属性を削除
    GlobalRumMonitor.get().removeAttribute(key)

ウィジェットの追跡

ウィジェットは、SDK で自動的に追跡されません。ウィジェットから手動で UI インタラクションを送信するには、Datadog API を呼び出します。例をご参照ください

初期化パラメーター

ライブラリを初期化するよう Datadog のコンフィギュレーションを作成する際、Configuration.Builder で以下のメソッドを使用できます。

setFirstPartyHosts()
トレーシングが有効で RUM リソースが first-party に分類されているホストを定義します。: Datadog 構成でカスタムトレーシングヘッダータイプを定義し、GlobalTracer で登録されたトレーサーを使用している場合、使用するトレーサーに同じトレーシングヘッダータイプが設定されていることを確認してください。
useSite(DatadogSite)
ターゲットデータを EU1、US1、US3、US5、US1_FED、および AP1 のサイトに切り替えます。

RUM を有効にするよう RUM 構成を作成する際、RumConfiguration.Builder で以下のメソッドを使用できます。

trackUserInteractions(Array<ViewAttributesProvider>)
ユーザーインタラクション (タップ、スクロール、スワイプなど) の追跡を有効にします。このパラメーターを使用すると、ユーザーが操作したウィジェットに基づいて、カスタム属性を RUM アクションイベントに追加できます。
useViewTrackingStrategy(strategy)
ビューの追跡に使用される戦略を定義します。ご使用のアプリケーションのアーキテクチャにより、ViewTrackingStrategy の実装から 1 つを選択するか、独自のものを実装します。
trackLongTasks(durationThreshold)
メインスレッドで durationThreshold より時間がかかっているタスクを Datadog でロングタスクとして追跡できます。
setBatchSize([SMALL|MEDIUM|LARGE])
Datadog に送信されるリクエストの個別のバッチサイズを定義します。
setUploadFrequency([FREQUENT|AVERAGE|RARE])
Datadog エンドポイントに対し作成されたリクエストの頻度を定義します (リクエストがある場合)。
setVitalsUpdateFrequency([FREQUENT|AVERAGE|RARE|NEVER])
モバイルバイタルを収集するための好ましい頻度を設定します。
setSessionSampleRate(<sampleRate>)
RUM セッションのサンプルレートを設定します (0 の値は RUM イベントが送信されないことを意味し、100 の値はすべてのセッションが保持されることを意味します)。
setXxxEventMapper()
ビュー、アクション、リソース、エラーのデータスクラビングコールバックを設定します。

ビューの自動追跡

ビュー (アクティビティやフラグメントなど) を自動追跡するには、初期化時に追跡ストラテジーを提供する必要があります。ご使用のアプリケーションのアーキテクチャにより、以下のストラテジーから 1 つ選択します。

ActivityViewTrackingStrategy
アプリケーションの各アクティビティが個別のビューとみなされます。
FragmentViewTrackingStrategy
アプリケーションの各フラグメントが個別のビューとみなされます。
MixedViewTrackingStrategy
すべてのアクティビティまたはフラグメントが個別のビューとみなされます。
NavigationViewTrackingStrategy
Android Jetpack Navigation ライブラリのユーザーに推奨。各ナビゲーション先が個別のビューとみなされます。

たとえば、各フラグメントを個別のビューとして設定するには、セットアップで以下の構成を使用します。

    val rumConfig = RumConfiguration.Builder(applicationId)
     .useViewTrackingStrategy(FragmentViewTrackingStrategy(...))
     .build()
    RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
     .useViewTrackingStrategy(new FragmentViewTrackingStrategy(...))
     .build();

ActivityViewTrackingStrategyFragmentViewTrackingStrategyMixedViewTrackingStrategy のいずれかを使用する場合、コンストラクターで ComponentPredicate の実装を提供することで、RUM View として追跡する Fragment または Activity を絞り込むことができます。

    val rumConfig = RumConfiguration.Builder(applicationId)
     .useViewTrackingStrategy(
     ActivityViewTrackingStrategy(
         trackExtras = true,
         componentPredicate = object : ComponentPredicate<Activity> {
             override fun accept(component: Activity): Boolean {
                 return true
             }

             override fun getViewName(component: Activity): String? = null
         })
     )
     .build()  
     RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
         .useViewTrackingStrategy(new ActivityViewTrackingStrategy(
             true,
             new ComponentPredicate<Activity>() {
                 @Override
                 public boolean accept(Activity component) {
                     return true;
                 }

                 @Override
                 public String getViewName(Activity component) {
                     return null;
                 }
             }
         ))
         .build();

: デフォルトで、ライブラリは ActivityViewTrackingStrategy を使用しています。ビューの追跡ストラテジーを提供しないことにした場合は、自身で startView および stopView メソッドを呼び出してビューを手動で送信する必要があります。

ネットワークリクエストの自動追跡

リソース (サードパーティプロバイダー、ネットワークリクエストなど) で、最初の 1 バイトまで、または DNS 解決などのタイミング情報を取得するには、OkHttpClient をカスタマイズして EventListener ファクトリーを追加します。

  1. モジュールレベルの build.gradle ファイルで、dd-sdk-android-okhttp ライブラリに Gradle 依存関係を追加します。

    dependencies {
        implementation "com.datadoghq:dd-sdk-android-okhttp:x.x.x"
    }
    
  2. EventListener ファクトリーの追加

    val okHttpClient = OkHttpClient.Builder()
     .addInterceptor(DatadogInterceptor())
     .eventListenerFactory(DatadogEventListener.Factory())
     .build()
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
     .addInterceptor(new DatadogInterceptor())
     .eventListenerFactory(new DatadogEventListener.Factory())
     .build();

ロングタスクの自動追跡

メインスレッドで長時間実行されるオペレーションは、アプリケーションの視覚的パフォーマンスとリアクティビティに影響を与えることがあります。このようなオペレーションを追跡するには、タスクを長すぎるとみなすための閾値を定義します。

    val rumConfig = RumConfiguration.Builder(applicationId)
     // ...
     .trackLongTasks(durationThreshold)
     .build()

たとえば、デフォルトの 100 ms の実行時間を置換するため、コンフィギュレーションでカスタム閾値を設定します。

   val rumConfig = RumConfiguration.Builder(applicationId)
     // ...
     .trackLongTasks(250L) // track tasks longer than 250ms as long tasks
     .build()
    RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
      // ...
      .trackLongTasks(durationThreshold)
      .build();

たとえば、デフォルトの 100 ms の実行時間を置換するため、コンフィギュレーションでカスタム閾値を設定します。

   RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
     // ...
     .trackLongTasks(250L) // track tasks longer than 250ms as long tasks
     .build();

RUM イベントの変更または削除

一括処理前に、RUM イベントの一部の属性を変更または一部のイベント全体を削除したりするには、RUM Android SDK を初期化する際に EventMapper<T> を実装します。

    val rumConfig = RumConfiguration.Builder(applicationId)
     // ...
     .setErrorEventMapper(rumErrorEventMapper)
     .setActionEventMapper(rumActionEventMapper)
     .setResourceEventMapper(rumResourceEventMapper)
     .setViewEventMapper(rumViewEventMapper)
     .setLongTaskEventMapper(rumLongTaskEventMapper)
     .build()
    RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
      // ...
      .setErrorEventMapper(rumErrorEventMapper)
      .setActionEventMapper(rumActionEventMapper)
      .setResourceEventMapper(rumResourceEventMapper)
      .setViewEventMapper(rumViewEventMapper)
      .setLongTaskEventMapper(rumLongTaskEventMapper)
      .build();

EventMapper<T> インターフェースを実装する場合、各イベントタイプの属性は一部のみしか変更することができません。

イベントタイプ属性キー説明
ViewEventview.referrerページの初期ビューへのリンク URL。
view.urlビューの URL。
view.nameビューの名前。
ActionEvent
action.target.nameターゲット名。
view.referrerページの初期ビューへのリンク URL。
view.urlビューの URL。
view.nameビューの名前。
ErrorEvent
error.messageエラーメッセージ。
error.stackエラーのスタックトレース。
error.resource.urlリソースの URL。
view.referrerページの初期ビューへのリンク URL。
view.urlビューの URL。
view.nameビューの名前。
ResourceEvent
resource.urlリソースの URL。
view.referrerページの初期ビューへのリンク URL。
view.urlビューの URL。
view.nameビューの名前。
LongTaskEvent
view.referrerページの初期ビューへのリンク URL。
view.urlビューの URL。
view.nameビューの名前。

: EventMapper<T> の実装から null が返された場合、イベントは削除されます。

その他の参考資料