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

Application Real-Time Monitoring Service:フロントエンドとバックエンドのトレースを相関付ける

最終更新日:May 09, 2026

ARMS RUM を使用すると、ユーザーのセッションから開始して、ユーザー操作中のエラーやパフォーマンスの低下、異常を追跡できます。ARMS アプリケーションモニタリングと統合することで、エンドツーエンドの分析が可能になり、問題診断のための完全なパスを提供します。本トピックでは、Web モニタリング向けにフロントエンドとバックエンドのトレースを相関付ける方法について説明します。

前提条件

  • ご利用のフロントエンドアプリケーション (Web およびミニプログラムを含む) が RUM と統合されていることを確認してください。詳細については、「Web および H5 アプリケーションの統合」および「ミニプログラムの統合」をご参照ください。

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

  • ご利用のバックエンドアプリケーションが、リクエストヘッダーからトレースコンテキストを解析可能な HTTP Web サービスを提供していることを確認してください。

重要

フロントエンドおよびバックエンドアプリケーション間のクロスリージョン相関は、もはやサポートされていません。フロントエンドおよびバックエンドアプリケーションが異なるリージョンにある場合は、CloudMonitor コンソール にアクセスし、バックエンドアプリケーションと同じリージョンおよびワークスペースでフロントエンドアプリケーションを統合してください。

サポートされるトレースプロトコル

RUM トレース相関は、現在以下の主要なトレースコンテキスト伝搬プロトコルをサポートしています。

  • w3c: OpenTelemetry クライアントおよび ARMS エージェントを含む。

  • b3/b3multi: Zipkin

  • Jaeger

  • sw8: SkyWalking

RUM トレース相関の有効化

RUM エージェントをフロントエンドアプリケーションに統合する際に、Tracing 構成オプションを有効にしてください。

重要

RUM トレース相関を有効にすると、追加のトレースデータが生成され、ご利用のアプリケーションモニタリングまたは Managed Service for OpenTelemetry の課金に影響を与える可能性があります。

CDN 同期読み込み

シンプルモード

重要

この方法はブラウザでのみ推奨されます。ミニプログラムにはオリジンリクエストの概念がないため、完全モードを使用して allowedUrls を構成する必要があります。

このモードは、通常、バックエンドがデフォルトで OpenTelemetry 標準を使用するオリジンリクエストに使用されます。allowedUrls の型は undefined ですが、オリジンリクエストは自動的に許可されます。

<script>
  window.__rum = {
    pid: "<your pid>",
    endpoint: "<your endpoint>",
    //... その他の構成オプションはここでは省略されています。
    // Tracing 構成スイッチ。デフォルトでは無効です。
    tracing: true // { enable: true,  sample: 100, tracestate: true, allowedUrls:[], baggage: false } と同等です。
  };
</script>
<script type="text/javascript" src="https://sdk.rum.aliyuncs.com/v2/browser-sdk.js " crossorigin></script>

完全モード

すべての構成設定を完全制御できます。allowedUrls の型は Array<TraceOption> です。

