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)
手順
サービスドメインの追加とトレース伝播の有効化
にログインします。 ARMSコンソールを使用します。
-
左側のナビゲーションペインで、 を選択し、上部メニューでリージョンを選択します。
-
アプリケーション名をクリックし、[Application Settings] をクリックします。
-
[Request Management] セクションで、サービスドメインを設定します。
重要サードパーティのサービスドメインを独自のドメインとして追加しないでください。追加すると、トレース伝播が失敗する可能性があります。
サービスドメインを追加し、[Trace Propagation] スイッチをオンにして、バックエンドサービスに対応する伝播プロトコルを選択します。
説明バックエンドアプリケーションが ARMS でトレース用に計装されていることを確認してください。詳細については、「統合ガイド」をご参照ください。
形式名
形式
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}
-
[Confirm] をクリックします。トレース伝播の設定がモバイルアプリケーションに自動的にプッシュされます。
重要-
設定がクライアント側に適用されるまで、ユーザーの動作によっては数分かかる場合があります。デフォルトでは、SDK はアプリのコールドスタート時に 1 回設定を取得します。また、アプリがバックグラウンドで 30 秒以上実行された後に再度開かれた場合にも、設定を再度取得します。
-
モバイルアプリケーションは Web アプリケーションのオリジン間リソース共有 (CORS) ポリシーの対象ではありませんが、サーバー側のゲートウェイは各プロトコルのリクエストヘッダーの伝播をサポートしている必要があります。サポートしていない場合、バックエンドサービスはヘッダーを受信できず、RUM とバックエンドトレース間の接続が失敗します。
-
設定の確認
このセクションでは、SkyWalking v3 伝播プロトコルを例として設定を確認します。
Android
Android Studio の App Inspection ツールを使用して、ネットワークリクエストヘッダーに sw8 プロトコル情報が含まれていることを確認します。この情報が存在すれば、設定が成功したことを確認できます。
iOS
Xcode Profile ツールを使用して、ネットワークリクエストヘッダーに sw8 プロトコル情報が含まれていることを確認します。そのためには、Xcode ツールバーで を選択します。
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 アプリケーションの例を示しています。-
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("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")); -
ビジネスインターフェースで、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:"です。
また、トポロジーグラフを使用して、リクエスト全体の上流および下流サービスを可視化することもできます。