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

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

Amazon SQS 和Amazon X-Ray

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

Amazon X-Ray支持使用 Amazon SQS 和跟踪事件驱动的应用程序Amazon Lambda。使用 CloudWatch 控制台查看每个请求与 Amazon SQS 排队并由下游 Lambda 函数处理时的连接视图。来自上游消息生成者的跟踪会自动链接到来自下游 Lambda 使用者节点的跟踪,从而创建应用程序 end-to-end 视图。有关更多信息,请参阅跟踪事件驱动的应用程序


            通过 Amazon SQS 队列从 Lambda 发送的服务映射。

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

  • 默认 HTTP 标头 — 当您通过 SDK 调用 Amazon SQS 时,X-Ray SAmazon DK 会自动将跟踪标头作为 HTTP 标头填充。默认跟踪标头由SendMessageSendMessageBatch请求中包含的所有消息传送X-Amzn-Trace-Id并对应。要了解有关默认 HTTP 标头的更多信息,请参阅追踪标头

  • AWSTraceHeader系统属性AWSTraceHeader 这是 Amazon SQS 保留的消息系统属性,用于承载 X-Ray 跟踪标头以及队列中的消息。 AWSTraceHeader即使无法通过 X-Ray SDK 进行自动检测,例如在为新语言构建跟踪 SDK 时,也可以使用。如果同时设置了两个标头工具,则消息系统属性会覆盖 HTTP 跟踪标头。

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

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

发送 HTTP 跟踪标头

Amazon SQS 中的发件人组件可以通过SendMessageBatchSendMessage调用自动发送跟踪标头。对Amazon SDK 客户端进行检测后,可以通过 X-Ray SDK 支持的所有语言自动对其进行跟踪。您在这些Amazon服务中访问的跟踪服务和资源(例如,Amazon S3 存储桶或 Amazon SQS 队列)在 X-Ray 控制台的服务映射上显示为下游节点。

要了解如何使用您的首选语言跟踪Amazon SDK 调用,请参阅支持的 SDK 中的以下主题:

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

如果您使用的是 Lambda 下游使用者,则跟踪上下文传播是自动的。要继续与其他 Amazon SQS 使用者进行上下文传播,您必须手动设置向接收器组件的移交。

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

  • 通过调用 ReceiveMessageAPI 从队列接收该AWSTraceHeader属性的消息。

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

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