Zabbix и RabbitMq — автообнаружение очередей сообщений

Данная статья описывает мониторинг только количества сообщений в очередях RabbitMq. Если вам нужен мощный комбайн для мониторинга RabbitMq «со всех сторон» лучше воспользоваться уже написанным шаблоном от jasonmcintosh.
Для решения моей задачи данный шаблон и скрипты показались избыточными и сильно нагружающими сервер ненужными лично мне проверками. Поэтому пришлось допиливать решение ниже.

Перед непосредственной настройкой автообнаружения очередей необходимо сделать несколько подготовительных вещей:

  1. Необходимо включить web-интерфейс RabbitMq активировав плагин, который входит в дистрибутив:
    rabbitmq-plugins enable rabbitmq_management
    после этого так же станет доступен API к которому можно обращаться.
  2. Создать отдельного пользователя в rabbitmq для доступа к очередям сообщений, с разрешением только на чтение. Сделать это можно как через веб-интерфейс так и из cli:
    rabbitmqctl add_user zabbix zabbixpassword
    rabbitmqctl set_user_tags zabbix monitoring
    rabbitmqctl set_permissions -p / zabbix "" "" ".*"
  3. В конфиге zabbix агента /etc/zabbix/zabbix_agentd.conf на хосте с RabbitMq добавить ключ:
    AllowRoot=1
    и после этого перезапустить zabbix агент. Ключ позволит агенту работать из под рута и выполнять команды rabbitmqctl.


1. Автообнаружение и мониторинг всех очередей RabbitMq

Если вам необходимо мониторить абсолютно ВСЕ очереди из RabbitMq, то можно использовать простой скрипт на Python, который стучится в API и формирует JSON для автообнаружения Zabbix:

Скачать скрипт

В коде вам необходимо поменять login и pwd на реквизиты ранее заведённого пользователя.

#!/usr/bin/python

#import modules
import sys
import json,urllib
#Creds
login = "zabbix"
pwd = "zabbixpassword"
#get request
data = urllib.urlopen('http://'+login+':'+pwd+'@localhost:15672/api/queues/').read()
#convert to json
output = json.loads(data)
#Get count items in json
count = len(output)
#Temp count
cline=0
#build json output
print "{"
print " \"data\":["
print ""

for queue in output:
        cline= cline+1
        if (cline == count):
                print '{"{#RABBITMQ_QUEUE_NAME}":"' + queue['name'] + '",'
                print '"{#RABBITMQ_VHOST}":"' + queue['vhost'] + '"}'
        else:
                print '{"{#RABBITMQ_QUEUE_NAME}":"' + queue['name'] + '",'
                print '"{#RABBITMQ_VHOST}":"' + queue['vhost'] + '"},'
print ""
print " ]"
print "}"

Для сбора информации о количестве сообщений в каждой очереди используется второй скрипт:

Скачать скрипт

#!/usr/bin/env python
import sys
import subprocess

command = 'sudo rabbitmqctl list_queues -p '+ sys.argv[1] +' name ' + sys.argv[3] + ' | grep \'^'+ sys.argv[2] + '\>\' | awk \'{print $2}\''
subprocess.call(command, shell=True)

Данные скрипты копируем в директорию /etc/zabbix/scripts/ и разрешаем их выполнение:
cd /etc/zabbix/scripts/
chmod +x *

В конфиг zabbix агента добавляем UserParameter-ы для работы ключей автообнаружения и сбора статистики очередей. Ключи ссылаются на скопированные скрипты:

UserParameter = rabbitmq_discovery_queues, /etc/zabbix/scripts/rabbitmq_discovery_queues.py
UserParameter = rabbitmq_queue_python[*], /etc/zabbix/scripts/rabbitmq_queue.py  "$1" "$2" "$3"

После добавления параметров необходимо перезапустить агент.

Далее в Zabbix создаём новый шаблон и внутри него новое правило обнаружения, используется ключ rabbitmq_discovery_queues:

