Beats:使用Elastic Stack监控RabbitMQ

RabbitMQ 是一个开放源消息代理,创建于2007年以实现 AMQP,并且在过去的十二年中,通过不断增加的插件列表,它已包括HTTP,STOMP,SMTP 和其他协议。它也是 Kafka 的一个强劲的竞争者。在今天的文章中,我们将详述如何使用 Elastic Stack 来监控RabbitMQ。

 

RabbitMQ 简介

RabbitMQ 是消息队列软件,也称为消息代理或队列管理器。 简单地说; 它是定义队列的软件,应用程序连接到该队列以传输一条或多条消息。

message queue

一条消息可以包含任何种类的信息。 例如,它可能具有有关应在另一个应用程序(甚至可能在另一个服务器上)上启动的过程或任务的信息,或者可能只是一条简单的文本消息。 队列管理器软件存储消息,直到接收应用程序连接并从队列中取出消息为止。 接收应用程序然后处理该消息。

RabbitMQ workflow tutorial

消息队列的基本体系结构很简单-有一些称之为生产者(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