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

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

Amazon SQS 和Amazon X-Ray

Amazon X-Ray与 Amazon Simple Queue Service (Amazon SQS) 集成,以跟踪通过 Amazon SQS 队列传递的消息。如果服务使用 X-Ray 开发工具包跟踪请求,Amazon SQS 可以发送跟踪标头并继续使用一致的跟踪 ID 传播原始跟踪。跟踪连续性使用户能够跟踪、分析和调试整个下游服务。


            服务地图从 Lambda 通过 Amazon SQS 队列。

Amazon SQS 支持以下跟踪标头工具插入:

  • 默认 HTTP 标头— X-Ray 软件开发工具包将自动填充跟踪标头作为 HTTP 标头通过Amazon开发工具包。默认跟踪标头由X-Amzn-Trace-Id,并对应于包含在SendMessage或者SendMessageBatch请求. 要了解有关默认 HTTP 标头的更多信息,请参阅跟踪标头

  • AWSTraceHeader系统属性AWSTraceHeader是一个消息系统属性由 Amazon SQS 保留,以便在队列中携带消息的 X-Ray 跟踪标头。AWSTraceHeader即使未通过 X-Ray SDK 进行自动检测,例如在为新语言构建跟踪 SDK 时,也可以使用。设置两个标头指令时,消息系统属性将覆盖 HTTP 跟踪标头。

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

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

注意

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

发送 HTTP 跟踪标头

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

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

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

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

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

  • 从队列接收消息AWSTraceHeader属性,方法是调用ReceiveMessageAPI。

  • 从属性中检索跟踪标头。

  • 从标头中恢复跟踪 ID。(可选)向区段添加更多量度。

下面是使用适用于 Java 的 X-Ray 开发工具包编写的示例实施。

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

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