RabbitMQ 是一个开放源消息代理,创建于2007年以实现 AMQP,并且在过去的十二年中,通过不断增加的插件列表,它已包括 HTTP,STOMP,SMTP 和其他协议。它也是 Kafka 的一个强劲的竞争者。在今天的文章中,我们将详述如何使用 Elastic Stack 来监控 RabbitMQ。
RabbitMQ 简介
RabbitMQ 是消息队列软件,也称为消息代理或队列管理器。 简单地说; 它是定义队列的软件,应用程序连接到该队列以传输一条或多条消息。
一条消息可以包含任何种类的信息。 例如,它可能具有有关应在另一个应用程序(甚至可能在另一个服务器上)上启动的过程或任务的信息,或者可能只是一条简单的文本消息。 队列管理器软件存储消息,直到接收应用程序连接并从队列中取出消息为止。 接收应用程序然后处理该消息。
消息队列的基本体系结构很简单-有一些称之为生产者(producers)的客户端应用程序,它们可以创建消息并将其传递到代理(消息队列)。 其他应用程序(称为消费者,也即 consumers)连接到队列并订阅要处理的消息。 软件可以充当消息的生产者或消费者,或者既充当消息的消费者又充当生产者。 存储在队列中的消息将被存储,直到消费者检索到它们为止。
在下面我们来具体介绍如何使用Elastic Stack来把我们想要的 RabbitMQ 日志导入到 Elastic Stack 中,并对日志进行分析。
RabbitMQ 的哪些 log
重要的是要知道,从2017年11月29日发布的3.7.0版开始,RabbitMQ 会记录到一个日志文件中。 在此之前,有两个日志文件。 在本文中,我使用的是 RabbitMQ 版本3.8.2,因此一个日志文件的内容将发送到 Elasticsearch。 如果您使用的是 RabbitMQ 的早期版本,尤其是3.7.0之前的版本,请参考文档以获取有关两个不同日志文件的更多信息。
此外,对于当前版本的 RabbitMQ,您可以指定RabbitMQ将其日志文件保存在 rabbitmq.conf 中的位置,我将在安装过程中显示该文件。
配置
我们将 RabbitMQ 日志传送到Elastic Stack的方法是使用 Filebeat 和 logstash。如下是我的配置:
在上面我们把 Elastic Stack 的 Elasticsearch 和 Kibana 放到 MacOS 上,我们把其它的部分放到一个 Ubuntu OS 上。
安装
为了能够完成我们的设置,我们做如下的安装:
安装 Elasticseach
如果大家还没安装好自己的 Elastic Stack 的话,那么请按照我之前的教程“如何在Linux,MacOS及Windows上进行安装Elasticsearch” 安装好自己的 Elasticsearch。由于我们的 Elastic Stack 需要被另外一个 Ubuntu VM 来访问,我们需要对我们的 Elasticsearch 进行配置。首先使用一个编辑器打开在 config 目录下的 elasticsearch.yml 配置文件。我们需要修改 network.host 的 IP 地址。在你的 Mac 及 Linux 机器上,我们可以使用:
$ ifconfig
来查看到我们的机器的IP地址。针对我的情况,我的 MacOS 机器的IP地址是:192.168.43.220。
在上面我们把 network.host 设置为 "_site",表明它绑定到我们的本地电脑的 IP 地址。详细说明请参阅 Elasticsearch 的 network.host 说明。
我们也必须在 elasticsearch.yml 的最后加上 discovery.type: single-node,表明我们是单个 node。
等修改完我们的 IP 地址后,我们保存 elasticsearch.yml 文件。然后重新运行我们的 elasticsearch。我们可以在一个浏览器中输入刚才输入的 IP 地址并加上端口号 9200。这样可以查看一下我们的 elasticsearch 是否已经正常运行了。
安装 Kibana
我们可以按照 “如何在Linux,MacOS及Windows上安装Elastic栈中的Kibana” 中介绍的那样来安装我们的 Kibana。由于我们的 Elasticsearch 的 IP 地址已经改变,所以我们必须修改我们的 Kibana 的配置文件。我们使用自己喜欢的编辑器打开在 config 目录下的 kibana.yml 文件,并找到 server.host。把它的值修改为自己的电脑的 IP 地址。针对我的情况是:
同时找到 elasticsearch.hosts,并把自己的 IP 地址输入进去:
保存我们的 kibana.yml 文件,并运行我们的 Kibana。同时在浏览器的地址中输入自己的 IP 地址及 5601 端口:
如果配置成功的话,我们就可以看到上面的画面。
安装 RabbitMQ
我们可以参照文章 “How to install Latest RabbitMQ Server on Ubuntu 18.04 LTS” 来在 Ubuntu OS 上安装 RabbitMQ。这里就不累述了。安装后,RabbitMQ 服务将启动并启用以在启动时启动。 要检查状态,请运行:
sudo systemctl status rabbitmq-server.service
$ sudo systemctl status rabbitmq-server.service
● rabbitmq-server.service - RabbitMQ broker
Loaded: loaded (/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2020-02-27 16:02:00 CST; 1h 30min ago
Main PID: 844 (beam.smp)
Status: "Initialized"
Tasks: 127 (limit: 4915)
CGroup: /system.slice/rabbitmq-server.service
├─ 844 /usr/lib/erlang/erts-10.6.4/bin/beam.smp -W w -A 96 -MBas ageffcbf -MHas ageffcbf
├─1011 /usr/lib/erlang/erts-10.6.4/bin/epmd -daemon
├─1393 erl_child_setup 32768
├─1636 inet_gethost 4
└─1637 inet_gethost 4
2月 27 16:01:59 liuxg rabbitmq-server[844]: Doc guides: https://rabbitmq.com/documentation.html
2月 27 16:01:59 liuxg rabbitmq-server[844]: Support: https://rabbitmq.com/contact.html
2月 27 16:01:59 liuxg rabbitmq-server[844]: Tutorials: https://rabbitmq.com/getstarted.html
2月 27 16:01:59 liuxg rabbitmq-server[844]: Monitoring:
...
如果我们看到上面的输出就表明我们的 rabbitmq-server 已经成功安装。在默认的情况下,它会在目录 /var/log/rabbitmq 生成相应的 log 文件。为了能够配置日志级别和日志文件名,请确保在 /etc/rabbitmq/rabbitmq.conf 中设置以下值:
/etc/rabbitmq/rabbitmq.conf
log.dir = /var/log/rabbitmq
log.file = rabbit.log
log.file.level = info
经过这样的修改,我们的 log 的文件名将会变成为 rabbit.log,同时我们的日志级别也被设置为 info。因为我们已经修改了我们的配置文件,我们需要重新启动 rabbitmq-server 才能使得这个配置起作用。我们执行如下的命令:
sudo service rabbitmq-server restart
安装 RabbitMQ demo 应用
为了利用上述 RabbitMQ 设置,我将在 Spring Boot App 上使用 RabbitMQ 的 JMS 客户端演示。 可以使用 README 中的说明以及Spring CLI 或 Java JAR 文件来进行设置。为了能够使得你能够编译应用,你必须安装Java 8的环境。我们按照如下的步骤来进行:
git clone https://github.com/rabbitmq/rabbitmq-jms-client-spring-boot-trader-demo
等下载好上面的测试应用后,我们进入到该应用所在的根目录,并打入如下的命令:
sudo rabbitmq-plugins enable rabbitmq_jms_topic_exchange
mvn clean package
java -jar target/rabbit-jms-boot-demo-${VERSION}-SNAPSHOT.jar
请注意在上面的VERSION部分是根据你自己编译的结果来自己填写进去。如果我们的应用被成功编译,并成功运行,那么我可以看到类似如下的画面:
经过上面的配置后,我们在如下的地址可以看到我们想要的 rabbitmq 的日志:
$ pwd
/var/log/rabbitmq
liuxg@liuxg:/var/log/rabbitmq$ ls
log rabbit@liuxg.log rabbit@liuxg_upgrade.log rabbit.log
其中 rabbit.log 就是我们之前刚刚配置好的文件名。
接下来我们讲述如何使用 Filebeat 和 Logstash 把这些日志导入到 Elasticsearch 中。
安装 Logstash
我们按照 “如何安装Elastic栈中的Logstash” 来安装好自己的 Logstash。针对我们的 Linux 安装,我们可以做如下的安装:
curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-7.5.0.tar.gz
tar -xzvf logstash-7.5.0.tar.gz
cd cd logstash-7.5.0
我使用了基本的 grok 模式从原始消息中分离出时间戳,日志级别和消息,然后将输出发送到 Elasticsearch,并指定索引。 我可以创建一个属于 longstash 的配置文件:
logstash_rabbitmq.conf
input {
beats {
port => 5044
}
}
filter {
grok {
match => { "message" => ["%{TIMESTAMP_ISO8601:timestamp} \[%{LOGLEVEL:log_level}\] \<%{DATA:field_misc}\> %{GREEDYDATA:message}"] }
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => "192.168.43.220:9200"
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
}
在上面,我们的 input 来自于 beats 的 5044 口。你需要根据自己的 Elasticsearch 的地址把相应的 IP 地址修改。在上面为了调试的方便,我们也加入了 stdout 输出。每当有信息被处理时,它也会输出到 terminal 的屏幕上。
我们可以使用如下的方式来运行我们的 logstash:
$ pwd
/home/liuxg/logstash/logstash-7.5.0
liuxg@liuxg:~/logstash/logstash-7.5.0$ ./bin/logstash -f ~/rabbitmq/logstash_rabbitmq.conf
如果运行正常的话,我们可以在 terminal 中看到 logstash 已经被正常启动:
接下来,我们需要安装 Filebeat 来把我们的 rabbitmq 的 log 发送到 logstash 的5044口。
Filebeat安装
在我们的 Ubuntu 的 terminal 中,我们打入如下的命令来安装 Filebeat:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.5.0-amd64.deb
sudo dpkg -i filebeat-7.5.0-amd64.deb
我们修改 filebeat 位于 /etc/filebeat/filebeat.yml 的配置文件:
filebeat.yml
filebeat.inputs:
- type: log
fields:
log_type: rabbitmq-server
paths:
- /var/log/rabbitmq/*log
fields_under_root: true
encoding: utf-8
ignore_older: 3h
registry_file: /var/lib/filebeat/registry
output:
logstash:
hosts: ["localhost:5044"]
接下来我们来启动我们的 filebeat 服务:
sudo service filebeat start
这样我们的 filebeat 服务被启动起来了。我们可以通过如下的命令来检查一下 filebeat 服务是否被成功启动:
sudo systemctl filebeat status
sudo systemctl status filebeat
● filebeat.service - Filebeat sends log files to Logstash or directly to Elasticsearch.
Loaded: loaded (/lib/systemd/system/filebeat.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2020-02-27 19:59:03 CST; 34s ago
Docs: https://www.elastic.co/products/beats/filebeat
Main PID: 21028 (filebeat)
Tasks: 15 (limit: 4915)
CGroup: /system.slice/filebeat.service
└─21028 /usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml -path.home /usr
2月 27 19:59:04 liuxg filebeat[21028]: 2020-02-27T19:59:04.132+0800 INFO registrar/reg
2月 27 19:59:04 liuxg filebeat[21028]: 2020-02-27T19:59:04.132+0800 WARN beater/filebe
2月 27 19:59:04 liuxg filebeat[21028]: 2020-02-27T19:59:04.132+0800 INFO crawler/crawl
2月 27 19:59:04 liuxg filebeat[21028]: 2020-02-27T19:59:04.133+0800 INFO log/input.go:
2月 27 19:59:04 liuxg filebeat[21028]: 2020-02-27T19:59:04.133+0800 INFO input/input.g
2月 27 19:59:04 liuxg filebeat[21028]: 2020-02-27T19:59:04.133+0800 INFO crawler/crawl
2月 27 19:59:04 liuxg filebeat[21028]: 2020-02-27T19:59:04.134+0800 INFO log/harvester
2月 27 19:59:04 liuxg filebeat[21028]: 2020-02-27T19:59:04.153+0800 INFO pipeline/outp
2月 27 19:59:04 liuxg filebeat[21028]: 2020-02-27T19:59:04.158+0800 INFO pipeline/outp
2月 27 19:59:34 liuxg filebeat[21028]: 2020-02-27T19:59:34.133+0800 INFO [monitoring]
上面显示我们的 filebeat 已经被成功启动了。这个时候在我们的 logstash 的窗口中可以看到如下的一些输出:
它表明,我们我们的 longstash 已经在处理从 filebeat 发送来的信息。
安装 Metricbeat
在这节里,我们来介绍如何对 rabbitmq 进行指标监控。
首先打开我们的 Kibana:
选择 “Add metric data”:
接下来,我们选择 “RabbitMQ metrics”:
按照上面的指令我们来安装 metricbeat,并对 metricbeat 进行配置。在配置 /etc/metricbeat/metricbeat.yml 文件时,我们必须注意的是:
output.elasticsearch:
hosts: ["<es_url>"]
username: "elastic"
password: "<password>"
setup.kibana:
host: "<kibana_url>"
把我们的 elasticsearch 的 IP 地址填入。针对我的情况,这个地址是 192.168.43.220:
等我们安装好 metricbeat 后,我们点击 “Check data”:
一旦我们看到有数据进来,表明我们的 metricbeat 已经起作用了。
在 Kibana 中查看日志文档
在我们的Kibana中选择Discover:
从上面我们可以看出来我们已经有 rabbitmq 的日志了。
我们也可以选择 metricbeat index pattern,那么我们可以看到:
从上面我们可以看到有 rabbitmq 的指标信息。
参考
【1】https://computingforgeeks.com/how-to-install-latest-rabbitmq-server-on-ubuntu-18-04-lts/
【2】https://www.cloudamqp.com/blog/2015-05-18-part1-rabbitmq-for-beginners-what-is-rabbitmq.html