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

我正在尝试使用 AWS Lambda 函数启动并运行一个玩具示例,该函数由一个 SQS 队列上的消息触发,发布到另一个队列,然后一个工作线程读取并处理整个“请求”的消息,其中整个“请求”都使用 X-Ray 进行跟踪。fsqssqs'f'sqs'

sqs -> f -> sqs' -> f'

目前,我已经准备好了队列,并且从队列中写入和接收函数。我还有X-Ray跟踪从第一个函数到sqs队列的请求。f

我目前的挑战是:如何将迹线传播到最终的工人,以便我可以在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;
    }
}

答案 1

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


答案 2

截至今天,AWS X-Ray 现在已对 Amazon SQS 提供本机支持:https://aws.amazon.com/about-aws/whats-new/2019/08/aws-x-ray-now-supports-amazon-sqs/


推荐