すべてのプロダクト
Search
ドキュメントセンター

Application Real-Time Monitoring Service:フロントエンドとバックエンドのトレースの接続

最終更新日:Jun 21, 2026

ARMS リアルユーザーモニタリング (RUM) を使用すると、ユーザーセッションを起点として、ユーザーインタラクション中のエラー、パフォーマンスの低下、および例外を追跡できます。ARMS アプリケーションモニタリングと統合することで、エンドツーエンドトレースを実現し、問題分析のワークフローを効率化できます。このトピックでは、モバイルアプリケーションのフロントエンドとバックエンドのトレースを接続する方法について説明します。

前提条件

  • モバイルアプリケーション (Android または iOS) が最新の RUM SDK で計装済みであること。詳細については、「Android アプリのモニタリング」をご参照ください。

    説明

    SDK バージョンは、Android の場合は 0.2.0 以降、iOS の場合は 0.2.0 以降である必要があります。

  • バックエンドアプリケーションが ARMS アプリケーションモニタリングまたは Managed Service for OpenTelemetry でモニタリングされていること。詳細については、「統合ガイド」をご参照ください。

  • バックエンドアプリケーションが、ヘッダーを解析してトレースコンテキストを関連付けるための Web サービス (HTTP) を提供していること。

重要

異なるリージョン間でのフロントエンドアプリケーションとバックエンドアプリケーション間のトレース接続はサポートされなくなりました。フロントエンドアプリケーションとバックエンドアプリケーションが異なるリージョンにある場合は、CloudMonitor 2.0 コンソールにアクセスし、バックエンドアプリケーションと同じリージョンおよびワークスペースでフロントエンドアプリケーションを計装してください。

対応トレースプロトコル

  • SkyWalking:v3 (SkyWalking 8.x エージェント用)

  • OpenTelemetry (W3C)

手順

サービスドメインの追加とトレース伝播の有効化

  1. にログインします。 ARMSコンソールを使用します。

  2. 左側のナビゲーションペインで、ユーザー体験監視 > アプリケーションリスト を選択し、上部メニューでリージョンを選択します。

  3. アプリケーション名をクリックし、[Application Settings] をクリックします。

  4. [Request Management] セクションで、サービスドメインを設定します。

    重要

    サードパーティのサービスドメインを独自のドメインとして追加しないでください。追加すると、トレース伝播が失敗する可能性があります。

    サービスドメインを追加し、[Trace Propagation] スイッチをオンにして、バックエンドサービスに対応する伝播プロトコルを選択します。

    説明

    バックエンドアプリケーションが ARMS でトレース用に計装されていることを確認してください。詳細については、「統合ガイド」をご参照ください。

    形式名

    形式

    sw8 (Skywalking v3)

    sw8: {sample}-{trace-id}-{segment-id}-{0}-{service}-{instance}-{endpoint}-{peer}

    tracecontext

    traceparent : {version}-{trace-id}-{parent-id}-{trace-flags}

    tracestate: rum={version}&{appType}&{pid}&{sessionId}

  5. [Confirm] をクリックします。トレース伝播の設定がモバイルアプリケーションに自動的にプッシュされます。

    重要
    • 設定がクライアント側に適用されるまで、ユーザーの動作によっては数分かかる場合があります。デフォルトでは、SDK はアプリのコールドスタート時に 1 回設定を取得します。また、アプリがバックグラウンドで 30 秒以上実行された後に再度開かれた場合にも、設定を再度取得します。

    • モバイルアプリケーションは Web アプリケーションのオリジン間リソース共有 (CORS) ポリシーの対象ではありませんが、サーバー側のゲートウェイは各プロトコルのリクエストヘッダーの伝播をサポートしている必要があります。サポートしていない場合、バックエンドサービスはヘッダーを受信できず、RUM とバックエンドトレース間の接続が失敗します。

設定の確認

このセクションでは、SkyWalking v3 伝播プロトコルを例として設定を確認します。

Android

Android Studio の App Inspection ツールを使用して、ネットワークリクエストヘッダーに sw8 プロトコル情報が含まれていることを確認します。この情報が存在すれば、設定が成功したことを確認できます。

iOS

Xcode Profile ツールを使用して、ネットワークリクエストヘッダーに sw8 プロトコル情報が含まれていることを確認します。そのためには、Xcode ツールバーで [Product] > [Profile] > [Network] を選択します。

Instruments インターフェースで、[HTTP Traffic] トラックを選択します。左下隅のドロップダウンリストから、[List: HTTP Transactions] ビューに切り替えます。対象のリクエストを選択し、右側の詳細ペインの Request Headers セクションで、挿入された sw8 ヘッダーを確認します。

バックエンドトレースの関連付け設定

完全なエンドツーエンドトレースを確立するには、バックエンドアプリケーションも設定する必要があります。サポートされているバックエンドアプリケーションのタイプと計装方法は次のとおりです。

Java アプリケーション

アプリケーションモニタリングエージェント

