Amazon SQS 和 AWS X-Ray - AWS X-Ray
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon SQS 和 AWS X-Ray

AWS X-Ray 与集成 Amazon Simple Queue Service (人Amazon SQS)以跟踪通过 Amazon SQS 队列。如果服务通过使用 X-Ray SDK, Amazon SQS 可以发送跟踪标头,并继续将原始跟踪从发送者传播到具有一致跟踪ID的消费者。跟踪连续性使用户能够跟踪、分析和调试整个下游服务。


            服务映射来自 Lambda 通过 Amazon SQS 队列。

Amazon SQS 支持以下跟踪标题仪表:

  • 默认HTTP标题 – 的 X-Ray SDK 当您呼叫时,将跟踪标头自动作为HTTP标头填充 Amazon SQS 通过 AWS SDK。默认跟踪表头由 X-Amzn-Trace-Id 并对应于 SendMessageSendMessageBatch 请求。要了解有关默认HTTP标题的更多信息,请参阅 跟踪标题.

  • AWSTraceHeader 系统属性 – 的 AWSTraceHeader消息系统属性 保留者 Amazon SQS 携带 X-Ray 使用队列中的消息跟踪标题。AWSTraceHeader 即使在通过 X-Ray SDK 例如,在为新语言构建跟踪SDK时,不会。设置两个标题仪器后,消息系统属性将覆盖HTTP跟踪标题。

在上运行时 Amazon EC2, Amazon SQS 支持一次处理一条消息。这适用于在本地主机上运行时,以及当使用 AWS Fargate、Amazon ECS 或 AWS App Mesh 等容器服务时。

跟踪标题从两者中排除 Amazon SQS 消息大小和消息属性配额。使能 X-Ray 追踪不会超出您的 Amazon SQS 配额。要了解有关 AWS 配额的更多信息,请参阅 Amazon SQS 配额

注意

目前无法将传入SQS队列的跟踪连接到在另一端使用它的Lambda。这是因为,尽管跟踪标题在SQS消息中传播,但您无法在Lambda中设置它,因为Lambda中的段是不可更改的。

发送HTTP跟踪头

Amazon SQS 中的发送者组件可以通过 SendMessageBatchSendMessage 调用自动发送跟踪标头。何时 AWS SDK客户端配有仪表,可通过支持的所有语言自动跟踪 X-Ray SDK. 所跟踪 AWS 服务以及您在这些服务中访问的资源(例如,Amazon S3 存储桶或 Amazon SQS 队列),在 X-Ray 控制台的服务地图上显示为下游节点。

要了解如何使用首选语言跟踪AWSSDK呼叫,请参阅支持的 SDKs:

检索跟踪标头并恢复跟踪上下文

要继续使用 Amazon SQS 进行上下文传播,必须手动分析向接收方组件的交接。

恢复跟踪上下文有三个主要步骤:

  • 从队列接收 AWSTraceHeader 属性 ReceiveMessage API。

  • 从实体检索跟踪标题。

  • 从标题恢复跟踪ID。(可选)将更多度量标准添加到段。

下面是使用 X-Ray SDK for Java编写的示例实施。

例 :检索跟踪标头并恢复跟踪上下文

// 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)); } }