java 如何使用AWS X-Ray通过SQS队列跟踪请求

tquggr8v  于 2023-06-20  发布在  Java
关注(0)|答案(4)|浏览(91)

我正在尝试使用AWS Lambda函数f启动并运行一个玩具示例,该函数由一个SQS队列sqs上的消息触发,发布到另一个队列sqs',然后工作线程f'sqs'读取并处理消息,其中整个“请求”使用X-Ray跟踪。
sqs -> f -> sqs' -> f'
目前,我已经准备好了队列以及从队列写入和接收的函数。我还使用X-Ray跟踪从第一个函数f到sqs队列的请求。

**我目前的挑战是:**我如何将跟踪传播到最终的工人,以便我可以在X射线中看到整个过程。

以下是我目前的功能:

public class Hello implements RequestHandler<SQSEvent, Void> {
    String OUTPUT_QUEUE_URL = "...";

    private AmazonSQS sqs = AmazonSQSClientBuilder.standard()
        .withRequestHandlers(new TracingHandler(AWSXRay.getGlobalRecorder()))
        .build();

    public Void handleRequest(SQSEvent event, Context context)
    {
        for(SQSMessage msg : event.getRecords()){
            System.out.println(new String(msg.getBody()));
        }

        SendMessageRequest send_msg_request = new SendMessageRequest()
            .withQueueUrl(OUTPUT_QUEUE_URL)
            .withMessageBody("hello world")
            .withDelaySeconds(5);
        sqs.sendMessage(send_msg_request);
        return null;
    }
}
public class World implements RequestHandler<SQSEvent, Void>{
    public Void handleRequest(SQSEvent event, Context context)
    {
        for(SQSMessage msg : event.getRecords()){
            System.out.println(new String(msg.getBody()));
        }
        return null;
    }
}
ncgqoxb0

ncgqoxb01#

即使SQS现在支持X-Ray跟踪,它也不会将跟踪传播到lambda函数。这就是为什么使用SQS->Lambda设置,Lambda总是开始一个新的跟踪。在nodejs xray SDK https://github.com/aws/aws-xray-sdk-node/issues/208中有一个问题

ig9co6j1

ig9co6j13#

虽然Matthew Werber正确地说,目前还没有官方支持,但您可以通过在Lambda函数内创建一个新的AWS-Xray段并使用来自SQS消息的传入TraceID来解决这个问题。这将为您的lambda调用生成两个Segment。一个是Lambda自己创建的,另一个是您创建来扩展现有跟踪的。对于您的用例来说,这是否可以接受,这是您必须自己决定的事情!
如果你正在使用Python,你可以用aws-xray-lambda-segment-shim来实现。
如果你正在使用NodeJS,你可以遵循this guide on dev.to
如果你正在使用.NET,这里有一些关于GitHub issue的例子。

7vhp5slm

7vhp5slm4#

我计划构建相同的原型,我注意到以下公告(日期2022-11-21):https://aws.amazon.com/about-aws/whats-new/2022/11/aws-x-ray-trace-linking-event-driven-applications-amazon-sqs-lambda/
现在似乎支持传播。

相关问题