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 |
ブール値以外の値を指定した場合、 |
|
tracing.sample |
数値 |
100 |
値は [0, 100] の範囲内である必要があります。この範囲外の値は 100 にリセットされます。 |
|
tracing.tracestate |
ブール値 |
true |
デフォルトで有効です。このパラメーターは W3C
|
|
tracing.baggage |
ブール値 |
false |
トレーシングが有効になっている場合、RUM はトレーシング標準に関係なく、関連情報を含む |
|
tracing.propagatorTypes |
PropagatorType | PropagatorType[] |
null |
現在のトレースの伝搬標準を指定します。 注:
|
|
tracing.allowedUrls |
Array<MatchOption | TraceOption> | undefined |
undefined |
トレーシングを有効にするリクエスト URL を指定します。
|
ブラウザでは、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.comはhttps://api.aliyun.com/v1/resourceに一致します。 -
RegExp: 提供された正規表現を使用して URL をテストします。 -
function: URL をパラメーターとして関数を実行します。戻り値がtrueの場合、一致とみなされます。
PropagatorType
デフォルトでは、OpenTelemetry ベースのトレーシングに tracecontext が使用されます。
type PropagatorType = 'tracecontext' | 'b3' | 'b3multi' | 'jaeger' | 'sw8';
以下の表は、各トレースプロトコルによって伝搬されるリクエストヘッダーを示しています。
|
伝搬形式 |
フォーマット |
|
traceparent : {version}-{trace-id}-{parent-id}-{trace-flags} tracestate: rum={version}&{appType}&{pid}&{sessionId} |
|
|
b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId} |
|
|
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: {sample}-{trace-id}-{segment-id}-{0}-{service}-{instance}-{endpoint}-{peer} |
上記のプロトコルによって伝搬されるリクエストヘッダーは、標準的な HTTP リクエストヘッダーではなく、CORS セーフリスト (CORS-safelisted request-headers) にも含まれていません。そのため、ウェブサイトまたはアプリケーションがクロスドメインリクエストを行う場合 (特にミニプログラムなどのシナリオ)、サーバー側の Access-Control-Allow-Headers にこれらのヘッダーを明示的に指定する必要があります。指定しない場合、CORS ポリシーによりブラウザがクロスドメインリクエストをブロックします。
RUM トレース相関の検証
Web および H5
-
ご利用のウェブサイトまたは Web H5 ページにアクセスします。
-
ブラウザの開発者ツールを開き、Network タブに切り替えます。
-
フロントエンドから開始された API リクエスト (タイプ: XHR/Fetch) を確認し、そのリクエストヘッダーに該当する伝搬プロトコルヘッダーが含まれているかどうかをチェックします。
ミニプログラム
-
ミニプログラムをデベロッパー用シミュレーターで実行します。
-
開発者ツールのデバッガーを開き、Network タブに切り替えます。
-
ミニプログラムから開始されたリクエストのリクエストヘッダーに、該当する伝搬プロトコルヘッダーが含まれているかどうかを確認します。
バックエンドトレース相関の構成
完全なエンドツーエンドトレーシングを有効にするには、バックエンドアプリケーションも構成する必要があります。以下のバックエンドアプリケーションタイプおよび統合方法がサポートされています。
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 トレースと相関付ける必要があります。これには、フロントエンドのリクエストヘッダー (
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 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")); -
コントローラーメソッドに 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 トレースとの相関に追加の構成は不要です。
-
手動イベントトラッキングの場合、フロントエンドのリクエストヘッダーからトレースコンテキストを解析する必要があります。以下のコードを参照してください。
-
依存関係を追加します。
<dependency> <groupId>io.jaegertracing</groupId> <artifactId>jaeger-client</artifactId> <version>Latest Version</version> <!-- 最新の Jaeger バージョンを使用してください。 --> </dependency> -
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()); -
ビジネスインターフェイスでスパンを作成します。以下のコードを参照してトレースを相関付けます。
// トレースコンテキストを解析するために、コントローラーにリクエストヘッダーパラメーターを追加します。 @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:"です。
また、アプリケーショントポロジーを使用して、リクエスト全体の上流および下流サービスを視覚化することもできます。
トポロジービュー タブでは、力指向、階層型、円形 のレイアウトを切り替えてサービストポロジーを表示できます。各ノードには、呼び出し回数、レイテンシー、エラー数などのメトリックが表示されます。