マルチスレッドアプリケーションでのスレッド間のセグメントコンテキストの受け渡し - AWS X-Ray

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

マルチスレッドアプリケーションでのスレッド間のセグメントコンテキストの受け渡し

アプリケーションで新しいスレッドを作成すると、AWSXRayRecorder は現在のセグメントまたはサブセグメント Entity への参照を保持しません。実装されたクライアントを新しいスレッドで使用すると、SDK は存在しないセグメントに書き込みを試み、SegmentNotFoundException が発生します。

開発中に例外をスローしないようにするには、代わりにエラーを記録するよう指示する ContextMissingStrategy でレコーダーを設定します。SetContextMissingStrategy を使用してコード内に戦略を設定するか、環境変数 または システムプロパティを使用して同等のオプションを設定することができます。

エラーに対処する 1 つの方法として、スレッドを開始するときに beginSegment を呼び出して新しいセグメントを使用する方法と、スレッドを終了するときに endSegment を使用する方法があります。 これは、アプリケーションの起動時に実行されるコードのように、HTTP リクエストに応答して実行されないコードを実装する場合に機能します。

複数のスレッドを使用して着信リクエストを処理する場合は、現在のセグメントまたはサブセグメントを新しいスレッドに渡してグローバルレコーダーに渡すことができます。これにより、新しいスレッド内に記録された情報が、そのリクエストに関して記録された残りの情報と同じセグメントに関連付けられることが保証されます。新しいスレッドでセグメントが使用可能になったら、そのセグメントのコンテキストへのアクセス権を持つ任意の実行可能オブジェクトをsegment.run(() -> { ... })方法。

(例については、「実装されたクライアントをワーカースレッドで使用する」を参照してください。)

X-Ray を非同期プログラミングで使用する

X-Ray SDK for Java は、で非同期の Java プログラムで使用できます。セグメントコンテキストエグゼキューター]。SegmentContextExecutor は Executor インターフェイスを実装しています。つまり、このインタフェースは、CompletableFuture]。これにより、非同期操作がそのコンテキスト内で正しいセグメントで実行されることが保証されます。

例 App.java: SegmentContextExecutor を CompletableFuture に渡す

DynamoDbAsyncClient client = DynamoDbAsyncClient.create(); AWSXRay.beginSegment(); // ... client.getItem(request).thenComposeAsync(response -> { // If we did not provide the segment context executor, this request would not be traced correctly. return client.getItem(request2); }, SegmentContextExecutors.newSegmentContextExecutor());