我正在尝试使用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;
}
}
4条答案
按热度按时间ncgqoxb01#
即使SQS现在支持X-Ray跟踪,它也不会将跟踪传播到lambda函数。这就是为什么使用SQS->Lambda设置,Lambda总是开始一个新的跟踪。在nodejs xray SDK https://github.com/aws/aws-xray-sdk-node/issues/208中有一个问题
xfyts7mz2#
从今天起,AWS X-Ray现在可以原生支持Amazon SQS:https://aws.amazon.com/about-aws/whats-new/2019/08/aws-x-ray-now-supports-amazon-sqs/
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的例子。
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/
现在似乎支持传播。