【问题标题】:AWS Xray with Java SQS JMS connector带有 Java SQS JMS 连接器的 AWS Xray
【发布时间】:2017-08-22 20:32:47
【问题描述】:

我们最近开始将 AWS Xray 添加到我们的 Spring 项目中,并成功利用 AWSXRayServletFilter 创建 Segments 来满足我们的客户请求。

现在我们还开始添加 AWS SDK Instrumentor 来跟踪我们对 AWS 服务的使用情况。其中之一是 SQS,我们使用amazon-sqs-java-messaging-lib 来利用 JMS 接收 SQS 消息。这就是我们面临一些麻烦的地方。

每次我们的应用程序尝试获取消息时,TracingHandler 都会尝试创建 SubSegment,但由于尚未创建 Segment 而失败。我们如何将这些请求包装在Segment 中?该信息不会包含在消息本身中以将来自将消息推送到队列的资源中的段链接在一起吗?

如果缺少或至少从父跟踪 id 中提取,我本来希望有上下文缺失策略可用于创建一个段,但我没有看到他们最新的 docs 中包含的信息。

【问题讨论】:

    标签: java amazon-sqs aws-xray


    【解决方案1】:

    这是一个已知问题,已在官方论坛上讨论过。这里有几个链接: https://forums.aws.amazon.com/thread.jspa?threadID=252012&tstart=0 https://forums.aws.amazon.com/thread.jspa?threadID=257258&tstart=25

    每次我们的应用程序尝试获取消息时,TracingHandler 都会尝试创建一个 SubSegment 并失败,因为尚未创建任何 Segment。我们如何将这些请求包装在一个 Segment 中?该信息不会包含在消息本身中以将来自将消息推送到队列的资源中的段链接在一起吗?

    段信息保存在 ThreadLocal 中。如果您在单独的线程中运行某些东西,则必须手动创建一个段,因此在创建子段时您将拥有所需的 ThreadLocal 数据。 SQS 消息,甚至与 X-Ray 服务相关的 SQS 服务本身也没有什么特别之处。只有使用 SQS 客户端,X-Ray 才会通过使用处理程序跟踪 ThreadLocal 数据来推断对 SQS 的调用。

    如果缺少或至少从父跟踪 id 中提取,我本来希望有上下文缺失策略可用于创建一个段,但我没有看到他们最新文档中包含的信息。

    这是我的功能要求之一。查看线程以及官方答案以及我在尝试自己实施这种上下文缺失策略时发现的当前限制。 https://forums.aws.amazon.com/thread.jspa?threadID=252012&tstart=0

    【讨论】:

    • 关于 SQS,我认为可能会支持 SQS 消息中的一个属性,该属性“可能”包含用于将消息排队的任何服务的段的父 ID。如果 SQS 客户端在一定程度上不了解 XRay,您如何将流从 SQS 的源连接到接收器?我希望在 X-Ray 服务地图中连接这些请求。感谢您的链接和指导!请欣赏细节。
    • SQS 客户端知道 X-Ray,这就是它创建那些“人工”推断段的方式。至于从 SQS 的源连接到接收器 - 不确定它是否有意义,因为这是一个异步部分,不会阻塞放置源 SQS 消息的初始事物。
    • @dvisco 请记住,X-Ray 本质上是关于分解每个请求的性能部分。假设您有一个向 SQS 发送消息的 Web 请求。 put 操作会阻塞处理一段时间,这在请求的子段中很重要。但随后会读取 SQS 消息,这是一个单独的进程,不会对初始请求的执行时间造成任何负担。
    • 再次感谢,我同意我应该考虑一下,我正在寻找分析我的应用程序的异步部分。
    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2018-10-17
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多