目的:
追踪mq的消息的来源和去向,并且查看消息的具体内容
方法:
rabbitmq官方提供了一个rabbitmq_tracing插件可以完成目标
部署:
一、开启rabbitmq的tracing插件
#rabbitmq-plugins enable rabbitmq_tracing
开启tracing插件mq的web页面可以看到admin标签页多了一个选项
二、配置追踪
如下图指定vhost添加一个追踪(文件可以删除会自动产生)
三、排错
在部署插件的时候遇到许多坑在这里记录下
1、开启插件后配置追踪时失败如下图
此时日志报错
2019-06-12 11:03:07.108 [error] <0.18516.14> Supervisor {<0.18516.14>,rabbit_tracing_consumer_sup} had child consumer started with rabbit_tracing_consumer:start_link([{vhost,<<"/">>},{name,<<“test”>>},{format,<<“text”>>},{pattern,<<"#">>},{<<“format”>>,<<“text”>>},…]) at undefined exit with reason no match of right hand value {error,{auth_failure,“Refused”}} in rabbit_tracing_consumer:init/1 line 58 in context start_error
2019-06-12 11:03:07.108 [error] <0.18517.14> CRASH REPORT Process <0.18517.14> with 0 neighbours crashed with reason: no match of right hand value {error,{auth_failure,“Refused”}} in rabbit_tracing_consumer:init/1 line 58
2019-06-12 11:03:20.017 [info] <0.950.0> Disabling tracing for vhost ‘/’
这是因为 rabbitmq_tracing插件默认使用的是guest用户,一般在正式生产环境使用时都会删除此用户,所以开启插件时会报错。
解决:
(1)、RabbitMq 3.6.0之前,唯一可以远程通过虚拟主机创建跟踪文件的用户是guest所以3.6.0之前的用户只能手动重新建立起guest(密码也要是guest)用户解决;
(2)、3.6.0之后的版本可通过修改配置文件修改默认用户(当然也可以重建guest用户)
之前在网络上搜索了一堆资料建议将配置加在rabbitmq.conf中,但我多次尝试均失败(使用3.6的朋友可以尝试)。最后查看了mq的官方文档发现,3.7之后文档格式发生了变化虽然也支持erlang的格式,但是新格式sysctl更清晰更易于生成部署自动化工具(官方文档传送门:https://www.rabbitmq.com/configure.html )而且还有了一个补充配置文件advanced.config(某些配置设置不可用或难以使用sysctl格式进行配置可以使用Erlang术语格式的其他配置文件)它将与rabbitmq.conf中提供的配置合并生效。所以应该将配置更改写在advanced.config中
我的advanced.config文件
[root@centos7-002 rabbitmq]# cat advanced.config
[
{rabbitmq_tracing, [
{username, “mq”},
{password, “123456”}]},
{directory, “/data/log/mq”}
].
(如果没有advanced.config直接在rabbitmq.conf同目中创建即可)
修改好配置后重启mq生效,此时追踪可以正常运行
注:3.7版本的追踪插件已可在页面修改用户不要要以上操作
2、对于集群启用rabbitmq_tracing
如果是多台搭建的镜像集群,要追踪所有消息则要所有集群节点都开启插件
假如只开启单台只会纪录连接到这一台的消息收发,连接到其他节点的消息收发不会纪录
例
A机开启追踪B机未开启
A | B | |
---|---|---|
发送到A | 消息有记录 | 消息无纪录 |
发送到B | 消息无记录 | 消息无记录 |
从A消费 | 消息有记录 | 消息无记录 |
从B消费 | 消息无记录 | 消息无记录 |
A和B都开启追踪
A | B | |
---|---|---|
发送到A | 消息有记录 | 消息有纪录 |
发送到B | 消息有记录 | 消息有记录 |
从A消费 | 消息有记录 | 消息有记录 |
从B消费 | 消息有记录 | 消息有记录 |
3、理解pattern的格式
官网介绍:
The firehose publishes messages to the topic exchange amq.rabbitmq.trace with
routing key either “publish.exchangename”, for messages entering the broker, or “deliver.queuename”, for messages leaving the broker;
大概就是抓publish匹配exchange名字,抓消费匹配队列名字。具体如下
#匹配所有的消息,无论是发布还是消费的信息
publish.# 匹配所有发布的消息。
deliver.# 匹配所有被消费的消息。
#.test 如果test是队列,则匹配已经被消费了的test队列的消息。如果test是exchange,则匹配所有经过该exchange的消息。