Amazon SQS とAWS X-Ray - AWS X-Ray

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

Amazon SQS とAWS X-Ray

AWS X-Rayは Amazon Simple Queue Service (Amazon SQS) と統合して、Amazon SQS キュー経由で渡されるメッセージをトレースします。サービスが X-Ray SDK を使用してリクエストをトレースする場合、Amazon SQS はトレースヘッダーを送信し、整合性のあるトレース ID を持つコンシューマーに、送信者から元のトレースを伝達し続けます。トレースの継続性により、ユーザーはダウンストリームサービス全体でトレース、分析、およびデバッグを実行できます。


            Amazon SQS キューを経由するLambda から Amazon SQS キューを経由するサービスマップ。

Amazon SQS では、次のトレースヘッダー計測がサポートされています。

  • デフォルトの HTTP ヘッダー— X-Ray SDK は、を使用して Amazon SQS を呼び出すと、トレースヘッダーを HTTP ヘッダーとして自動的に入力します。AWSSDK。デフォルトのトレースヘッダーは X-Amzn-Trace-Id によって転送され、SendMessage または SendMessageBatch リクエストに含まれるすべてのメッセージに対応します。デフォルトの HTTP ヘッダーの詳細については、「トレースヘッダー」を参照してください。

  • AWSTraceHeaderシステム属性AWSTraceHeaderはあるメッセージシステム属性Amazon SQS によって予約され、X-Ray トレースヘッダーをキューにメッセージとともに伝送します。AWSTraceHeaderは、新しい言語のトレース SDK を構築する場合など、X-Ray SDK による自動インストルメンテーションができない場合でも使用できます。両方のヘッダー計測が設定されている場合、メッセージシステム属性が HTTP トレースヘッダーを上書きします。

Amazon EC2 で実行する場合、Amazon SQS は一度に 1 つのメッセージの処理をサポートします。これは、オンプレミスホストで実行している場合や、次のようなコンテナサービスを使用している場合に適用されます。AWS Fargate、Amazon ECS、またはAWS App Mesh。

Amazon SQS メッセージサイズとメッセージ属性のクォータの両方から、トレースヘッダーが除外されます。X-Ray トレースを有効にしても、Amazon SQS のクォータを超えることはありません。詳細を確認するトピックAWSのクォータ、「」Amazon SQS のクォータ

注記

現在、SQS キューに渡されたトレースを、もう一方の端でそれを消費する Lambda に接続することはできません。これは、トレースヘッダーは SQS メッセージで伝播されますが、Lambda のセグメントは不変であるため、Lambda で設定できないためです。

HTTP トレースヘッダーの送信

Amazon SQS の送信者コンポーネントは、トレースヘッダーをSendMessageBatchまたはSendMessageを呼び出します。メトリックAWSSDK クライアントは計測されており、X-Ray SDK を通じてサポートされているすべての言語で自動的に追跡できます。トレースされているAWSこれらのサービス (たとえば、Amazon S3 バケットまたは Amazon SQS キュー) 内でアクセスするサービスおよびリソースは、X-Ray コンソールのサービスマップではダウンストリームノードとして表示されます。

トレースする方法についてはAWS任意の言語で SDK を呼び出します。サポートされている SDK の以下のトピックを参照してください。

トレースヘッダーを取得し、トレースコンテキストを復元する

Amazon SQS でコンテキストの伝達を続行するには、レシーバーコンポーネントへのハンドオフを手動で計測する必要があります。

トレースコンテキストを復元するには、主に 3 つのステップがあります。

  • のキューからメッセージを受信します。AWSTraceHeaderを呼び出して属性をReceiveMessageアピ。

  • 属性からトレースヘッダーを取得します。

  • ヘッダーからトレース ID を復元します。必要に応じて、セグメントにメトリクスを追加します。

以下は Java 用 X-Ray SDK で記述された実装の例です。

例 : トレースヘッダーを取得し、トレースコンテキストを復元する

// Receive the message from the queue, specifying the "AWSTraceHeader" ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest() .withQueueUrl(QUEUE_URL) .withAttributeNames("AWSTraceHeader"); List<Message> messages = sqs.receiveMessage(receiveMessageRequest).getMessages(); if (!messages.isEmpty()) { Message message = messages.get(0); // Retrieve the trace header from the AWSTraceHeader message system attribute String traceHeaderStr = message.getAttributes().get("AWSTraceHeader"); if (traceHeaderStr != null) { TraceHeader traceHeader = TraceHeader.fromString(traceHeaderStr); // Recover the trace context from the trace header Segment segment = AWSXRay.getCurrentSegment(); segment.setTraceId(traceHeader.getRootTraceId()); segment.setParentId(traceHeader.getParentId()); segment.setSampled(traceHeader.getSampled().equals(TraceHeader.SampleDecision.SAMPLED)); } }