<script>
  window.__rum = {
    pid: "<your pid>",
    endpoint: "<your endpoint>",
    //... その他の構成オプションはここでは省略されています。
    // Tracing 構成スイッチ。デフォルトでは無効です。
    tracing: {
      enable: true, // トレーシングを有効にします。デフォルトでは無効です。
      sample: 60, // サンプリングレート: 60%。デフォルト: 100%。
      tracestate: true, // tracestate 伝搬を有効にします。デフォルトでは有効です。
      baggage: false, // バゲージ伝搬を無効にします。デフォルトでは無効です。
      allowedUrls:[
        {match: 'https://api.aliyun.com', propagatorTypes:['tracecontext', 'b3']}, // 'https://api.aliyun.com' で始まる URL に一致します。伝搬方式: tracecontext、b3。
        {match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // 'api.alibaba.com' を含む URL に正規表現で一致します。伝搬方式: b3multi。
        {match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // '.api' を含む URL に関数で一致します。伝搬方式: Jaeger。
      ]
    }
  };
</script>
<script type="text/javascript" src="https://sdk.rum.aliyuncs.com/v2/browser-sdk.js " crossorigin></script>

CDN 非同期読み込み

シンプルモード

重要

この方法はブラウザでのみ推奨されます。ミニプログラムにはオリジンリクエストの概念がないため、完全モードを使用して allowedUrls を構成する必要があります。

このモードは、通常、バックエンドがデフォルトで OpenTelemetry 標準を使用するオリジンリクエストに使用されます。allowedUrls の型は undefined ですが、オリジンリクエストは自動的に許可されます。

<script>
  !(function(c,b,d,a){c[a]||(c[a]={});c[a].config=
    {
      pid: "<your pid>",
      endpoint: "<your endpoint>",
      //... その他の構成オプションはここでは省略されています。
      // Tracing 構成スイッチ。デフォルトでは無効です。
      tracing: true
    }
   with(b)with(body)with(insertBefore(createElement("script"),firstChild))setAttribute("crossorigin","",src=d)
  })(window,document,"https://sdk.rum.aliyuncs.com/v1/bl.js","__bl");
</script>
完全モード

すべての構成設定を完全制御できます。allowedUrls の型は Array<TraceOption> です。

<script>
  !(function(c,b,d,a){c[a]||(c[a]={});c[a].config=
    {
      pid: "<your pid>",
      endpoint: "<your endpoint>",
      //... その他の構成オプションはここでは省略されています。
      // Tracing 構成スイッチ。デフォルトでは無効です。
      tracing: {
        enable: true, // トレーシングを有効にします。デフォルトでは無効です。
        sample: 100, // サンプリングレート。デフォルト: 100%。
        tracestate: true, // tracestate 伝搬を有効にします。デフォルトでは有効です。
        baggage: true, // バゲージ伝搬を有効にします。デフォルトでは無効です。
        allowedUrls:[
          {match: 'https://api.aliyun.com', propagatorTypes:['tracecontext', 'b3']}, // 'https://api.aliyun.com' で始まる URL に一致します。伝搬方式: tracecontext、b3。
          {match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // 'api.alibaba.com' を含む URL に正規表現で一致します。伝搬方式: b3multi。
          {match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // '.api' を含む URL に関数で一致します。伝搬方式: Jaeger。
        ]
      }
    }
    with(b)with(body)with(insertBefore(createElement("script"),firstChild))setAttribute("crossorigin","",src=d)
   })(window,document,"https://sdk.rum.aliyuncs.com/v1/bl.js","__bl");
</script>

npm パッケージ

シンプルモード

重要

この方法はブラウザでのみ推奨されます。ミニプログラムにはオリジンリクエストの概念がないため、完全モードを使用して allowedUrls を構成する必要があります。

このモードは、通常、バックエンドがデフォルトで OpenTelemetry 標準を使用するオリジンリクエストに使用されます。allowedUrls の型は undefined ですが、オリジンリクエストは自動的に許可されます。

import ArmsRum from '@arms/rum-browser';

ArmsRum.init({
  pid: 'your pid',
  endpoint: 'your endpoint',
  //... その他の構成オプションはここでは省略されています。
  // Tracing 構成スイッチ。デフォルトでは無効です。
  tracing: true, // { enable: true,  sample: 100, tracestate: true, allowedUrls:[], baggage: false } と同等です。
});
完全モード

すべての構成設定を完全制御できます。allowedUrls の型は Array<TraceOption> です。

import ArmsRum from '@arms/rum-browser';

ArmsRum.init({
  pid: "your pid",
  endpoint: "your endpoint",
  //... その他の構成オプションはここでは省略されています。
  tracing: {
    enable: true, // トレーシングを有効にします。デフォルトでは無効です。
    sample: 100, // サンプリングレート。デフォルト: 100%。
    tracestate: true, // tracestate 伝搬を有効にします。デフォルトでは有効です。
    baggage: true, // バゲージ伝搬を有効にします。デフォルトでは無効です。
    allowedUrls:[
      {match: 'https://api.aliyun.com', propagatorTypes:['tracecontext', 'b3']}, // 'https://api.aliyun.com' で始まる URL に一致します。伝搬方式: tracecontext、b3。
      {match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // 'api.alibaba.com' を含む URL に正規表現で一致します。伝搬方式: b3multi。
      {match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // '.api' を含む URL に関数で一致します。伝搬方式: Jaeger。
    ]
  }
});

トレーシングパラメーター

パラメーター

デフォルト

説明

tracing.enable

ブール値

true

ブール値以外の値を指定した場合、true にリセットされます。

tracing.sample

数値

100

値は [0, 100] の範囲内である必要があります。この範囲外の値は 100 にリセットされます。

tracing.tracestate

ブール値

true

デフォルトで有効です。このパラメーターは W3C tracecontext モードでのみ有効であり、他のモードでは tracestate ヘッダーを使用しません。

false に設定すると、W3C モードで tracestate リクエストヘッダーが含まれなくなります。

tracing.baggage

ブール値

false

トレーシングが有効になっている場合、RUM はトレーシング標準に関係なく、関連情報を含む baggage ヘッダーをリクエストに含めます。

tracing.propagatorTypes

PropagatorType | PropagatorType[]

null

現在のトレースの伝搬標準を指定します。

注:

  • allowedUrls 内で propagatorTypes が構成されている場合、この設定は上書きされます。

  • 構成に sw8 が含まれている場合、他のすべてのタイプは無視され、sw8 標準のみが使用されます。

tracing.allowedUrls

Array<MatchOption | TraceOption> | undefined

undefined

トレーシングを有効にするリクエスト URL を指定します。

  1. ブラウザでは、オリジンリクエストがデフォルトで許可されます。クロスドメインリクエストの場合は、allowedUrls を構成する必要があります。

  2. ミニプログラムでは、トレーシングを有効にするには必ず allowedUrls を構成する必要があります。

ブラウザでは、tracing.allowedUrls に以下のルールが追加されます。

{
  match: (url) => (/^https?:\/\/*/.test(url) || startsWith(url, location.origin)),
  propagatorTypes: ['tracecontext']
}

MatchOption

type MatchOption = string | RegExp | ((value: string) => boolean);

allowedUrls は完全な URL に一致します。以下の型を受け入れます。

  • string: 指定された値で始まる任意の URL に一致します。たとえば、https://api.aliyun.comhttps://api.aliyun.com/v1/resource に一致します。

  • RegExp: 提供された正規表現を使用して URL をテストします。

  • function: URL をパラメーターとして関数を実行します。戻り値が true の場合、一致とみなされます。

PropagatorType

デフォルトでは、OpenTelemetry ベースのトレーシングに tracecontext が使用されます。

type PropagatorType = 'tracecontext' | 'b3' | 'b3multi' | 'jaeger' | 'sw8';

以下の表は、各トレースプロトコルによって伝搬されるリクエストヘッダーを示しています。

伝搬形式

フォーマット

tracecontext

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

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

b3

b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}

b3multi

X-B3-TraceId: {TraceId}

X-B3-SpanId: {SpanId}

X-B3-ParentSpanId: {ParentSpanId}

X-B3-Sampled: {SamplingState}

Jaeger

uber-trace-id : {trace-id}:{span-id}:{parent-span-id}:{flags}

sw8

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

重要

上記のプロトコルによって伝搬されるリクエストヘッダーは、標準的な HTTP リクエストヘッダーではなく、CORS セーフリスト (CORS-safelisted request-headers) にも含まれていません。そのため、ウェブサイトまたはアプリケーションがクロスドメインリクエストを行う場合 (特にミニプログラムなどのシナリオ)、サーバー側の Access-Control-Allow-Headers にこれらのヘッダーを明示的に指定する必要があります。指定しない場合、CORS ポリシーによりブラウザがクロスドメインリクエストをブロックします。

RUM トレース相関の検証

Web および H5

  1. ご利用のウェブサイトまたは Web H5 ページにアクセスします。

  2. ブラウザの開発者ツールを開き、Network タブに切り替えます。

  3. フロントエンドから開始された API リクエスト (タイプ: XHR/Fetch) を確認し、そのリクエストヘッダーに該当する伝搬プロトコルヘッダーが含まれているかどうかをチェックします。

ミニプログラム

  1. ミニプログラムをデベロッパー用シミュレーターで実行します。

  2. 開発者ツールのデバッガーを開き、Network タブに切り替えます。

  3. ミニプログラムから開始されたリクエストのリクエストヘッダーに、該当する伝搬プロトコルヘッダーが含まれているかどうかを確認します。

バックエンドトレース相関の構成

完全なエンドツーエンドトレーシングを有効にするには、バックエンドアプリケーションも構成する必要があります。以下のバックエンドアプリケーションタイプおよび統合方法がサポートされています。

Java アプリケーション

ARMS エージェント

ARMS アプリケーションモニタリングエージェントは OpenTelemetry プロトコルを組み込みでサポートしているため、RUM トレースとの相関に追加の構成は不要です。ただし、以下の点を確認してください。

  • サポートされる ARMS アプリケーションモニタリングエージェントのバージョン: 2.x、3.x、および 4.x。より良いエクスペリエンスを得るには、バージョン 4.x へのアップグレードを推奨します。

  • エージェントは Tomcat、Jetty、WebLogic、Undertow などの主要な Web コンテナおよび Spring Boot、Spring MVC などのフレームワークをサポートしています。サポートされるコンポーネントおよびフレームワークの完全な一覧については、「アプリケーションモニタリングでサポートされる Java コンポーネントおよびフレームワーク」をご参照ください。

ARMS アプリケーションモニタリングエージェントの統合手順については、「Java アプリケーションのモニタリングを開始する」をご参照ください。

OpenTelemetry

OpenTelemetry を使用して、ご利用のアプリケーションを ARMS (Managed Service for OpenTelemetry) と統合できます。自動イベントトラッキングと手動イベントトラッキングの 2 つの方法があります。

  • 自動イベントトラッキングの場合、OpenTelemetry はすでにほとんどの主要なフレームワークをサポートしています。RUM トレースとの相関に追加の構成は不要です。

    説明

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

  • 手動イベントトラッキングの場合、OpenTelemetry SDK が提供する拡張メカニズムを使用して RUM トレースと相関付ける必要があります。これには、フロントエンドのリクエストヘッダー (traceparenttracestate) からトレースコンテキストを解析することが含まれます。以下は Spring Boot シナリオのコードサンプルです。

    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 Propagator を追加します。

      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 Propagator を追加します。
              .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")
                  // ヘッダーから親スパンを解析します。
                  .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";
      }

Jaeger

Jaeger は Web シナリオ向けに、手動イベントトラッキングおよび Spring Cloud コンポーネントを使用したイベントトラッキングの 2 つの方法を提供します。完全な統合手順については、「Jaeger を使用して Java アプリケーションデータをレポートする」をご参照ください。

  • Spring Cloud コンポーネントを使用したイベントトラッキングの場合、RUM トレースとの相関に追加の構成は不要です。

  • 手動イベントトラッキングの場合、フロントエンドのリクエストヘッダーからトレースコンテキストを解析する必要があります。以下のコードを参照してください。

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

      <dependency>
        <groupId>io.jaegertracing</groupId>
        <artifactId>jaeger-client</artifactId>
        <version>Latest Version</version> <!-- 最新の Jaeger バージョンを使用してください。 -->
      </dependency>
    2. Tracer を初期化します。

      <endpoint> は、Managed Service for OpenTelemetry コンソールの クラスターの設定 > エンドポイント情報 ページから、対応するクライアントおよびリージョンのエンドポイントに置き換えてください。

      // manualDemo をご利用のアプリケーション名に置き換えてください。
      io.jaegertracing.Configuration config = new io.jaegertracing.Configuration("manualDemo");
      io.jaegertracing.Configuration.SenderConfiguration sender = new io.jaegertracing.Configuration.SenderConfiguration();
      // <endpoint> をコンソール概要ページから対応するクライアントおよびリージョンのエンドポイントに置き換えてください。
      sender.withEndpoint("<endpoint>");
      config.withSampler(new io.jaegertracing.Configuration.SamplerConfiguration().withType("const").withParam(1));
      config.withReporter(new io.jaegertracing.Configuration.ReporterConfiguration().withSender(sender).withMaxQueueSize(10000));
      GlobalTracer.register(config.getTracer());
    3. ビジネスインターフェイスでスパンを作成します。以下のコードを参照してトレースを相関付けます。

      // トレースコンテキストを解析するために、コントローラーにリクエストヘッダーパラメーターを追加します。
      @RequestMapping("/test")
      public String test(@RequestHeader Map<String, String> headers) {
          Tracer tracer = GlobalTracer.get();
          SpanContext parentCtx = tracer.extract(Format.Builtin.HTTP_HEADERS, new TextMapAdapter(headers));
          Span span;
          if (parentCtx != null) {
              span = tracer.buildSpan("/test").asChildOf(parentCtx).start();
          } else {
              span = tracer.buildSpan("/test").start();
          }
          try (Scope ignored = tracer.activateSpan(span)) {
              tracer.activeSpan().setTag("methodName", "test");
              // 何らかの処理を実行
          } catch (Throwable t) {
              TracingHelper.onError(e, span);
              throw e
          } finally {
              span.finish();
          }
          return "success";
      }

Zipkin

完全な統合手順については、「Zipkin を使用して Java アプリケーションデータをレポートする」をご参照ください。

ドキュメントの統合手順に従い、その後、サーバーサイドコードでリクエストヘッダーからコンテキストを解析して RUM トレースと相関付けます。

// リクエストヘッダーからコンテキストを抽出します。
extractor = tracing.propagation().extractor(Request::getHeader);

// そのコンテキストを、名前とタグを追加できるスパンに変換します。
oneWayReceive = nextSpan(tracer, extractor.extract(request))
.name("process-request")
.kind(SERVER)
... // タグなどを追加

// サーバーサイドを開始し、finish ではなく flush を呼び出します。
oneWayReceive.start().flush();

// このスパンは完了しているため、これ以上変更しないでください。ただし、
// 後続の作業を表す子スパンを作成することは可能です。
next = tracer.newSpan(oneWayReceive.context()).name("step2").start();

SkyWalking

完全な統合手順については、「Java エージェントプラグイン」をご参照ください。

SkyWalking 統合は Java エージェントによって処理されます。ドキュメントの手順に従うだけで、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"))
})

Jaeger

完全な統合手順については、「Jaeger を使用して Go アプリケーションデータをレポートする」をご参照ください。

統合手順に従い、その後、HTTP リクエストヘッダーからスパンコンテキストを解析して RUM トレースと相関付けます。以下のコードを参照してください。

// HTTP オブジェクトから spanCtx を抽出します。
spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))
span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx))
...
defer  span.Finish()

Zipkin

完全な統合手順については、「Zipkin を使用して Go アプリケーションデータをレポートする」をご参照ください。

統合手順に従い、その後、HTTP リクエストヘッダーからスパンコンテキストを解析して RUM トレースと相関付けます。以下のコードを参照してください。

// トレーサーを初期化します。
tracer, err := exampletracer.NewTracer("go-frontend", frontendPort)
// リクエストコンテキストからスパンを生成します。
router.Methods("GET").Path("/").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    // コンテキストからスパンを取得します
	span := zipkin.SpanFromContext(r.Context())
    // タグを追加します
    span.Tag("some_key", "some_value")
    // 何か処理を行います...
	span.Annotate(time.Now(), "some_event")
})

SkyWalking

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

統合手順に従ってください。gin、go-restful、http、go-kratos v2、go-micro、go-resty などの主要な Web フレームワークをサポートし、コード変更なしで RUM トレースと相関付けられる skywalking-go 統合方法の使用を推奨します。

HTTP リクエストヘッダーから手動でトレースコンテキストを解析したい場合は、以下のコードを使用することもできます。

// HTTP リクエストヘッダー `sw8` からコンテキストを抽出します。
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)

    # ヘッダーからトレースコンテキストを抽出します。
    carrier ={'traceparent': headers['Traceparent'], 'tracestate': headers['Tracestate']}
    ctx = TraceContextTextMapPropagator().extract(carrier=carrier)

    with tracer.start_span("test", context=ctx):
        # 何か処理を行います
        return "success"

Jaeger

完全な統合手順については、「Jaeger を使用して Python アプリケーションデータをレポートする」をご参照ください。

統合手順に従い、その後、HTTP リクエストヘッダーからスパンコンテキストを解析して RUM トレースと相関付けます。以下のコードを参照してください。

import logging
from flask import Flask
from jaeger_client import Config
from opentracing.ext import tags
from opentracing.propagation import Format

# トレーサーを初期化します。
def init_tracer(service, scope_manager=None):
    logging.getLogger('').handlers = []
    logging.basicConfig(format='%(message)s', level=logging.DEBUG)

    config = Config(
        config={
            'sampler': {
                'type': 'const',
                'param': 1,
            },
            'logging': True,
            'reporter_batch_size': 1,
        },
        service_name=service,
        scope_manager=scope_manager
    )
    return config.initialize_tracer()

# トレースデコレーター。
def trace(tracer, span_name):
    def decorator(f):
        @functools.wraps(f)
        def wrapped(*args, **kwargs):
            # ヘッダーからトレースコンテキストを抽出します。
            span_ctx = tracer.extract(Format.HTTP_HEADERS, request.headers)
            span_tags = {tags.SPAN_KIND: tags.SPAN_KIND_RPC_SERVER}

            with tracer.start_active_span(span_name, child_of=span_ctx, tags=span_tags) as scope:
                rv = f(*args, **kwargs)

            return rv
        return wrapped
    return decorator

# API テスト例。
@app.route('/test')
@trace(tracer, 'test')
def test():
    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 コンソールでフロントエンドリクエストの完全なエンドツーエンドトレースを表示できます。

ARMS RUM コンソールで、API リクエスト タブに移動します。API リクエスト一覧で、操作 列の トレースを表示 リンクを見つけます。

トレースを表示 をクリックすると、完全なトレースおよびアプリケーショントポロジーが表示されます。RUM リクエストの詳細とバックエンドトレースデータを組み合わせて、遅延またはエラーのあるリクエストを分析できます。

これにより、API リクエストの詳細 ページが開きます。左側にはリクエストの一覧が表示されます。右側で、トレーシング > トレースの詳細 タブに切り替えてウォーターフォール図を表示します。この図は、ブラウザ (rum-browser) から、ingress およびフロントエンド (Node.js) を経由してバックエンド (Java) に至るまでの、各サービスの呼び出しシーケンスとレイテンシーを示します。

最上位のスパンは RUM エントリースパンを表します。その名前はクライアント統合タイプによって異なります。

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

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

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

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

また、アプリケーショントポロジーを使用して、リクエスト全体の上流および下流サービスを視覚化することもできます。

トポロジービュー タブでは、力指向階層型円形 のレイアウトを切り替えてサービストポロジーを表示できます。各ノードには、呼び出し回数、レイテンシー、エラー数などのメトリックが表示されます。