ARMS アプリケーションモニタリングエージェントには OpenTelemetry プロトコルのサポートが組み込まれているため、追加の設定なしで RUM とトレースを関連付けることができます。ただし、次の点を確認する必要があります。

  • アプリケーションモニタリングエージェントは、バージョン 2.x、3.x、または 4.x である必要があります。最適なエクスペリエンスを得るために、バージョン 4.x へのアップグレードを推奨します。

  • Tomcat、Jetty、WebLogic、Undertow などの主流の Web コンテナー、および SpringBoot や SpringMVC などのサポートされているフレームワークを使用している必要があります。サポートされているコンポーネントとフレームワークの完全なリストについては、「アプリケーションモニタリングでサポートされているJavaコンポーネントとフレームワーク」をご参照ください。

アプリケーションモニタリングエージェントのインストール手順については、「Javaアプリケーションのモニタリング」をご参照ください。

OpenTelemetry

OpenTelemetry を使用してアプリケーションをインストルメント化し、ARMS (Managed Service for OpenTelemetry) にデータを送信できます。これには、自動インストルメンテーションと手動インストルメンテーションの 2 つの方法があります。

  • 自動計装では、OpenTelemetry がほとんどの主流フレームワークをサポートしているため、RUM とトレースを関連付けるための追加設定は必要ありません。

    説明

    OpenTelemetry がサポートする Java フレームワークの詳細については、「OpenTelemetryを使用したJavaアプリケーションデータのレポート」をご参照ください。

  • 手動計装では、OpenTelemetry SDK の拡張機構を使用してトレースを関連付ける必要があります。このプロセスでは、フロントエンドリクエストの traceparent および tracestate ヘッダーからトレースコンテキストを解析します。以下のコードは、SpringBoot アプリケーションの例を示しています。

    1. OpenTelemetry の依存関係を追加します。

      <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-api</artifactId>
      </dependency>
      <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk-trace</artifactId>
      </dependency>
      <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-extension-annotations</artifactId>
        <version>1.18.0</version>
      </dependency>
      <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-exporter-otlp</artifactId>
      </dependency>
      <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk</artifactId>
      </dependency>
      <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-semconv</artifactId>
        <version>1.30.1-alpha</version>
      </dependency>
      <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-sdk-extension-autoconfigure</artifactId>
        <version>1.34.1</version>
      </dependency>
      <dependency>
        <groupId>io.opentelemetry</groupId>
        <artifactId>opentelemetry-extension-incubator</artifactId>
        <version>1.35.0-alpha</version>
      </dependency>
    2. OpenTelemetry の初期化時に W3C プロパゲーターを追加します。

      Resource resource = Resource.getDefault()
              .merge(Resource.create(Attributes.of(
                      ResourceAttributes.SERVICE_NAME, "otel-demo",
                      ResourceAttributes.HOST_NAME, "xxxx"
      )));
      
      SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
              .addSpanProcessor(BatchSpanProcessor.builder(OtlpHttpSpanExporter.builder()
                      .setEndpoint("Your Endpoint")
                      .addHeader("Authentication", "Your Token")
                      .build()).build())
              .setResource(resource)
              .build();
      
      openTelemetry = OpenTelemetrySdk.builder()
              .setTracerProvider(sdkTracerProvider)
              // ここで W3C プロパゲーターを追加します。
              .setPropagators(ContextPropagators.create(
                      TextMapPropagator.composite(W3CTraceContextPropagator.getInstance(), W3CBaggagePropagator.getInstance()))
               ).buildAndRegisterGlobal();
      // ここでは、特定の拡張機能を持つ Tracer が必要です。
      tracer = ExtendedTracer.create(openTelemetry.getTracer("com.example.tracer", "1.0.0"));
    3. ビジネスインターフェースで、headers パラメーターを追加し、リクエストヘッダーからトレースコンテキストを解析して、親を設定します。

      // Controller でトレースコンテキストを解析するために、リクエストヘッダーパラメーターを追加します。
      @RequestMapping("/test")
      public String test(@RequestHeader Map<String, String> headers) {
          Span span = OpenTelemetrySupport.getTracer()
                  .spanBuilder("/test")
                  // headers から親スパンを解析します。
                  .setParentFrom(OpenTelemetrySupport.getContextPropagators(), headers)
                  .setSpanKind(SpanKind.SERVER)
                  .startSpan();
          try (Scope scope = span.makeCurrent()) {
              // 処理を実行
          } catch (Throwable t) {
              span.setStatus(StatusCode.ERROR, "handle parent span error");
          } finally {
              span.end();
          }
          return "success";
      }

SkyWalking

完全な計装手順については、「Java Agent プラグイン」をご参照ください。

SkyWalking は現在、計装用に Java Agent のみを提供しています。リンク先のドキュメントの手順に従うだけで、RUM とバックエンドトレースを関連付けることができます。

プロトコルマッチング: RUM 側で設定された sw8 (v3) プロトコルは、SkyWalking 8.x エージェントに対応しています。

Go アプリケーション

OpenTelemetry

完全な計装手順については、「OpenTelemetryを使用したGoアプリケーションデータのレポート」をご参照ください。

