Application Real-Time Monitoring Service (ARMS) の Real User Monitoring (RUM) サブサービスは、ユーザーセッションを再生して、ユーザーインタラクション中に発生するエラー、遅延、例外を追跡します。さらに、RUM は Application Monitoring と連携してエンドツーエンドのトレースを実装します。このトピックでは、Web アプリケーションまたはミニプログラムのエンドツーエンドトレースを有効にする方法について説明します。
前提条件
フロントエンドは RUM で監視されます。詳細については、Web アプリケーションまたは HTML5 アプリケーションを統合するおよびミニプログラムを統合するを参照してください。
バックエンドは Application Monitoring または Managed Service for OpenTelemetry で監視されます。詳細については、サービスまたはコンポーネントを統合するを参照してください。
バックエンドは、ヘッダー解析とトレースコンテキストの伝播のための HTTP ベースの Web サービスを提供します。
サポートされているトレースプロトコル
RUM は、伝播のために以下の主流のトレースプロトコルをサポートしています。
W3C: OpenTelemetry クライアントと ARMS エージェントに適用可能です。
B3 シングルおよびマルチ: Zipkin に適用可能です。
Jaeger
sw8: SkyWalking に適用可能です。
フロントエンドのトレースを有効にする
フロントエンドを RUM に統合する際にトレースを有効にします。
トレースは料金が発生し、Application Monitoring または Managed Service for OpenTelemetry の請求書に含まれます。
CDN を介した同期読み込み
シンプルモード
このモードは Web アプリケーションにのみ使用することをお勧めします。ミニプログラムの場合、ミニプログラムのリクエストはドメインを区別しないため、フルモードを使用し、allowedUrls パラメーターを設定する必要があります。
このモードは、クロスオリジンリクエストを含まないシナリオに適用可能です。デフォルトでは、バックエンドは OpenTelemetry プロトコルを採用します。 allowedUrls パラメーターは undefined に設定できますが、ドメイン内リクエストの URL はホワイトリストに追加されます。
<script>
window.__rum = {
pid: "<your pid>",
endpoint: "<your endpoint>",
// 必要に応じて、さらにパラメーターを指定します。
// トレースを有効にするかどうかを指定します。有効な値: true および false。デフォルト値: false。
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 パラメーターをトレースオプションの配列に設定します。
<script>
window.__rum = {
pid: "<your pid>",
endpoint: "<your endpoint>",
// 必要に応じて、さらにパラメーターを指定します。
// トレースを有効にするかどうかを指定します。有効な値: true および false。デフォルト値: false。
tracing: {
enable: true, // トレースを有効にするかどうかを指定します。
sample: 60, // サンプリングレートを指定します。デフォルト値: 100。
tracestate: true, // tracestate ヘッダーを有効にするかどうかを指定します。有効な値: true および false。デフォルト値: true。
baggage: false, // baggage ヘッダーを有効にするかどうかを指定します。有効な値: true および false。デフォルト値: false。
allowedUrls:[
{match: 'tracontext', propagatorTypes:['tracecontext', 'b3']}, // W3C および B3 シングルに基づいて、https://api.aliyun.com で始まる URL と一致します。
{match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // 正規表現を使用して、B3 マルチに基づいて api.aliyun.com を含む URL と一致します。
{match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // 関数を使用して、Jaeger に基づいて .api を含む URL と一致します。
]
}
};
</script>
<script type="text/javascript" src="https://sdk.rum.aliyuncs.com/v2/browser-sdk.js " crossorigin></script>
CDN を介した非同期読み込み
シンプルモード
このモードは Web アプリケーションにのみ使用することをお勧めします。ミニプログラムの場合、ミニプログラムのリクエストはドメインを区別しないため、フルモードを使用し、allowedUrls パラメーターを設定する必要があります。
このモードは、クロスオリジンリクエストを含まないシナリオに適用可能です。デフォルトでは、バックエンドは OpenTelemetry プロトコルを採用します。 allowedUrls パラメーターは undefined に設定できますが、ドメイン内リクエストの URL はホワイトリストに追加されます。
<script>
!(function(c,b,d,a){c[a]||(c[a]={});c[a].config=
{
pid: "<your pid>",
endpoint: "<your endpoint>",
// 必要に応じて、さらにパラメーターを指定します。
// トレースを有効にするかどうかを指定します。有効な値: true および false。デフォルト値: false。
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 パラメーターをトレースオプションの配列に設定します。
<script>
!(function(c,b,d,a){c[a]||(c[a]={});c[a].config=
{
pid: "<your pid>",
endpoint: "<your endpoint>",
// 必要に応じて、さらにパラメーターを指定します。
// トレースを有効にするかどうかを指定します。有効な値: true および false。デフォルト値: false。
tracing: {
enable: true, // トレースを有効にするかどうかを指定します。
sample: 100, // サンプリングレートを指定します。デフォルト値: 100。
tracestate: true, // tracestate ヘッダーを有効にするかどうかを指定します。有効な値: true および false。デフォルト値: true。
baggage: true, // baggage ヘッダーを有効にするかどうかを指定します。有効な値: true および false。デフォルト値: false。
allowedUrls:[
{match: 'tracontext', propagatorTypes:['tracecontext', 'b3']}, // W3C および B3 シングルに基づいて、https://api.aliyun.com で始まる URL と一致します。
{match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // 正規表現を使用して、B3 マルチに基づいて api.aliyun.com を含む URL と一致します。
{match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // 関数を使用して、Jaeger に基づいて .api を含む URL と一致します。
]
}
}
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 パッケージ
シンプルモード
このモードは Web アプリケーションにのみ使用することをお勧めします。ミニプログラムの場合、ミニプログラムのリクエストはドメインを区別しないため、フルモードを使用し、allowedUrls パラメーターを設定する必要があります。
このモードは、クロスオリジンリクエストを含まないシナリオに適用可能です。デフォルトでは、バックエンドは OpenTelemetry プロトコルを採用します。 allowedUrls パラメーターは undefined に設定できますが、ドメイン内リクエストの URL はホワイトリストに追加されます。
import ArmsRum from '@arms/rum-browser';
ArmsRum.init({
pid: 'your pid',
endpoint: 'your endpoint',
// 必要に応じて、さらにパラメーターを指定します。
// トレースを有効にするかどうかを指定します。有効な値: true および false。デフォルト値: false。
tracing: true // この設定は { enable: true, sample: 100, tracestate: true, allowedUrls:[], baggage: false } と同等です。
});
フルモード
このモードでは、すべてのパラメーターを設定する必要があります。 allowedUrls パラメーターをトレースオプションの配列に設定します。
import ArmsRum from '@arms/rum-browser';
ArmsRum.init({
pid: "your pid",
endpoint: "your endpoint",
// 必要に応じて、さらにパラメーターを指定します。
tracing: {
enable: true, // トレースを有効にするかどうかを指定します。
sample: 100, // サンプリングレートを指定します。デフォルト値: 100。
tracestate: true, // tracestate ヘッダーを有効にするかどうかを指定します。有効な値: true および false。デフォルト値: true。
baggage: true, // baggage ヘッダーを有効にするかどうかを指定します。有効な値: true および false。デフォルト値: false。
allowedUrls:[
{match: 'tracontext', propagatorTypes:['tracecontext', 'b3']}, // W3C および B3 シングルに基づいて、https://api.aliyun.com で始まる URL と一致します。
{match: /api\.alibaba\.com/i, propagatorTypes:['b3multi']}, // 正規表現を使用して、B3 マルチに基づいて api.aliyun.com を含む URL と一致します。
{match: (url)=>url.includes('.api'), propagatorTypes:['jaeger']}, // 関数を使用して、Jaeger に基づいて .api を含む URL と一致します。
]
}
});
トレースパラメーター
パラメーター | タイプ | デフォルト値 | 備考 |
tracing.enable | ブール値 | true | トレースを有効にするかどうかを指定します。データ型が無効な場合、値は true に変更されます。 |
tracing.sample | 数値 | 100 | サンプリングレート。有効な値: 0 から 100。データ型が無効な場合、値は 100 に変更されます。 |
tracing.tracestate | ブール値 | true | tracestate ヘッダーを有効にするかどうかを指定します。このパラメーターは、W3C が使用されている場合にのみ有効になります。 このパラメーターを false に設定すると、W3C を使用するリクエストは tracestate ヘッダーを伝送しません。 |
tracing.baggage | ブール値 | false | baggage ヘッダーを有効にするかどうかを指定します。このパラメーターを true に設定すると、RUM はトレースプロトコルに関係なく、baggage ヘッダーと関連情報をリクエストに追加します。 |
tracing.propagatorTypes | PropagatorType | PropagatorType[] | null | トレースの伝播に使用されるプロトコル。 以下の情報に注意してください。
|
tracing.allowedUrls | Array<MatchOption | TraceOption> | undefined | undefined | トレースをサポートする URL。
|
Web アプリケーションを使用している場合、次の設定が 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 が返された場合、URL は一致します。
PropagatorType
OpenTelemetry トレースコンテキストは W3C に準拠しています。
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} | |
uber-trace-id : {trace-id}:{span-id}:{parent-span-id}:{flags} | |
sw8: {sample}-{trace-id}-{segment-id}-{0}-{service}-{instance}-{endpoint}-{peer} |
上記のプロトコルによって伝播されるリクエストヘッダーは、標準の HTTP リクエストヘッダーでもクロスオリジンリソースシェアリング (CORS) のセーフリストに登録されたリクエストヘッダーでもありません。したがって、Web サイトまたは Web アプリケーションにクロスドメインリクエストが含まれる場合、サーバーで Access-Control-Allow-Headers
パラメーターを指定する必要があります。ミニプログラムのリクエストはドメインを区別しないため、ミニプログラムの場合はこのパラメーターを指定する必要があります。そうしないと、クロスドメインリクエストはブラウザーによってブロックされます。
フロントエンドのトレース設定を確認する
Web & HTML5 アプリケーション
Web サイトまたは HTML5 ページにアクセスします。
ブラウザーコンソールで、ネットワークタブをクリックします。
フロントエンドから開始された XHR または Fetch タイプの API リクエストに、トレースプロトコルに対応するヘッダーが含まれているかどうかを確認します。
Alipay、WeChat、または DingTalk のミニプログラム
シミュレーターでミニプログラムを実行します。
シミュレーターのデバッガーを開き、[ネットワーク] タブに移動します。
ミニプログラムによって開始されたリクエストに、トレースプロトコルに対応するヘッダーが含まれているかどうかを確認します。
バックエンドのトレースを有効にする
エンドツーエンドのトレースを有効にするには、バックエンドのトレースを設定する必要があります。このセクションでは、言語に基づいてバックエンドのトレースを有効にする方法について説明します。
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("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 = 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, "handle parent span error"); // 親スパンのエラー処理 } finally { span.end(); } return "success"; }
Jaeger を使用する
Jaeger を使用して、アプリケーションを Managed Service for OpenTelemetry に統合できます。 Jaeger は、Web アプリケーションのトレースを有効にするための 2 つの方法を提供します。手動インストラメントと Spring Cloud コンポーネントによるインストラメントです。詳細については、Jaeger を使用して Java アプリケーションデータを報告するを参照してください。
Spring Cloud コンポーネントを介してアプリケーションをインストラメントする場合、追加の設定なしでトレースを実装できます。
アプリケーションを手動でインストラメントする場合、フロントエンドリクエストヘッダーからトレースコンテキストを解析する必要があります。サンプルコード:
依存関係をインポートします。
<dependency> <groupId>io.jaegertracing</groupId> <artifactId>jaeger-client</artifactId> <version>Latest version</version> <!-- 最新の Jaeger バージョンを使用していることを確認してください。 --> </dependency>
トレーサーを初期化します。
<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> を、Managed Service for OpenTelemetry コンソールの [クラスター設定] ページの [アクセスポイント情報] タブに表示されているエンドポイントに置き換えます。 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());
スパンを作成します。
// @Controller でヘッダー情報を取得して、トレースコンテキストを解析します。 @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 を使用して、アプリケーションを Managed Service for OpenTelemetry に統合できます。詳細については、Zipkin を使用して Java アプリケーションデータを報告するを参照してください。
次に、リクエストヘッダーからトレースコンテキストを解析して、トレースを有効にします。サンプルコード:
// リクエストヘッダーからトレースコンテキストを解析します。
extractor = tracing.propagation().extractor(Request::getHeader);
// そのコンテキストを、名前を付けてタグを追加できるスパンに変換します。
oneWayReceive = nextSpan(tracer, extractor.extract(request))
.name("process-request")
.kind(SERVER)
... add tags etc. // タグなどを追加します
// サーバー側を開始し、finish ではなく flush します。
oneWayReceive.start().flush();
// このスパンは完了しているので、これ以上変更しないでください。ただし、
// 後続の作業を表す子を作成できます。
next = tracer.newSpan(oneWayReceive.context()).name("step2").start();
SkyWalking を使用する
SkyWalking agent for Java を使用して、アプリケーションを Managed Service for OpenTelemetry に統合できます。詳細については、SkyWalking を使用して Java アプリケーションデータを報告するを参照してください。
次に、バックエンドのトレースを有効にできます。
SkyWalking agent for Java V8.x を使用する場合は、SkyWalking Cross Process Propagation Headers Protocol v3 (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"))
})
Jaeger を使用する
Jaeger を使用して、アプリケーションを Managed Service for OpenTelemetry に統合できます。詳細については、Jaeger を使用して Go アプリケーションデータを報告するを参照してください。
次に、HTTP リクエストヘッダーからスパンコンテキストを解析して、トレースを有効にします。サンプルコード:
// HTTP リクエストヘッダーからスパンコンテキストを解析します。
spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header))
span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx))
...
defer span.Finish()
Zipkin を使用する
Zipkin を使用して、アプリケーションを Managed Service for OpenTelemetry に統合できます。詳細については、Zipkin を使用して Go アプリケーションのトレースデータを送信するを参照してください。
次に、HTTP リクエストヘッダーからスパンコンテキストを解析して、トレースを有効にします。サンプルコード:
// トレーサーを初期化します。
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 を使用して、アプリケーションを Managed Service for OpenTelemetry に統合できます。詳細については、SkyWalking を使用して Go アプリケーションデータを報告するを参照してください。
Gin、go-restful、http、Kratos v2、Go Micro、Go Resty などの主流の Web フレームワークをサポートする SkyWalking agent for 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 を使用して、アプリケーションを 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)
// HTTP リクエストヘッダーからトレースコンテキストを解析します。
carrier ={'traceparent': headers['Traceparent'], 'tracestate': headers['Tracestate']}
ctx = TraceContextTextMapPropagator().extract(carrier=carrier)
with tracer.start_span("test", context=ctx):
// 何かを実行します
return "success"
Jaeger を使用する
Jaeger を使用して、アプリケーションを Managed Service for OpenTelemetry に統合できます。詳細については、Jaeger を使用して Python アプリケーションデータを報告するを参照してください。
次に、HTTP リクエストヘッダーからスパンコンテキストを解析して、トレースを有効にします。サンプルコード:
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()
## trace デコレーター
def trace(tracer, span_name):
def decorator(f):
@functools.wraps(f)
def wrapped(*args, **kwargs):
## HTTP リクエストヘッダーからトレースコンテキストを解析します。
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 を使用して、アプリケーションを 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='<endpoint>', // エンドポイントを指定します。
agent_authentication='<auth-token>') // 認証トークンを指定します。
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='operation_name') 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:
というプレフィックスが付いています。
トポロジに基づいて、リクエストに関係するアップストリームおよびダウンストリームサービスを表示することもできます。