如何通过Pod控制台跟踪Kubernetes环境中RabbitMQ队列的入站消息
RabbitMQ 队列消息投递追踪方案
以下方案均可直接在RabbitMQ Pod内部控制台执行,无需访问Web管理界面:
方案1:临时轮询监控消息数变化
无需修改RabbitMQ配置,适合临时排查场景,可实时检测队列新增消息:
- 替换脚本内的目标队列名、vhost(非默认vhost需要配置)后直接执行:
# 配置项 TARGET_QUEUE="你的目标队列名称" VHOST="/" # 非默认vhost请修改为实际名称 CHECK_INTERVAL=1 # 采样间隔,单位秒 # 初始化初始消息数 LAST_COUNT=$(rabbitmqctl -p ${VHOST} list_queues name messages | grep "^${TARGET_QUEUE}\s" | awk '{print $2}') echo "$(date '+%Y-%m-%d %H:%M:%S') 开始监控队列 ${TARGET_QUEUE},当前消息数:${LAST_COUNT}" while true; do CURRENT_COUNT=$(rabbitmqctl -p ${VHOST} list_queues name messages | grep "^${TARGET_QUEUE}\s" | awk '{print $2}') # 检测到新增消息 if [ ${CURRENT_COUNT} -gt ${LAST_COUNT} ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') 新消息投递成功:新增 $((CURRENT_COUNT - LAST_COUNT)) 条,当前总消息数 ${CURRENT_COUNT}" fi # 检测到消息被消费 if [ ${CURRENT_COUNT} -lt ${LAST_COUNT} ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') 消息被消费:减少 $((LAST_COUNT - CURRENT_COUNT)) 条,当前总消息数 ${CURRENT_COUNT}" fi LAST_COUNT=${CURRENT_COUNT} sleep ${CHECK_INTERVAL} done
- 如需查看更细分的状态,可将命令中的
messages替换为以下指标:messages_ready:待消费的消息数messages_unacknowledged:已投递未确认的消息数
方案2:开启Firehose追踪全量消息详情
如果需要确认每一条消息的路由规则、内容是否正确,可开启RabbitMQ内置的消息追踪功能:
- 开启Firehose(vhost级别,非默认vhost请加-p参数):
rabbitmqctl trace_on
- 绑定临时队列接收所有消息投递事件:
# 创建临时追踪队列 rabbitmqctl declare queue name=trace_tmp durable=false # 绑定到内置trace交换机,匹配所有消息发布事件 rabbitmqctl bind queue source=amq.rabbitmq.trace destination=trace_tmp routing_key="publish.#"
- 消费trace_tmp队列的消息,即可查看每一条投递消息的完整属性,包括路由键、目标队列、消息内容、投递时间等,确认是否符合预期。
排查完成后务必关闭Firehose避免额外性能损耗:
rabbitmqctl trace_off
方案3:通过累计统计值确认投递结果
如果Pod内安装了rabbitmqadmin工具(官方镜像默认自带),可以直接查询队列创建以来的累计消息流入量,只要该数值增长即可确认消息投递成功:
# 替换队列名和vhost rabbitmqadmin -V 你的vhost名称 list queues name message_stats.publish_details.count | grep "你的目标队列名称"
返回结果中第二个数值就是队列累计收到的消息总数。
内容的提问来源于stack exchange,提问作者Adil Abu Amir Rakhimbekov
相关产品推荐
相关产品推荐

