带有Java SQS JMS连接器的AWS Xray

时间:2017-08-22 20:32:47

标签: java amazon-sqs aws-xray

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

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

每当我们的应用程序尝试获取消息时,TracingHandler都会尝试创建SubSegment并失败,因为已经创建了Segment。我们如何在Segment中包装这些请求?消息本身是否不会将这些信息包含在将消息推送到队列的资源中的段中?

如果缺少一个Segment,或者至少从父跟踪ID中获取,我原本期望可以使用Context Missing策略来创建Segment,但我没有看到他们最新的docs中包含的信息。 / p>

1 个答案:

答案 0 :(得分:3)

这是一个已在官方论坛上讨论过的已知问题。这里有几个链接: 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消息中没有什么特别的,甚至SQS服务本身也与X射线服务有关。它只使用SQS客户端使X-Ray推断通过使用处理程序跟踪ThreadLocal数据来调用SQS。

  

如果缺少一个Segment,或者至少从父跟踪ID中获取但我没有看到其最新文档中包含的信息,我原本期望可以使用Context Missing策略来创建Segment。

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