You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让AWS X-Ray为两个Serverless微服务展示单一服务地图

问题根因

X-Ray识别为两个独立服务地图的核心原因是:SQS属于异步消息组件,默认不会自动在收发两端透传X-Ray追踪上下文,Java Producer生成的Trace根标识没有随消息传递给Node.js Consumer,两端各自生成独立的Trace ID,X-Ray会判定为两条无关联的调用链路,因此拆分展示两个独立服务地图。

具体配置步骤
  • Producer侧(Java Lambda)改造

    1. 确认已引入Java版X-Ray SDK对应依赖:如果使用AWS SDK for Java 2.x,需引入aws-xray-recorder-sdk-aws-sdk-v2,并为SQS客户端注册X-Ray拦截器。
    2. 在发送SQS消息的逻辑中,从当前X-Ray上下文中获取标准格式的追踪头字符串(格式为Root=1-xxxx;Parent=xxxx;Sampled=1),将其作为消息属性传入SQS:属性名固定为AWSTraceHeader,属性类型设置为String,属性值为拿到的追踪头内容。

    注意:X-Ray的AWS SDK拦截器仅会自动处理同步调用场景的追踪头透传,SQS异步消息场景必须手动添加该消息属性,无自动透传逻辑。

  • Consumer侧(Node.js Lambda)改造

    1. 确认已引入Node.js版X-Ray SDK,即aws-xray-sdk包,且为业务中用到的AWS SDK客户端注册X-Ray捕获中间件。
    2. 在消费SQS消息的处理逻辑入口,先从单条消息的messageAttributes字段中读取AWSTraceHeader属性值,将该追踪头传入X-Ray SDK作为当前调用的上游上下文,而非使用Lambda默认生成的全新Trace根。如果是批量消费场景,注意单条消息对应独立的追踪上下文,不要混用不同消息的Trace头。
  • serverless.yml配置校验

    1. 确认两个Lambda函数的tracing配置均设置为Active,不要仅开启Producer侧的追踪。
    2. 确认两个Lambda的执行角色均已附加AWSXRayDaemonWriteAccess权限策略,保证追踪数据可以正常上报到X-Ray服务。
    3. 确认SQS队列没有配置消息属性过滤规则拦截AWSTraceHeader字段,队列访问策略允许两个Lambda携带自定义消息属性收发消息。
验证方式

配置完成后发送测试消息,进入X-Ray控制台查看服务地图,即可看到完整的统一链路:Java Producer Lambda → SQS队列 → Node.js Consumer Lambda,全链路使用同一个Trace ID,点进链路详情可查看消息生产、队列停留、消息消费全流程的耗时和子段信息。

提示:所有基于异步消息组件(SQS/SNS/EventBridge等)的X-Ray链路打通,都需要手动透传AWSTraceHeader标准属性,和运行时语言、部署方式无关。

内容的提问来源于stack exchange,提问作者Hussain Ashruf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:39:32