Docs » Splunk Observability Cloud でサポートされているインテグレーション » モバイルおよび Web アプリケーションを Splunk RUM でインストルメンテーションする » Splunk RUM 用 Android アプリケーションのインストルメンテーション » Androidアプリケーションの手動インストルメンテーション

Androidアプリケーションの手動インストルメンテーション 🔗

Android RUM エージェントを使用して、Splunk RUM 用の Android アプリケーションを手動でインストルメンテーションし、追加のテレメトリを収集したり、個人識別情報 (PII) をサニタイズしたり、グローバル属性を追加したりすることができます。

スパンをフィルターーする 🔗

filterSpans() メソッドを使用して、スパンを変更または削除できます。例えば、個人を特定できる情報(PII)を含むスパンを削除または編集することができます。

次の例は、スパンを削除する方法を示しています:

SplunkRum.builder()
         .filterSpans(spanFilter ->
            spanFilter
                  .removeSpanAttribute(stringKey("http.user_agent")))

次の例は、機密データを削除するために属性の値を編集する方法を示しています:

SplunkRum.builder()
         .filterSpans(spanFilter ->
            spanFilter
                  .replaceSpanAttribute(StandardAttributes.HTTP_URL,
                     value -> Pattern.compile.. _"(user|pass:\\w+")
                           .matcher(value)
                           .replaceAll("$1=<redacted>")))

グローバル属性の管理 🔗

グローバル属性は、すべての報告データに追加されるキーと値のペアです。グローバル属性は、アプリやユーザー固有の値をタグとして報告するのに便利です。

次の例は、アプリのバージョンとキーと値のペアをグローバル属性として定義する方法を示しています:

SplunkRum.builder()
         .setGlobalAttributes(
               Attributes.builder()
                        .put("key", "value")
                        .put(StandardAttributes.APP_VERSION, BuildConfig.VERSION_NAME)
                        .build())

RUM ライブラリの初期化後にグローバル属性のセットを更新するには、以下の SplunkRum メソッドを使用します:

  • setGlobalAttribute(AttributeKey) を使用して、単一の属性を設定または更新します。

  • updateGlobalAttributes(Consumer<AttributesBuilder> attributesUpdater) 属性を一括更新します。

グローバル属性を使用してユーザーメタデータを追加する 🔗

デフォルトでは、Android RUMエージェントは、トレースをサイトのユーザーに自動的にリンクしません。しかし、トレースのフィルターリングやデバッグのために、ユーザーメタデータを収集する必要がある可能性があります。

OpenTelemetry仕様のグローバル属性( enduser.idenduser.role など)をスパンに追加することで、ユーザーを特定することができます。

The following examples show how to add identification metadata as global attributes when initializing the agent or after initializing it, depending on whether user data is accessible at initialization:

初期化時に識別メタデータを追加する 🔗

SplunkRum.builder()
         .setGlobalAttributes(
               Attributes.builder()
                        // Adds existing userId
                        .put("enduser.id", "user-id-123456")
                        .build())

初期化後に識別メタデータを追加 🔗

splunkRum.setGlobalAttribute("enduser.id", "123456L");
splunkRum.setGlobalAttribute("enduser.type", "loggedInUser");
splunkRum.setGlobalAttribute("enduser.role", "premium");

カスタムイベントとワークフローを報告する 🔗

addRumEvent および startWorkflow API を使用して、Android アプリケーションで発生しているカスタムイベントやワークフローを報告できます。

次の例は、ユーザーがヘルプダイアログを閉じたときに報告する方法を示しています:

public Dialog onCreateDialog(Bundle savedInstanceState) {
   LayoutInflater inflater = LayoutInflater.from(activity);
   View alertView = inflater.inflate(R.layout.sample_mail_dialog, null);
   AlertDialog.Builder builder = new AlertDialog.Builder(activity);
   builder.setView(alertView)
            .setNegativeButton(R.string.cancel, (dialog, id) ->
               // Record a simple "zero duration" span with the provided name and attributes
                  SplunkRum.getInstance().addRumEvent("User Rejected Help", HELPER_ATTRIBUTES));
   return builder.create();
}

次の例は、Splunk RUM によってメトリクスが記録されるワークフローを開始する方法を示しています。ワークフローを記録するには、OpenTelemetry span インスタンスを終了する必要があります:

