Мониторинг очередей, сообщений в очередях и серверных показателей(файловых дескрипторов, памяти, количества сокетов, дискового пространства) с помощью шаблона и скриптов
https://github.com/jasonmcintosh/rabbitmq-zabbix.git
Используется API для RabbitMQ, который становится доступным после установки RabbitMQ-плагина
Включаем плагин для WEB-интерфейса
1 |
# rabbitmq-plugins enable rabbitmq_management |
После чего WEB-интерфейс RabbitMQ доступен по адресу
http://RabbitmQ-server:15672
1.Склонируем репозитарий, зайдем внутрь репозитария, скопируем рекурсивно каталог scripts/rabbitmq в /etc/zabbix/scripts/, скопируем файл zabbix_agentd.d/zabbix-rabbitmq.conf в
/etc/zabbix/zabbix_agentd.d/
1 |
# git clone https://github.com/jasonmcintosh/rabbitmq-zabbix.git |
1 |
# cd rabbitmq-zabbix/ |
1 |
# cp -r scripts/rabbitmq /etc/zabbix/scripts/ |
1 |
# cp zabbix_agentd.d/zabbix-rabbitmq.conf /etc/zabbix/zabbix_agentd.d/ |
1 |
# chmod 750 /etc/zabbix/scripts/rabbitmq |
1 |
# cat /etc/zabbix/zabbix_agentd.d/zabbix-rabbitmq.conf |
1 2 3 4 |
UserParameter=rabbitmq.discovery_queues,/etc/zabbix/scripts/rabbitmq/list_rabbit_queues.sh UserParameter=rabbitmq.discovery_shovels,/etc/zabbix/scripts/rabbitmq/list_rabbit_shovels.sh UserParameter=rabbitmq.discovery_nodes,/etc/zabbix/scripts/rabbitmq/list_rabbit_nodes.sh UserParameter=rabbitmq[*],/etc/zabbix/scripts/rabbitmq/rabbitmq-status.sh $1 $2 $3 |
2.На одном из RabbitMQ-серверов создаем zabbix-пользователя(т.к. два RabbitMQ-сервера в кластере,то эти данные автоматически реплицируются на второй сервер)
1 |
# rabbitmqctl add_user zabbix mypassword |
1 |
# rabbitmqctl set_user_tags zabbix administrator |
1 |
# rabbitmqctl set_permissions -p / zabbix ".*" ".*" ".*" |
1 |
# rabbitmqctl set_permissions -p myvhost2 zabbix ".*" ".*" ".*" |
1 |
# rabbitmqctl set_permissions -p myvhost1 zabbix ".*" ".*" ".*" |
Создаем файл с настройками для аутентификации в RabbitMQ
1 |
# nano /etc/zabbix/scripts/rabbitmq/.rab.auth |
1 2 3 4 5 6 7 |
USERNAME=zabbix PASSWORD=mypassword CONF=/etc/zabbix/zabbix_agentd.conf LOGLEVEL=INFO LOGFILE=/var/log/zabbix/rabbitmq_zabbix.log PORT=15672 FILTER='[{"durable": true, "vhost": "myvhost1"}, {"durable": true, "vhost": "myvhost2"}]' |
Если не указывать фильтры(параметр FILTER),то дискавери будет обнаруживать и мониторить все очереди.
Например, в данном примере будут обнаруживаться и мониториться только очереди имеющие флаг durable и только в вирт.хостах myvhost1, myvhost2
1 |
# chown -R zabbix:zabbix /etc/zabbix/scripts/rabbitmq |
1 |
# systemctl restart zabbix-agent |
3.Импортируем шаблон, добавляем шаблон к RabbitMQ-серверу
В шаблоне указаны макросы на кол-во сообщений в очереди для уровня важности Critical(200000) и Warning(100000)
1 2 |
{$RABBIT_QUEUE_MESSAGES_CRIT} {$RABBIT_QUEUE_MESSAGES_WARN} |
Измените значения этих макросов для своих задач(например, у меня 1000 и 500)
В логах проверяем наличие ошибок/кода ответа
1 |
# tail -f /var/log/zabbix/rabbitmq_zabbix.log |
1 |
2018-07-26 07:53:45,145 INFO: Found return code of 0 |
Для дебага устанавливаем уровень логирования DEBUG в файле /etc/zabbix/scripts/rabbitmq/.rab.auth
LOGLEVEL=DEBUG
Настройка ротации файла /var/log/zabbix/rabbitmq_zabbix.log
В Logrotate в файл, в котором настроена ротация zabbix-agentd.log файла, добавляем ротацию
файла rabbitmq_zabbix.log
1 |
# nano /etc/logrotate.d/zabbix-agent |
1 2 3 4 5 6 7 8 9 10 |
…… /var/log/zabbix/rabbitmq_zabbix.log { daily rotate 3 compress dateext missingok notifempty create 0664 zabbix zabbix } |
Источник:
https://github.com/jasonmcintosh/rabbitmq-zabbix
Мониторинг состояния RabbitMQ-кластера и статуса health-проверки ноды
На RabbitMQ-серверах
1. Создаем скрипт
1 |
# cat /usr/local/scripts/zabbix_sender_rabbitmq.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/usr/bin/env bash HOSTNAME=$(hostname -f) TIMESTAMP=`date +%s` ZABBIX_DIR=/etc/zabbix ZABBIX_SENDER=$(which zabbix_sender) RABBITMQCTL=$(which rabbitmqctl) RABBITMQ_SERVER_01="app01" RABBITMQ_SERVER_02="app02" RABBITMQ_NODE_HEALTH_CHECK=$($RABBITMQCTL node_health_check | grep -i 'Health check passed' | wc -l) if [ "${RABBITMQ_NODE_HEALTH_CHECK}" -eq "1" ]; then RABBITMQ_NODE_HEALTH_CHECK_ANSWER="\"$HOSTNAME\" rabbitmq_node_health_check $TIMESTAMP true" else RABBITMQ_NODE_HEALTH_CHECK_ANSWER="\"$HOSTNAME\" rabbitmq_node_health_check $TIMESTAMP false" fi echo "${RABBITMQ_NODE_HEALTH_CHECK_ANSWER}" | ${ZABBIX_SENDER} -c $ZABBIX_DIR/zabbix_agentd.conf -i - -T -vv >/dev/null 2>&1 RABBITMQ_CLUSTER_STATUS=$($RABBITMQCTL cluster_status | grep running_nodes | awk -F[ {'print $2'} | sed 's/]\}//') if [ "${RABBITMQ_CLUSTER_STATUS}" == "rabbit@${RABBITMQ_SERVER_01},rabbit@${RABBITMQ_SERVER_02}," ] || [ "${RABBITMQ_CLUSTER_STATUS}" == "rabbit@${RABBITMQ_SERVER_02},rabbit@${RABBITMQ_SERVER_01}," ] ; then RABBITMQ_CLUSTER_STATUS_ANSWER="\"$HOSTNAME\" rabbitmq_cluster_status $TIMESTAMP true" else RABBITMQ_CLUSTER_STATUS_ANSWER="\"$HOSTNAME\" rabbitmq_cluster_status $TIMESTAMP false" fi echo "${RABBITMQ_CLUSTER_STATUS_ANSWER}" | ${ZABBIX_SENDER} -c $ZABBIX_DIR/zabbix_agentd.conf -i - -T -vv >/dev/null 2>&1 |
В скрипте необходимо изменить имена RabbitMQ-серверов, как они выглядят в выводе команды
1 |
# rabbitmqctl cluster_status |
Например, в данном случае
1 |
# rabbitmqctl cluster_status |
1 2 3 4 5 6 |
Cluster status of node rabbit@app01 ... [{nodes,[{disc,[rabbit@app01,rabbit@app02]}]}, {running_nodes,[rabbit@app02,rabbit@app01]}, {cluster_name,<<"rabbit@app01.amoriltd.com">>}, {partitions,[]}, {alarms,[{rabbit@app02,[]},{rabbit@app01,[]}]}] |
Имена rabbitmq-серверов в кластере app01 и app02
Соответственно в файле /usr/local/scripts/zabbix_sender_rabbitmq.sh эти значение указаны в переменных
1 2 |
RABBITMQ_SERVER_01=app01 RABBITMQ_SERVER_02=app02 |
Если нод в кластере больше двух, то необходимо добавить дополнительные переменные RABBITMQ_SERVER_0X и ввести их в проверку в строке проверки состояния кластера
1 |
if [ "${RABBITMQ_CLUSTER_STATUS}"....... |
2.Устанавливаем права, владельца/группу на скрипт /usr/local/scripts/zabbix_sender_rabbitmq.sh
1 |
# chmod 751 /usr/local/scripts/zabbix_sender_rabbitmq.sh && chown root:root /usr/local/scripts/zabbix_sender_rabbitmq.sh |
3.Запускаем скрипт вручную для проверки
1 |
# bash -x /usr/local/scripts/zabbix_sender_rabbitmq.sh |
4. Скачиваем, распаковываем, импортируем шаблон, добавляем шаблон к RabbitMQ-серверам
В шаблоне присутствует 4 триггера
1 2 3 4 |
А) Отсутствие данных по проверке статуса кластера в течение 3-х минут Б) Отсутствие данных по health-проверки ноды в течение 3-х минут В) Health-проверка ноды не завершилась успешно. Г) Состояние кластера некорректное( одна или более нод находятся ВНЕ кластера) |
5.Добавляем в крон задание на ежеминутное выполнение
1 |
# cat /etc/cron.d/zabbix-sender-rabbitmq |
1 2 |
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin * * * * * root /bin/bash /usr/local/scripts/zabbix_sender_rabbitmq.sh > /dev/null |
Через минуту проверем данные в Monitoring->Latest Data-> фильтруя по имени хоста и приложению rabbitmq