如何让AWS X-Ray为两个Serverless微服务展示单一服务地图
问题根因
X-Ray识别为两个独立服务地图的核心原因是:SQS属于异步消息组件,默认不会自动在收发两端透传X-Ray追踪上下文,Java Producer生成的Trace根标识没有随消息传递给Node.js Consumer,两端各自生成独立的Trace ID,X-Ray会判定为两条无关联的调用链路,因此拆分展示两个独立服务地图。
具体配置步骤
Producer侧(Java Lambda)改造
- 确认已引入Java版X-Ray SDK对应依赖:如果使用AWS SDK for Java 2.x,需引入
aws-xray-recorder-sdk-aws-sdk-v2,并为SQS客户端注册X-Ray拦截器。 - 在发送SQS消息的逻辑中,从当前X-Ray上下文中获取标准格式的追踪头字符串(格式为
Root=1-xxxx;Parent=xxxx;Sampled=1),将其作为消息属性传入SQS:属性名固定为AWSTraceHeader,属性类型设置为String,属性值为拿到的追踪头内容。
注意:X-Ray的AWS SDK拦截器仅会自动处理同步调用场景的追踪头透传,SQS异步消息场景必须手动添加该消息属性,无自动透传逻辑。
- 确认已引入Java版X-Ray SDK对应依赖:如果使用AWS SDK for Java 2.x,需引入
Consumer侧(Node.js Lambda)改造
- 确认已引入Node.js版X-Ray SDK,即
aws-xray-sdk包,且为业务中用到的AWS SDK客户端注册X-Ray捕获中间件。 - 在消费SQS消息的处理逻辑入口,先从单条消息的
messageAttributes字段中读取AWSTraceHeader属性值,将该追踪头传入X-Ray SDK作为当前调用的上游上下文,而非使用Lambda默认生成的全新Trace根。如果是批量消费场景,注意单条消息对应独立的追踪上下文,不要混用不同消息的Trace头。
- 确认已引入Node.js版X-Ray SDK,即
serverless.yml配置校验
- 确认两个Lambda函数的
tracing配置均设置为Active,不要仅开启Producer侧的追踪。 - 确认两个Lambda的执行角色均已附加
AWSXRayDaemonWriteAccess权限策略,保证追踪数据可以正常上报到X-Ray服务。 - 确认SQS队列没有配置消息属性过滤规则拦截
AWSTraceHeader字段,队列访问策略允许两个Lambda携带自定义消息属性收发消息。
- 确认两个Lambda函数的
验证方式
配置完成后发送测试消息,进入X-Ray控制台查看服务地图,即可看到完整的统一链路:Java Producer Lambda → SQS队列 → Node.js Consumer Lambda,全链路使用同一个Trace ID,点进链路详情可查看消息生产、队列停留、消息消费全流程的耗时和子段信息。
提示:所有基于异步消息组件(SQS/SNS/EventBridge等)的X-Ray链路打通,都需要手动透传AWSTraceHeader标准属性,和运行时语言、部署方式无关。
内容的提问来源于stack exchange,提问作者Hussain Ashruf
相关产品推荐
相关产品推荐

