Application Real-Time Monitoring Service (ARMS) の Real User Monitoring (RUM) サブサービスは、ユーザーセッションを再生して、ユーザーインタラクション中に発生するエラー、遅延、および例外を追跡します。さらに、RUM は Application Monitoring と連携してエンドツーエンドトレースを実装します。このトピックでは、Android アプリまたは iOS アプリのエンドツーエンドトレースを有効にする方法について説明します。
前提条件
フロントエンドは RUM で監視されます。詳細については、Android アプリの監視を参照してください。
説明RUM SDK のバージョンは 0.2.0 以降です。
バックエンドは、Application Monitoring または Managed Service for OpenTelemetry で監視されます。詳細については、統合センターを参照してください。
バックエンドは、ヘッダー解析とトレースコンテキストの伝播のための HTTP ベースの Web サービスを提供します。
サポートされているトレースプロトコル
sw8 (SkyWalking エージェント V8.x)
W3C (OpenTelemetry)
手順
サービスのドメイン名を追加し、トレースを有効にする
ARMS コンソール にログインします。
左側のナビゲーションペインで、 を選択します。上部のナビゲーションバーで、アプリが存在するリージョンを選択します。
アプリを見つけ、[アクション] 列で その他 > その他の設定 を選択します。アプリケーションの詳細ページで、アプリケーション設定 タブをクリックします。
リクエスト管理 タブをクリックし、サービスのドメイン名を追加します。
重要サードパーティサービスのドメイン名は追加しないでください。追加すると、トレースが有効にならない場合があります。
[独自のサービスを追加] をクリックします。[独自のサービスを追加] ダイアログボックスで、リンクを開く をオンにし、バックエンドのトレースプロトコルを選択します。
説明Managed Service for OpenTelemetry にアプリを統合する方法の詳細については、サービスまたはコンポーネントの統合を参照してください。
プロトコル
形式
sw8: {sample}-{trace-id}-{segment-id}-{0}-{service}-{instance}-{endpoint}-{peer}
traceparent : {version}-{trace-id}-{parent-id}-{trace-flags}
tracestate: rum={version}&{appType}&{pid}&{sessionId}
OK をクリックします。その後、トレース設定がアプリに自動的にプッシュされます。
重要ユーザーの動作によっては、設定がアプリに反映されるまでに数分かかる場合があります。デフォルトでは、RUM SDK は、コールドスタート時に最初に設定を取得し、その後、バックエンドで 30 秒以上実行した後にアプリを再起動するときに設定を取得します。
クロスオリジンリソースシェアリング (CORS) がアプリに適用されない場合でも、サーバーゲートウェイで使用されるプロトコルはリクエストヘッダーを伝播できる必要があります。そうでない場合、バックエンドサーバーはヘッダーを受け入れることができず、トレースを実装できません。
フロントエンドのトレース設定を確認する
この例では、SkyWalking Cross Process Propagation Headers Protocol v3 (sw8) を使用してトレース設定を確認します。
Android
Android Studio に組み込まれている App Inspection を使用して、リクエストに sw8 情報が含まれているかどうかを確認します。含まれている場合、設定は成功です。
iOS
Xcode の上部ナビゲーションバーで を選択して、Xcode プロファイルを起動します。リクエストに sw8 情報が含まれているかどうかを確認します。含まれている場合、設定は成功です。

