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 标头 – 当您通过 AWS 开发工具包调用 Amazon SQS 时,X-Ray SDK 会自动将跟踪标头填充为 HTTP 标头。默认跟踪标头由 X-Amzn-Trace-Id 携带,并且对应于 SendMessageSendMessageBatch 请求中包含的所有消息。要了解有关默认 HTTP 标头的更多信息,请参阅 跟踪标头

  • AWSTraceHeader 系统属性AWSTraceHeader 是 Amazon SQS 保留的消息系统属性,用于在队列中随消息携带 X-Ray 跟踪标头。即使通过 X-Ray SDK 进行的自动分析不可用(例如在为新语言构建跟踪开发工具包时),也可以使用 AWSTraceHeader。当设置了两个标头分析时,消息系统属性将覆盖 HTTP 跟踪标头。

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

Amazon SQS 消息大小和消息属性配额中都排除了跟踪标头。启用 X-Ray 跟踪并不会超过您的 Amazon SQS 配额。要了解有关 AWS 配额的更多信息,请参阅 Amazon SQS 配额

发送 HTTP 跟踪标头

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

要了解如何使用首选语言跟踪 AWS 开发工具包调用,请参阅支持的开发工具包中的以下主题:

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

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

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

  • 通过调用 ReceiveMessage API 从队列中接收 AWSTraceHeader 属性的消息。

  • 从属性检索跟踪标头。

  • 从标头恢复追踪 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)); } }