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

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

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

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

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

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

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

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

非同期プログラミングでの X-Ray の使用

X-Ray SDK for Java は、 の非同期 Java プログラムで使用できますSegmentContextExecutors。は Executor インターフェイス SegmentContextExecutor を実装しています。つまり、 のすべての非同期オペレーションに渡すことができます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());