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 🔗

デフォルトでは、Android RUMエージェントは、FragmentActivity インスタンスのビューライフサイクルに従いますが、Jetpack Composeなどの特定のUIフレームワークは、そのビューライフサイクルを使用しません。その場合、バージョン1.6.0から、ナビゲーションが発生したことを明示的に通知するために experimentalSetScreenName() を使用できます。メソッド名の先頭に experimental を付けているのは、このAPIが将来、マイナーリリースの間にも変更される可能性があることを示すためです。

一般的に、非 Fragment、非 Activity ナビゲーションイベントが発生すると、アプリケーション開発者は次を呼び出します:

SplunkRum.getInstance().experimentalSetScreenName(screenName);

これはナビゲーションスパンをRUMに送信し、それ以降のスパンのためにスクリーン名を記憶します。

一度明示的なスクリーン名が設定されると、それはデフォルトのビューのライブサイクル追跡を上書きします。アプリケーションが ActivityActivity 以外のビューの両方で構成されている場合、 Activity 以外のビューを終了するときに明示的なスクリーン名をクリアする必要があります:

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

Jetpack Composeを使用する場合、アクティブなルートをスクリーン名として使用でき、コードは実装に依存します。以下は簡略化した例です:

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

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

最後に、Jetpack Composeを使って手動でナビゲーションを追跡する完全な例は、こちらにあります

エラー報告の設定 🔗

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 のドキュメントを参照してください。

次のステップ 🔗

このページは 2024年07月30日 に最終更新されました。