1、rabbitmq概述

       rabbitmq是一个消息中间件,当大量消息生产时,但是消费者无法进行消费,可能会导致消息堆积,面对这种情况应当如何去预防呢?可以通过zabbix监控来rabbitmq消息队列是否出现堆积。

       网上看到很多获取rabbitmq消息队列名称和消息数量的方式,都需要通过用户名和密码登陆后获取,这种方式有暴露密码的风险,也是着实不是很安全。本文中使用的是rabbitmq的命令来实现的。

# rabbitmqctl  list_queues

通过以上目录可以获取消息队列名称和消息堆积的数据。

2、rabbitmq监控配置

       由于zabbix通过rabbitmqctl权限方面并且还要获取rabbitmq的用户名和密码,所以采用crontab每分钟获取一次rabbitmq获取消息队列名称和消息堆积的数据。具体实现如下,通过一个脚本实现

# vim /usr/local/zabbix/queues_list.sh
#!/bin/bash
rabbitmqctl list_queues |grep -v 'Listing queues ...' | grep -v Timeout: > /tmp/.queues.txt

在crontab -e 添加任务,特别注意:rabbitmq不是绝对路径,所以crontab环境变量一般为/bin,特别注意rabbitmqctl相关命令做个软连接至/bin目录下:

# ln -s /sbin/rabbitmqctl  /bin/rabbitmqctl
# ln -s /usr/lib/rabbitmq/bin/rabbitmq-env /bin/rabbitmq-env
# ln -s /usr/lib/erlang/bin/erl /bin/erl

以上几个路径以实际为准,也可以通过locate查询以上命令或者which也行

# chmod 755 /usr/local/zabbix/queues_list.sh
# crontab -e

# RMQ消息告警监控
*/1 * * * * /bin/bash /usr/local/zabbix/queues_list.sh

     由于消息队列 名称是动态的,所以采用zabbix的自动发现功能,那么为了实现功能。

# vim  /usr/local/zabbix/rabbitmq-queues.sh   
#!/bin/bash
####################################
#实现zabbix自动发现功能
####################################
proc_array=(`cat /tmp/.queues.txt | awk '{print $1}'`)
length=${#proc_array[@]}

printf "{\n"
printf '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
printf "\n\t\t{"
printf "\"{#QUEUES_NAME}\":\"${proc_array[$i]}\"}"
if [ $i -lt $[$length-1] ];then
printf ","
fi
done
printf "\n\t]\n"
printf "}\n"

执行结果如下图,获取到的值是一个json格式数据,也是消息队列名称:

【ZABBIX】zabbix监控rabbitmq消息队列堆积_rabbitmq

# vim /usr/local/zabbix/queues_check.sh 
#!/bin/bash
###############################
#zabbix获取key
###############################
queues=$1

function rmq_queues {
queues_key=`cat /tmp/.queues.txt | grep "\b${queues}\b" | awk '{print $2}'`
echo "$queues_key"
}

rmq_queues

3、zabbix_agentd配置

      zabbix_agented配置文件配置如下图:特别注意/etc/zabbix/zabbix_agentd.conf文件中的Timeout参数记得修改为1-30任意数字

# chown zabbix. -R /usr/local/zabbix/
# chmod -R 755 /usr/local/zabbix/
# vim /etc/zabbix/zabbix_agentd.d/Items.conf
#监控RMQ消息积压
UserParameter=rabbitmq.queues,/bin/bash /usr/local/zabbix/rabbitmq-queues.sh
UserParameter=queues.check[*],/bin/bash /usr/local/zabbix/queues_check.sh $1

4、zabbix_server配置

       以下均是图形配置

      (1)、‘配置’---》‘模块’----》‘创建模板’,如下图:

        【ZABBIX】zabbix监控rabbitmq消息队列堆积_自动发现_02

        (2)、‘模板’对话框如下图:

          模板名:RabbitMQ-Queues

          群组:jzkj

  【ZABBIX】zabbix监控rabbitmq消息队列堆积_rabbitmq_03

         (3)、创建应用集,如下图:

    【ZABBIX】zabbix监控rabbitmq消息队列堆积_zabbix_04

【ZABBIX】zabbix监控rabbitmq消息队列堆积_自动发现_05

【ZABBIX】zabbix监控rabbitmq消息队列堆积_rabbitmq_06

      (4)、设置‘自动发现规则’,如下图:

【ZABBIX】zabbix监控rabbitmq消息队列堆积_监控_07

【ZABBIX】zabbix监控rabbitmq消息队列堆积_自动发现_08

【ZABBIX】zabbix监控rabbitmq消息队列堆积_监控_09

(5)、设置‘监控项原型’,如下图:

【ZABBIX】zabbix监控rabbitmq消息队列堆积_rabbitmq_10

【ZABBIX】zabbix监控rabbitmq消息队列堆积_rabbitmq_11

【ZABBIX】zabbix监控rabbitmq消息队列堆积_zabbix_12

(6)、设置‘触发器类型’,如下图:

【ZABBIX】zabbix监控rabbitmq消息队列堆积_zabbix_13

【ZABBIX】zabbix监控rabbitmq消息队列堆积_监控_14

【ZABBIX】zabbix监控rabbitmq消息队列堆积_监控_15

【ZABBIX】zabbix监控rabbitmq消息队列堆积_自动发现_16

【ZABBIX】zabbix监控rabbitmq消息队列堆积_自动发现_17

添加主机如下图:

【ZABBIX】zabbix监控rabbitmq消息队列堆积_zabbix_18