Для данного обнаружения создаём прототип элемента данных, который будет собирать количество сообщений (message) в очереди, используем ключ rabbitmq_queue_python[{#RABBITMQ_VHOST},{#RABBITMQ_QUEUE_NAME},messages] :

Аналогично можно завести прототипы для сбора количества messages_ready и messages_unacknowledged, поменяв последний параметр в ключе:
rabbitmq_queue_python[{#RABBITMQ_VHOST},{#RABBITMQ_QUEUE_NAME},messages_ready]

rabbitmq_queue_python[{#RABBITMQ_VHOST},{#RABBITMQ_QUEUE_NAME},messages_unacknowledged]

На основе этих прототипов элементов данных можно настроить прототипы триггеров по своему вкусу.

Прикрепляете созданные шаблон к узлу сети с RabbitMq и данные начнут приходить. На время отладки интервал автообнаружения можно уменьшить.

На этом базовая настройка завершена.


2. Автообнаружение и мониторинг «избранных» очередей RabbitMq

Часто сбор метрик всех очередей не нужен, а интересуют только определенные очереди.
Если очередей мало, то можно решить задачу в лоб — просто читать JSON конкретной очереди и при помощи предобработки читать значение по JSON-path, но это уже совсем другая история. Или вас не устраивает автоматическое создание триггеров на все очереди — они имеют одинаковую критичность, а для некоторых очередей это не нужно.

В моём случае есть очереди сообщений в которых копятся ошибки. Эти очереди заканчиваются на _error и по ним нужно создавать триггеры с наивысшей критичностью. Плюс по этим очередям нам нужно мониторить только messages, когда по всем остальным ещё messages_ready и  messages_unacknowledged.

Для выборки очередей при автообнаружении скрипт описанный в первой части был переработан — добавлен фильтр в API, который выбирает только очереди с _error в имени. В веб интерфейсе в поиске создали фильтр и через F12 посмотрели URL API с фильтром, после данный URL применили в скрипте:

Скачать скрипт

#!/usr/bin/python

#import modules
import sys
import json,urllib
#Creds
login = "zabbix"
pwd = "zabbixpassword"
#get request
data = urllib.urlopen('http://'+login+':'+pwd+'@localhost:15672/api/queues?page=1&page_size=500&name=_error&use_regex=false').read()
#convert to json
output = json.loads(data)
output = output['items'] # output.get('items', '')
#Get count items in json
count = len(output)
#Temp count
cline=0
#build json output
print "{"
print " \"data\":["
print ""

for queue in output:
        cline= cline+1
        if (cline == count):
                print '{"{#RABBITMQ_QUEUE_NAME}":"' + queue['name'] + '",'
                print '"{#RABBITMQ_VHOST}":"' + queue['vhost'] + '"}'
        else:
                print '{"{#RABBITMQ_QUEUE_NAME}":"' + queue['name'] + '",'
                print '"{#RABBITMQ_VHOST}":"' + queue['vhost'] + '"},'
print ""
print " ]"
print "}"


В скриптах автообнаружения не забудьте поменять login и pwd на реквизиты ранее заведённого пользователя.

По аналогии со скриптом выше создан второй скрипт автообнаружения, который выбирает все очереди, в которых _error в имени нет. В веб интерфейсе в поиске создали фильтр с использованием регулярного выражения и через F12 посмотрели URL API с фильтром, после данный URL применили в скрипте:

Скачать скрипт

#!/usr/bin/python

#import modules
import sys
import json,urllib
#Creds
login = "zabbix"
pwd = "zabbixpassword"
#get request
data = urllib.urlopen('http://'+login+':'+pwd+'@localhost:15672/api/queues?page=1&page_size=500&name=%5E((%3F!error).)*%24&use_regex=true').read()
#convert to json
output = json.loads(data)
output = output['items'] # output.get('items', '')
#Get count items in json
count = len(output)
#Temp count
cline=0
#build json output
print "{"
print " \"data\":["
print ""

for queue in output:
        cline= cline+1
        if (cline == count):
                print '{"{#RABBITMQ_QUEUE_NAME}":"' + queue['name'] + '",'
                print '"{#RABBITMQ_VHOST}":"' + queue['vhost'] + '"}'
        else:
                print '{"{#RABBITMQ_QUEUE_NAME}":"' + queue['name'] + '",'
                print '"{#RABBITMQ_VHOST}":"' + queue['vhost'] + '"},'
print ""
print " ]"
print "}"


Скрипт для сбора метрик с самой очереди остался таким же как в первой части статьи:

Скачать скрипт

#!/usr/bin/env python
import sys
import subprocess

command = 'sudo rabbitmqctl list_queues -p '+ sys.argv[1] +' name ' + sys.argv[3] + ' | grep \'^'+ sys.argv[2] + '\>\' | awk \'{print $2}\''
subprocess.call(command, shell=True)

Как и в первой части скрипты копируем в директорию /etc/zabbix/scripts/ и разрешаем их выполнение:
cd /etc/zabbix/scripts/
chmod +x *

В конфиг zabbix агента добавляем UserParameter-ы для работы ключей автообнаружения и сбора метрики. Параметры отличаются от описанных в первой части:

UserParameter = rabbitmq_queue_error[*], /etc/zabbix/scripts/rabbitmq_queue.py  "$1" "$2" "$3"
UserParameter = rabbitmq_queue_no_error[*], /etc/zabbix/scripts/rabbitmq_queue.py  "$1" "$2" "$3"
UserParameter = rabbitmq_discovery_error_queues, /etc/zabbix/scripts/rabbitmq_discovery_error_queues.py
UserParameter = rabbitmq_discovery_no_error_queues, /etc/zabbix/scripts/rabbitmq_discovery_no_error_queues.py

Zabbix внутри шаблона требует уникальные ключи для прототипов элементов данных, поэтому rabbitmq_queue_error и rabbitmq_queue_no_error ссылаются на один и тот же скрипт, но работают в разных обнаружениях.

После добавления параметров необходимо перезапустить агент.

В шаблоне Zabbix создаём первое правило обнаружения — очередей с _error, используется ключ rabbitmq_discovery_error_queues :

Внутри создаём прототип элементов данных, собирающий количество messages, ключ rabbitmq_queue_error[{#RABBITMQ_VHOST},{#RABBITMQ_QUEUE_NAME},messages] :

Создаём в шаблоне второе правило обнаружения всех остальных очередей, ключ rabbitmq_discovery_no_error_queues :

И прототип элементов данных для него, например по messages_ready, ключ rabbitmq_queue_no_error[{#RABBITMQ_VHOST},{#RABBITMQ_QUEUE_NAME},messages_ready] :

Прототипы триггеров и остальных элементов делаются по потребностям.

Шаблон так же прикрепляется к узлу с RabbitMq, после чего в «последних данных» должна появиться информация по обнаруженным очередям.


Применение данных методов ограничевается только фантазией.

0

Zabbix и RabbitMq — автообнаружение очередей сообщений: 2 комментария

  1. Сергій

    ./rabbitmq_queue.py
    Traceback (most recent call last):
    File «./rabbitmq_queue.py», line 5, in
    command = ‘sudo rabbitmqctl list_queues -p ‘+ sys.argv[1] +’ name ‘ + sys.argv[3] + ‘ | grep \’^’+ sys.argv[2] + ‘\>\’ | awk \'{print $2}\»
    IndexError: list index out of range

    0
    1. mno Автор записи

      Мне кажется ошибка связана с тем, что скрипт ожидает получить 3 аргумента для корректной работы. В Zabbix при вызове скрипта отдаётся имя vhost, имя очереди и тип очереди — rabbitmq_queue[{#RABBITMQ_VHOST},{#RABBITMQ_QUEUE_NAME},messages]

      0

Добавить комментарий

Ваш e-mail не будет опубликован.