多个Lambda函数如何配置使用同一个X-Ray Tracing-ID

同tracing-id透传配置方案
前提
你已经在入口Lambda将tracing-id写入RabbitMQ消息的messageAttributes头中,消费侧Lambda可直接从触发事件中提取该字段。
步骤1:开启Lambda链路追踪能力(AWS X-Ray场景)
如果你的链路追踪基于AWS X-Ray实现,需要先做如下基础配置:
- 进入监听RabbitMQ的Lambda控制台,在「配置」-「监控和运维工具」中开启主动追踪
- 给Lambda的执行角色添加
xray:PutTraceSegments、xray:PutTelemetryRecords权限,保证追踪数据可以正常上报
如果使用自研或第三方链路追踪系统,可直接跳过该步骤。
步骤2:从RabbitMQ触发事件中提取tracing-id
Lambda的RabbitMQ触发器会把消息头放在事件的messageAttributes字段中,不同运行时提取示例如下:
Python 示例
def lambda_handler(event, context): # 遍历队列消息 for queue_name, messages in event['rmqMessagesByQueue'].items(): for msg in messages: # 替换为你实际定义的tracing-id头字段名 tracing_id = msg['messageAttributes'].get('tracing-id', {}).get('stringValue') # 后续业务逻辑统一携带该tracing-id
Node.js 示例
exports.handler = async (event) => { for (const queueName of Object.keys(event.rmqMessagesByQueue)) { const messages = event.rmqMessagesByQueue[queueName]; for (const msg of messages) { const tracingId = msg.messageAttributes?.['tracing-id']?.stringValue; // 绑定到当前链路上下文 } } };
步骤3:绑定到当前链路上下文
- X-Ray场景:将提取到的trace id设置为当前Lambda追踪段的父ID,即可将当前Lambda的调用数据挂载到原有整条链路中,实现全链路id统一
- 其他链路系统:将提取到的tracing-id写入当前服务的全局链路上下文,后续所有日志输出、下游接口调用、数据库操作都自动携带该ID即可
注意事项
- 若你发送消息时自定义了tracing-id的头字段名,提取时要替换为对应的实际字段名
- 不要把tracing-id只写在消息体内,放在消息属性头中可以避免消费侧解析消息体就能拿到ID,减少耦合
内容的提问来源于stack exchange,提问作者AmmAr
相关产品推荐
相关产品推荐