binding.buttonWork.setOnClickListener(v -> {
   Span hardWorker =
         SplunkRum.getInstance().startWorkflow("Main thread working hard");
   try {
      Random random = new Random();
      long startTime = System.currentTimeMillis();
      while (true) {
         random.nextDouble();
         if (System.currentTimeMillis() - startTime > 20_000) {
            break;
         }
      }
   } finally {
      hardWorker.end();
   }
});

スクリーン名のカスタマイズ 🔗

デフォルトでは、Android RUMエージェントは、screen.name 属性の値として、Fragment および Activity の各タイプの単純なクラス名を使用します。スクリーン名をカスタマイズするには、@RumScreenName アノテーションを使用します。

例えば、screen.name 属性に値 Buttercup を設定すると、以下のアクティビティが表示されます:

@RumScreenName("Buttercup")
public class MainActivity extends Activity {
   ...
}

Manually track navigation events 🔗

By default, the Android RUM agent follows the view lifecycle of Fragment and Activity instances, and certain UI frameworks, e.g. Jetpack Compose, do not use that view lifecycle. In that case, starting with the version 1.6.0, experimentalSetScreenName() can be used to explitly signal that navigation has occurred. Method name is prefixed with experimental to denote that this API might change in the future, possibly even between minor releases.

In general, upon a non-Fragment, non-Activity navigation event, the application developer calls:

SplunkRum.getInstance().experimentalSetScreenName(screenName);

This sends a navigation span to RUM and remembers the screen name for subsequent spans.

Once the explicit screen name is set, it overrides the default view livecycle tracking. If your application consists of both Activity and non-Activity views, you must clear the explicit screen name when exiting the non-Activity view:

// doubled to clear both the last view and the previous last view
SplunkRum.getInstance().experimentalSetScreenName(null)
SplunkRum.getInstance().experimentalSetScreenName(null)

When using Jetpack Compose, You can use the active route as a screen name, and the code will depend on the implementation. The following is a simplified example:

val navController = rememberNavController()
val currentBackEntry by navController.currentBackStackEntryAsState()
val currentRoute = currentBackEntry?.destination?.route

LaunchedEffect(currentRoute) {
   if (currentRoute != null) {
      lastRoute = currentRoute
      SplunkRum.getInstance().experimentalSetScreenName(currentRoute)
   }
}

Finally, a complete example of manually tracking navigation with Jetpack Compose can be found here.

エラー報告の設定 🔗

addRumException(Throwable) メソッドを使用して、処理されたエラー、例外、メッセージをレポートできます。例外は Splunk RUM UI にエラーとして表示され、エラーメトリクスが記録されます。

次の例は、サンプルアプリケーションで Unimplemented Feature: Settings エラーを報告する方法を示しています:

public boolean onOptionsItemSelected(MenuItem item) {
   int id = item.getItemId();
   if (id == R.id.action_settings) {
      SplunkRum.getInstance()
         .addRumException(
            new UnsupportedOperationException("Unimplemented Feature: Settings"),
            SETTINGS_FEATURE_ATTRIBUTES);
      return true;
   }
   return super.onOptionsItemSelected(item);
}

Splunk APM からサーバートレースコンテキストを追加する 🔗

Android RUMエージェントは、APMインストルメンテーションによって提供されるバックエンドデータを使用して、Server-Timing ヘッダーを通してサーバートレースコンテキストを収集します。ヘッダーを手動で生成したい場合もあるかも知れません。

To create the Server-Timing header manually, provide a Server-Timing header with the name traceparent, where the desc field holds the version, the trace ID, the parent ID, and the trace flag.

次のHTTPヘッダーを考えてみます:

Server-Timing: traceparent;desc="00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"

この例は、以下のデータを含むコンテキストに解決します:

version=00 trace-id=4bf92f3577b34da6a3ce929d0e0e4736
parent-id=00f067aa0ba902b7 trace-flags=01

traceparent ヘッダーの値を生成するときは、それが以下の正規表現にマッチすることを確認します:

00-([0-9a-f]{32})-([0-9a-f]{16})-01

パターンにマッチしない値を持つサーバータイミングヘッダーは自動的に破棄されます。詳しくは、W3C ウェブサイトの Server-Timingtraceparent のドキュメントを参照してください。

次のステップ 🔗

This page was last updated on 2024年07月30日.