モバイルアプリケーションのフロントエンドモニタリングデータとバックエンドトレースを接続することで、タップからサーバー応答、そして戻るまでのすべてのユーザーリクエストに対するフルスタックの可視性を実現します。
リアルユーザーモニタリング (RUM) は、ユーザーのデバイスで発生する事象をキャプチャします。アプリケーションモニタリングは、ご利用のサーバーで発生する事象をキャプチャします。エンドツーエンドトレースはこれら 2 つをリンクします。モバイルアプリケーションからバックエンドサービス全体に至るまで、遅いリクエストや失敗したリクエストをトレースして、根本原因を特定します。
仕組み
エンドツーエンドトレースが有効になっている場合、RUM SDK は、アプリケーションが独自のサービスに送信するすべての HTTP リクエストにトレースコンテキストヘッダーを挿入します。バックエンドエージェントはこのヘッダーを読み取り、フロントエンドリクエストスパンとバックエンド処理スパンの間に親子関係を作成します。
ARMS は、2 つの伝播プロトコルをサポートしています。
| プロトコル | ヘッダー形式 | 使用するタイミング |
|---|---|---|
| W3C Trace Context (OpenTelemetry) | traceparent: {version}-{trace-id}-{parent-id}-{trace-flags} and tracestate: rum={version}&{appType}&{pid}&{sessionId} | ご利用のバックエンドが ARMS エージェントまたは OpenTelemetry を使用している場合 |
| sw8 (SkyWalking v8.x) | sw8: {sample}-{trace-id}-{segment-id}-{0}-{service}-{instance}-{endpoint}-{peer} | ご利用のバックエンドが SkyWalking v8.x エージェントを使用している場合 |
前提条件
開始する前に、以下を確認してください。
ご利用のモバイルアプリケーション (Android または iOS) が RUM で監視されていること。詳細については、「アプリケーションの監視」をご参照ください。
RUM SDK のバージョンが 0.2.0 以降であること。
ご利用のバックエンドがアプリケーションモニタリングまたは OpenTelemetry 向けマネージドサービスで監視されていること。詳細については、「インテグレーションセンター」をご参照ください。
ご利用のバックエンドが、リクエストヘッダーを解析して伝播できる HTTP ベースの Web サービスを提供していること。
ステップ 1: サービスドメインの追加とトレースの有効化
RUM SDK を構成して、ご利用のバックエンドサービスに送信されるリクエストにトレースコンテキストヘッダーを挿入します。
ARMS コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。上部のナビゲーションバーで、アプリケーションが配置されているリージョンを選択します。
対象のアプリケーションを探し、[操作] 列で [その他] > [詳細設定] を選択します。 アプリケーション詳細ページで、[アプリケーション設定] タブをクリックします。
[リクエスト管理] タブをクリックします。
[自分のサービスを追加] をクリックし、サービスドメインを入力します。
重要ご利用のサービスに属するドメインのみを追加してください。サードパーティのサーバーはトレースヘッダーを認識または伝播しないため、サードパーティのドメインを追加するとトレーシングが機能しなくなります。
「[Add Own Service]」ダイアログボックスで、[Link Open] を有効化し、バックエンド エージェントに対応するトレーシング プロトコルを選択します。
説明OpenTelemetry 連携については、「サービスまたはコンポーネントの統合」をご参照ください。
[OK] をクリックします。
構成は自動的にアプリケーションにプッシュされます。次の動作に注意してください。
RUM SDK は、コールドスタート時、およびアプリケーションがバックグラウンドで 30 秒以上実行された後にフォアグラウンドに戻ったときに、最新の構成をプルします。構成の変更がすべてのユーザーに反映されるまでに数分かかる場合があります。
ご利用のサーバーゲートウェイは、トレースコンテキストヘッダーを伝播できる必要があります。ゲートウェイがこれらのヘッダーを削除または無視する場合、バックエンドはトレースに参加できません。これは、オリジン間リソース共有 (CORS) がネイティブモバイルアプリケーションに影響を与えない場合でも適用されます。
ステップ 2: フロントエンドトレースの検証
構成がアプリケーションにプッシュされたら、RUM SDK が送信 HTTP リクエストにトレースヘッダーを挿入していることを確認します。
Android
Android Studio でご利用のプロジェクトを開きます。
デバイスまたはエミュレーターでアプリケーションを実行します。
Android Studio で App Inspection を開きます。
アプリケーションでネットワークリクエストをトリガーし、リクエストヘッダーを検査します。
sw8またはtraceparentヘッダー (選択したプロトコルによって異なります) が表示される場合、トレースは正しく構成されています。