ドキュメントに従ってアプリケーションを計装します。次に、HTTP リクエストハンドラーでリクエストコンテキストからスパンを生成し、RUM トレースと関連付けます。

// トレーサーを初期化します。
tracer := otel.Tracer(common.TraceInstrumentationName)
// リクエストコンテキストからスパンを生成します。
handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
    ctx := req.Context()
    span := trace.SpanFromContext(ctx)
    // 処理を実行
    w.Write([]byte("Hello World"))
})

SkyWalking

完全な計装手順については、「SkyWalkingを使用したGoアプリケーションデータのレポート」をご参照ください。

ドキュメントに従ってアプリケーションを計装します。skywalking-go 方式を推奨します。この方式は、Gin、go-restful、http、go-kratos v2、go-micro、go-resty などの主流の Web フレームワークをサポートしているため、コード変更なしで RUM トレースを関連付けることができます。

HTTP リクエストヘッダーからトレースコンテキストを手動で解析するには、次のコードを使用します。

// 'sw8' HTTP リクエストヘッダーからコンテキストを抽出します。
span, ctx, err := tracer.CreateEntrySpan(r.Context(), "/api/test", func(key string) (string, error) {
		return r.Header.Get(key), nil
})

Python アプリケーション

OpenTelemetry

完全な計装手順については、「OpenTelemetryを使用したPythonアプリケーションデータのレポート」をご参照ください。

ドキュメントに従ってアプリケーションを計装します。次に、HTTP リクエストヘッダーからスパンコンテキストを解析し、RUM トレースと関連付けます。以下はコードサンプルです。

// トレーサーを初期化します。
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(ConsoleSpanExporter()))

tracer = trace.get_tracer(__name__)

@app.route('/test')
def test():
    headers = dict(request.headers)

    // headers からトレースコンテキストを解析します。
    carrier = {'traceparent': headers['traceparent'], 'tracestate': headers['tracestate']}
    ctx = TraceContextTextMapPropagator().extract(carrier=carrier)

    with tracer.start_span("test", context=ctx):
        // 処理を実行
        return "success"

SkyWalking

完全な計装手順については、「SkyWalkingを使用したPythonアプリケーションデータのレポート」をご参照ください。

ドキュメントに従ってアプリケーションを計装します。次に、HTTP リクエストヘッダーからスパンコンテキストを解析し、RUM トレースと関連付けます。以下はコードサンプルです。

from skywalking import config, agent
from skywalking.trace.context import SpanContext, get_context
from skywalking.trace.carrier import CarrierItem

# SkyWalking を設定します。必要に応じてパラメーターを調整してください。
config.init(agent_collector_backend_services='<endpoint>',
            agent_authentication='<auth-token>')

agent.start()

# HTTP リクエストヘッダーを渡す必要があるサンプルの HTTP リクエストハンドラー
def handle_request(headers):
    # リクエストヘッダーからトレース情報を抽出します。
    carrier_items = []
    for item in SpanContext.make_carrier():
        carrier_header = headers.get(item.key.lower())
        if carrier_header:
            carrier_items.append(CarrierItem(item.key, carrier_header))

    carrier = SpanContext.make_carrier(carrier_items)

    # キャリアからトレースコンテキストを抽出します。
    context = get_context().extract(carrier)
    
    # リクエストを処理するための新しいスパンを作成します。
    with get_context().new_entry_span(op='operation_name') as span:
        # ここでリクエストを処理します。スパンは終了時に自動的に送信されます。
        ...

# 'sw8' を含む受信 HTTP リクエストヘッダーをシミュレートします。
incoming_headers = {
    'sw8': '1-My40LjU=-MTY1MTcwNDI5OTk5OA==-xxxx-xx-x-x==',  # サンプル値。リクエストからの実際の値を使用してください。
    # その他のヘッダー...
}

# 関数を呼び出してリクエストを処理します。
handle_request(incoming_headers)

エンドツーエンドトレースデータの表示

フロントエンドとバックエンドのトレースを接続した後、ARMS RUM コンソールでフロントエンドリクエストの呼び出しチェーンを表示できます。

[View Call Chain] をクリックすると、リクエストの完全な呼び出しチェーンとアプリケーショントポロジーが表示されます。その後、RUM のリクエスト詳細とバックエンドトレースデータを組み合わせて、低速または異常なリクエストを診断できます。

最上位のスパンは、RUM からのエントリスパンを表します。エントリスパンは、クライアント側の計装タイプによって次のように分類されます。

  • Web および H5: アプリケーション名は rum-browser、スパン名のプレフィックスは "browser.request:" です。

  • ミニプログラム: アプリケーション名は rum-miniapp、スパン名のプレフィックスは "miniapp.request:" です。

  • Android: アプリケーション名は rum-android、スパン名のプレフィックスは "android.request:" です。

  • iOS: アプリケーション名は rum-ios、スパン名のプレフィックスは "ios.request:" です。

また、トポロジーグラフを使用して、リクエスト全体の上流および下流サービスを可視化することもできます。