バックエンドのトレースを有効にする
エンドツーエンドトレースを有効にするには、バックエンドのトレースを設定する必要があります。次のセクションでは、言語に基づいてバックエンドのトレースを有効にする方法について説明します。
Java
ARMS エージェントを使用する
デフォルトでは、ARMS エージェントは OpenTelemetry プロトコルをサポートしています。したがって、追加の設定なしで、Application Monitoring で監視されるアプリのトレースが実装されます。ただし、次の条件が満たされていることを確認してください。
ARMS エージェントのバージョンは V2.x、V3.x、または V4.x です。より良いユーザーエクスペリエンスを得るには、V4.x を使用することをお勧めします。
Apache Tomcat、Jetty、WebLogic、Undertow などの主流の Web コンテナと、Spring Boot や Spring Web MVC などのサポートされているフレームワークが使用されています。ARMS でサポートされているコンポーネントとフレームワークの詳細については、ARMS でサポートされている Java コンポーネントとフレームワークを参照してください。
アプリの ARMS エージェントをインストールする方法については、Java アプリケーションの監視を参照してください。
OpenTelemetry を使用する
OpenTelemetry を介してアプリを Managed Service for OpenTelemetry に統合し、アプリを自動または手動でインストルメントできます。
アプリを自動的にインストルメントする場合、OpenTelemetry はほとんどの主流のフレームワークをサポートしているため、追加の設定なしでトレースを実装できます。
説明OpenTelemetry でサポートされている Java フレームワークについては、OpenTelemetry を使用して Java アプリケーションのトレースデータをレポートするを参照してください。
アプリを手動でインストルメントする場合、OpenTelemetry SDK を使用して、フロントエンドリクエストヘッダー traceparent および tracestate からトレースコンテキストを解析することでトレースを有効にする必要があります。次のサンプルコードは、Spring Boot アプリを手動でインストルメントし、トレースを有効にする方法を示しています。
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>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("エンドポイント") // エンドポイントを指定します。 .addHeader("Authentication", "トークン") // トークンを指定します。 .build()).build()) .setResource(resource) .build(); // OpenTelemetry SDK を構築し、グローバルに登録します。 openTelemetry = OpenTelemetrySdk.builder() .setTracerProvider(sdkTracerProvider) // W3C 伝播設定を追加します。 .setPropagators(ContextPropagators.create( TextMapPropagator.composite(W3CTraceContextPropagator.getInstance(), W3CBaggagePropagator.getInstance())) ).buildAndRegisterGlobal(); // トレーサーを設定します。 tracer = ExtendedTracer.create(openTelemetry.getTracer("com.example.tracer", "1.0.0"));ヘッダー情報を取得し、トレースコンテキストを解析し、親スパンを設定します。
// @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, "親スパンの処理エラー"); } finally { span.end(); } return "success"; }
SkyWalking を使用する
Java 用の SkyWalking エージェントを使用して、アプリを Managed Service for OpenTelemetry に統合できます。詳細については、SkyWalking を使用して Java アプリケーションデータをレポートするを参照してください。
その後、バックエンドのトレースを有効にできます。
Java V8.x 用の SkyWalking エージェントを使用する場合は、sw8 を使用する必要があります。
Go
OpenTelemetry を使用する
OpenTelemetry を使用して、アプリを Managed Service for OpenTelemetry に統合できます。詳細については、OpenTelemetry を使用して Go アプリケーションのトレースデータを送信するを参照してください。
次に、HTTP リクエストハンドラーを使用してリクエストコンテキストからスパンを生成し、トレースを有効にします。サンプルコード:
// トレーサーを初期化します。
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 を使用して、アプリを Managed Service for OpenTelemetry に統合できます。詳細については、SkyWalking を使用して Go アプリケーションデータをレポートするを参照してください。
Gin、go-restful、http、Kratos v2、Go Micro、Go Resty などの主流の Web フレームワークをサポートする Go 用の SkyWalking エージェントを使用することをお勧めします。その後、コードを変更せずにトレースを実装できます。
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 を使用して、アプリを Managed Service for OpenTelemetry に統合できます。詳細については、OpenTelemetry を使用して Python アプリケーションのトレースデータをレポートするを参照してください。
次に、HTTP リクエストヘッダーからスパンコンテキストを解析してトレースを有効にします。サンプルコード:
// トレーサーを初期化します。
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"SkyWalking を使用する
SkyWalking を使用して、アプリを Managed Service for OpenTelemetry に統合できます。詳細については、SkyWalking を使用して Python アプリケーションデータをレポートするを参照してください。
次に、HTTP リクエストヘッダーからスパンコンテキストを解析してトレースを有効にします。サンプルコード:
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='<エンドポイント>', # エンドポイントを指定します。
agent_authentication='<認証トークン>') # 認証トークンを指定します。
agent.start()
# 関数を使用して 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='操作名') as span: # 操作名を指定します。
# リクエストを処理し、処理完了時にスパンを自動的に送信します。
...
# SkyWalking セグメント ID を含む辞書を使用して HTTP リクエストヘッダーをシミュレートします。
incoming_headers = {
'sw8': '1-My40LjU=-MTY1MTcwNDI5OTk5OA==-xxxx-xx-x-x==', # 値を指定します。
# その他のヘッダー...
}
# 関数を呼び出してリクエストを処理します。
handle_request(incoming_headers)完全なトレースデータを表示する
エンドツーエンドトレースが有効になったら、ARMS コンソールの RUM モジュールでフロントエンドリクエストのトレースデータを表示できます。
コールチェーンの表示 をクリックして、リクエストの完全なトレースデータとトポロジを表示します。リクエストの詳細とバックエンドトレースデータに基づいて、低速または異常なリクエストなどの問題を分析できます。
一番上のスパンはルートスパンです。スパン名とアプリ名は、アプリの種類によって異なります。
Web アプリケーションまたは HTML5 アプリケーション:アプリケーション名は rum-browser で、スパン名にはプレフィックス
browser.request:が付いています。ミニプログラム:ミニプログラム名は rum-miniapp で、スパン名にはプレフィックス
miniapp.request:が付いています。Android アプリ:アプリ名は rum-android で、スパン名にはプレフィックス
android.request:が付いています。iOS アプリ:アプリ名は rum-ios で、スパン名にはプレフィックス
ios.request:が付いています。
トポロジに基づいて、リクエストに関係するアップストリームサービスとダウンストリームサービスを表示することもできます。