iOS
Xcode でご利用のプロジェクトを開きます。
「[製品]」 > 「[プロファイル]」を選択して Instruments を起動します。
[ネットワーク] テンプレートを選択して HTTP トラフィックをキャプチャします。
アプリケーションでネットワークリクエストをトリガーし、リクエストヘッダーを検査します。
sw8またはtraceparentヘッダーが表示される場合、トレースは正しく構成されています。

ステップ 3: バックエンドトレースの有効化
フロントエンドはトレースコンテキストヘッダーを挿入しています。次に、ご利用のバックエンドがこれらのヘッダーを読み取り、トレースを継続するように構成します。セットアップは、ご利用の言語とエージェントによって異なります。
Java
ARMS エージェント (推奨)
ARMS エージェントは、デフォルトで OpenTelemetry プロトコルをサポートしています。ご利用の Java アプリケーションがすでにアプリケーションモニタリングで監視されている場合、エンドツーエンドトレースは追加の構成なしで機能します。
要件:
ARMS エージェントのバージョンは V2.x、V3.x、または V4.x。より良いユーザーエクスペリエンスのためには V4.x を推奨します。
サポートされている Web コンテナ: Apache Tomcat、Jetty、WebLogic、または Undertow
サポートされているフレームワーク: Spring Boot または Spring Web MVC。詳細については、「ARMS がサポートする Java コンポーネントとフレームワーク」をご参照ください。
ARMS エージェントをインストールするには、詳細については、「Java アプリケーションの監視」をご参照ください。
OpenTelemetry (自動インストルメンテーション)
自動イベントトラッキングで OpenTelemetry を使用する場合、OpenTelemetry はほとんどの主要な Java フレームワークをサポートしているため、追加の構成なしでトレースが機能します。詳細については、「OpenTelemetry を使用した Java アプリケーションのトレースデータレポート」をご参照ください。
OpenTelemetry (手動インストルメンテーション)
アプリケーションを手動でイベントトラッキングする場合、フロントエンドリクエストから traceparent および tracestate ヘッダーを解析してトレースを継続します。次の例は、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. W3C 伝播で OpenTelemetry を初期化する:
Resource resource = Resource.getDefault()
.merge(Resource.create(Attributes.of(
ResourceAttributes.SERVICE_NAME, "otel-demo",
ResourceAttributes.HOST_NAME, "<your-hostname>"
)));
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
.addSpanProcessor(BatchSpanProcessor.builder(OtlpHttpSpanExporter.builder()
.setEndpoint("<your-endpoint>")
.addHeader("Authentication", "<your-token>")
.build()).build())
.setResource(resource)
.build();
// Enable W3C trace context propagation
openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
.setPropagators(ContextPropagators.create(
TextMapPropagator.composite(
W3CTraceContextPropagator.getInstance(),
W3CBaggagePropagator.getInstance())))
.buildAndRegisterGlobal();
tracer = ExtendedTracer.create(
openTelemetry.getTracer("com.example.tracer", "1.0.0"));次のプレースホルダーを実際の値に置き換えます。
| プレースホルダー | 説明 | 例 |
|---|---|---|
<your-hostname> | ご利用のサーバーのホスト名 | my-server-01 |
<your-endpoint> | OpenTelemetry コレクターエンドポイント | https://tracing-analysis-dc-hz.aliyuncs.com/... |
<your-token> | 認証トークン | xXxXxXx |
3. リクエストヘッダーからトレースコンテキストを解析する:
// In your @Controller, extract the trace context from the incoming request headers
@RequestMapping("/test")
public String test(@RequestHeader Map<String, String> headers) {
Span span = OpenTelemetrySupport.getTracer()
.spanBuilder("/test")
// Set the parent span from the frontend request headers
.setParentFrom(OpenTelemetrySupport.getContextPropagators(), headers)
.setSpanKind(SpanKind.SERVER)
.startSpan();
try (Scope scope = span.makeCurrent()) {
// Process the request
} catch (Throwable t) {
span.setStatus(StatusCode.ERROR, "handle parent span error");
} finally {
span.end();
}
return "success";
}SkyWalking
Java 用 SkyWalking エージェントを使用して、ご利用のアプリケーションを OpenTelemetry 向けマネージドサービスと統合します。詳細については、「SkyWalking を使用した Java アプリケーションデータのレポート」をご参照ください。
SkyWalking v8.x エージェントを使用する場合は、ステップ 1 で sw8 プロトコルを選択します。
Go
OpenTelemetry
ご利用の Go アプリケーションを OpenTelemetry 向けマネージドサービスと統合します。詳細については、「OpenTelemetry を使用した Go アプリケーションのトレースデータ送信」をご参照ください。
次に、ご利用の HTTP ハンドラでリクエストコンテキストからスパンを抽出します。
// Initialize the tracer
tracer := otel.Tracer(common.TraceInstrumentationName)
// Extract the span from the incoming request context
handler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
ctx := req.Context()
span := trace.SpanFromContext(ctx)
// Process the request
w.Write([]byte("Hello World"))
})SkyWalking
Go 用 SkyWalking エージェントを使用して、ご利用のアプリケーションを OpenTelemetry 向けマネージドサービスと統合します。詳細については、「SkyWalking を使用した Go アプリケーションデータのレポート」をご参照ください。
SkyWalking Go エージェントは、Gin、go-restful、http、Kratos v2、Go Micro、Go Resty などの Web フレームワークをそのままサポートしています。サポートされているフレームワークでエージェントを使用する場合、コード変更なしでトレースが機能します。
リクエストヘッダーからトレースコンテキストを手動で解析するには:
// Extract context from the sw8 HTTP request header
span, ctx, err := tracer.CreateEntrySpan(r.Context(), "/api/test", func(key string) (string, error) {
return r.Header.Get(key), nil
})Python
OpenTelemetry
ご利用の Python アプリケーションを OpenTelemetry 向けマネージドサービスと統合します。詳細については、「OpenTelemetry を使用した Python アプリケーションのトレースデータレポート」をご参照ください。
次に、リクエストヘッダーからトレースコンテキストを解析します。次の例は Flask を使用しています。
# Initialize the tracer
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)
# Parse the W3C trace context from the request headers
carrier = {
'traceparent': headers['Traceparent'],
'tracestate': headers['Tracestate']
}
ctx = TraceContextTextMapPropagator().extract(carrier=carrier)
with tracer.start_span("test", context=ctx):
# Process the request
return "success"SkyWalking
SkyWalking を使用して、ご利用のアプリケーションを OpenTelemetry 向けマネージドサービスと統合します。詳細については、「SkyWalking を使用した Python アプリケーションデータのレポート」をご参照ください。
次に、sw8 ヘッダーからトレースコンテキストを解析します。
from skywalking import config, agent
from skywalking.trace.context import SpanContext, get_context
from skywalking.trace.carrier import CarrierItem
# Configure SkyWalking
config.init(
agent_collector_backend_services='<endpoint>',
agent_authentication='<auth-token>')
agent.start()
def handle_request(headers):
# Extract trace information from the 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)
# Extract the trace context from the carrier
context = get_context().extract(carrier)
# Create a span that continues the frontend trace
with get_context().new_entry_span(op='operation_name') as span:
# Process the request
...
# Example: use a dictionary with SkyWalking segment IDs to simulate incoming request headers
incoming_headers = {
'sw8': '1-My40LjU=-MTY1MTcwNDI5OTk5OA==-xxxx-xx-x-x==',
}
handle_request(incoming_headers)次のプレースホルダーを実際の値に置き換えます。
| プレースホルダー | 説明 |
|---|---|
<endpoint> | SkyWalking コレクターバックエンドサービスアドレス |
<auth-token> | コレクターの認証トークン |
ステップ 4:完全なトレースの表示
フロントエンドおよびバックエンドのトレーシングを有効化した後、ARMS コンソールでエンドツーエンドのトレースデータを表示します。
RUM モジュールで、調査対象のリクエストを特定します。
[コールチェーンの表示] をクリックして、フロントエンドのリクエストからバックエンドサービスに至るまでのすべてのスパンを含む完全なトレースを確認します。
最上位のスパンは、RUM SDK によって生成されたルートスパンです。ルートスパンの命名規則は以下のとおりです:
| アプリケーションタイプ | アプリケーション名 | スパン名のプレフィックス |
|---|---|---|
| Web または HTML5 | rum-browser | browser.request: |
| ミニアプリ | rum-miniapp | miniapp.request: |
| Android | rum-android | android.request: |
| iOS | rum-ios | ios.request: |
トレース表示画面には、リクエストに関与するすべてのアップストリームおよびダウンストリームサービスを示すトポロジーダイアグラムも含まれています。このダイアグラムを活用して、遅延やエラーの原因となっているサービスを特定してください。