- 重要な情報
- はじめに
- 用語集
- ガイド
- エージェント
- インテグレーション
- OpenTelemetry
- 開発者
- API
- CoScreen
- アプリ内
- Service Management
- インフラストラクチャー
- アプリケーションパフォーマンス
- 継続的インテグレーション
- ログ管理
- セキュリティ
- UX モニタリング
- 管理
まだ 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;
}
}
リソースを自動追跡するほかに、メソッド(GET
や POST
など)を使用して、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 セッションにユーザー情報を追加すると、次のことが簡単になります。
以下の属性は任意で、少なくとも 1 つ提供する必要があります。
属性 | タイプ | 説明 |
---|---|---|
usr.id | 文字列 | 一意のユーザー識別子。 |
usr.name | 文字列 | RUM UI にデフォルトで表示されるユーザーフレンドリーな名前。 |
usr.email | 文字列 | ユーザー名が存在しない場合に RUM UI に表示されるユーザーのメール。Gravatar をフェッチするためにも使用されます。 |
ユーザーセッションを識別するには、setUserInfo
API を使用します。例:
Datadog.setUserInfo('1234', 'John Doe', 'john@doe.com')
// 今後のすべての RUM イベントに属性を追加
GlobalRumMonitor.addAttribute(key, value)
// 今後のすべての RUM イベントから属性を削除
GlobalRumMonitor.removeAttribute(key)
ウィジェットは、SDK で自動的に追跡されません。ウィジェットから手動で UI インタラクションを送信するには、Datadog API を呼び出します。例をご参照ください。
ライブラリを初期化するよう Datadog のコンフィギュレーションを作成する際、Configuration.Builder
で以下のメソッドを使用できます。
setFirstPartyHosts()
first-party
のカテゴリーに入る RUM リソースを持つホストを定義します。useSite(DatadogSite)
RUM を有効にするよう RUM 構成を作成する際、RumConfiguration.Builder
で以下のメソッドを使用できます。
trackUserInteractions(Array<ViewAttributesProvider>)
useViewTrackingStrategy(strategy)
ViewTrackingStrategy
の実装から 1 つを選択するか、独自のものを実装します。trackLongTasks(durationThreshold)
durationThreshold
より時間がかかっているタスクを Datadog でロングタスクとして追跡できます。setBatchSize([SMALL|MEDIUM|LARGE])
setUploadFrequency([FREQUENT|AVERAGE|RARE])
setVitalsUpdateFrequency([FREQUENT|AVERAGE|RARE|NEVER])
setSessionSampleRate(<sampleRate>)
setXxxEventMapper()
ビュー (アクティビティやフラグメントなど) を自動追跡するには、初期化時に追跡ストラテジーを提供する必要があります。ご使用のアプリケーションのアーキテクチャにより、以下のストラテジーから 1 つ選択します。
ActivityViewTrackingStrategy
FragmentViewTrackingStrategy
MixedViewTrackingStrategy
NavigationViewTrackingStrategy
たとえば、各フラグメントを個別のビューとして設定するには、セットアップで以下の構成を使用します。
val rumConfig = RumConfiguration.Builder(applicationId)
.useViewTrackingStrategy(FragmentViewTrackingStrategy(...))
.build()
RumConfiguration rumConfig = new RumConfiguration.Builder(applicationId)
.useViewTrackingStrategy(new FragmentViewTrackingStrategy(...))
.build();
ActivityViewTrackingStrategy
、FragmentViewTrackingStrategy
、MixedViewTrackingStrategy
のいずれかを使用する場合、コンストラクターで 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 ファクトリーを追加します。
モジュールレベルの build.gradle
ファイルで、dd-sdk-android-okhttp
ライブラリに Gradle 依存関係を追加します。
dependencies {
implementation "com.datadoghq:dd-sdk-android-okhttp:x.x.x"
}
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 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>
インターフェースを実装する場合、各イベントタイプの属性は一部のみしか変更することができません。
イベントタイプ | 属性キー | 説明 |
---|---|---|
ViewEvent | view.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 が返された場合、イベントは削除されます。
アプリケーションが Datadog RUM に送信するデータを制御するには、RUM 機能を初期化し、RUM セッションのサンプルレートを 0~100 パーセントの間で指定します。
val rumConfig = RumConfiguration.Builder(applicationId)
// ここでは RUM セッションの 75% を Datadog へ送信
.setSessionSampleRate(75.0f)
.build()
Rum.enable(rumConfig)
お役に立つドキュメント、リンクや記事: