X-Ray SDK for Java を使用してカスタムサブセグメントを生成する - AWS X-Ray

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

X-Ray SDK for Java を使用してカスタムサブセグメントを生成する

サブセグメントは、リクエストを処理するために行われた作業の詳細で、トレースのセグメントを拡張します。計測対象クライアントで呼び出しを行うたびに、X-Ray SDK は、サブセグメントで生成された情報を記録します。追加のサブセグメントを作成して、他のサブセグメントをグループ化したり、コードセクションのパフォーマンスを測定したり、注釈やメタデータを記録することができます。

サブセグメントを管理するには、beginSubsegment および endSubsegment メソッドを使用します。

例 GameModel.java - カスタムサブセグメント

import com.amazonaws.xray.AWSXRay; ... public void saveGame(Game game) throws SessionNotFoundException { // wrap in subsegment Subsegment subsegment = AWSXRay.beginSubsegment("Save Game"); try { // check session String sessionId = game.getSession(); if (sessionModel.loadSession(sessionId) == null ) { throw new SessionNotFoundException(sessionId); } mapper.save(game); } catch (Exception e) { subsegment.addException(e); throw e; } finally { AWSXRay.endSubsegment(); } }

この例では、サブセグメント内のコードが、セッションモデルのメソッドを使用して DynamoDB からゲームのセッションをロードし、AWS SDK for Java の DynamoDB マッパーを使用してゲームを保存します。このコードをサブセグメントにラップすることで、呼び出しが DynamoDB サブセグメントの Save Game の子としてコンソールのトレースビューに表示されます。

サブセグメントのコードがチェック例外をスローした場合は、try ブロックにコードをラップして、AWSXRay.endSubsegment() ブロックで finally を呼び出し、常にサブセグメントが閉じられるようにします。サブセグメントが閉じていない場合は、親セグメントが完了できず、X-Ray に送信されません。

チェック例外をスローしないコードの場合は、コードを AWSXRay.CreateSubsegment 関数として Lambda に渡すことができます。

例 Lambda 関数のサブセグメント

import com.amazonaws.xray.AWSXRay; AWSXRay.createSubsegment("getMovies", (subsegment) -> { // function code });

セグメントまたは別のサブセグメント内にサブセグメントを作成する場合、X-Ray SDK for Java によってその ID が生成され、開始時刻と終了時刻が記録されます。

例 サブセグメントとメタデータ

"subsegments": [{ "id": "6f1605cd8a07cb70", "start_time": 1.480305974194E9, "end_time": 1.4803059742E9, "name": "Custom subsegment for UserModel.saveUser function", "metadata": { "debug": { "test": "Metadata string from UserModel.saveUser" } },

非同期プログラミングおよびマルチスレッドプログラミングの場合、サブセグメントを手動で endSubsegment() メソッドに渡して正しく閉じられていることを確認する必要があります。これはX-Ray、コンテキストが非同期実行中に変更される可能性があるためです。親セグメントが閉じられた後、非同期サブセグメントが閉じられた場合、このメソッドはセグメント全体をX-Rayデーモンに自動的にストリーミングします。

例 非同期サブセグメント

@GetMapping("/api") public ResponseEntity<?> api() { CompletableFuture.runAsync(() -> { Subsegment subsegment = AWSXRay.beginSubsegment("Async Work"); try { Thread.sleep(3000); } catch (InterruptedException e) { subsegment.addException(e); throw e; } finally { AWSXRay.endSubsegment(subsegment); } }); return ResponseEntity.ok().build(); }