Плагин RabbitMQ

Мониторинг брокера сообщений RabbitMQ с подробными метриками, охватывающими очереди, сообщения, соединения, каналы и использование ресурсов.

Обзор

Плагин RabbitMQ собирает детальные метрики из RabbitMQ Management API, включая:

  • Статистика сообщений - Готовые сообщения, неподтверждённые сообщения, всего сообщений
  • Метрики очередей - Число очередей, глубина очередей, распределение потребителей
  • Скорость сообщений - Скорость публикации, скорость доставки, скорость подтверждений
  • Метрики соединений - Активные соединения, каналы, потребители
  • Использование ресурсов - Использование памяти, свободное место на диске, файловые дескрипторы, сокеты
  • Здоровье кластера - Статус узла, тревоги, время работы

Требования

Версия RabbitMQ

  • Минимум: RabbitMQ 3.7
  • Рекомендуется: RabbitMQ 3.11 или новее
  • Протестировано с: RabbitMQ 3.9, 3.10, 3.11, 3.12

Плагин RabbitMQ Management

Обязательно: Плагин management должен быть включён

Проверьте, включён ли он:

sudo rabbitmq-plugins list | grep management

Включите, если отсутствует:

sudo rabbitmq-plugins enable rabbitmq_management
sudo systemctl restart rabbitmq-server

Зависимости Python

pip install requests>=2.28.0

Устанавливается автоматически при использовании PLUGINS=rabbitmq во время установки агента.

Доступ к API

Агенту нужен HTTP-доступ к RabbitMQ Management API (порт по умолчанию 15672).

Конфигурация

Базовая конфигурация

plugins:
  rabbitmq:
    enabled: true
    host: localhost
    port: 15672
    username: guest
    password: guest

С пользовательским пользователем

plugins:
  rabbitmq:
    enabled: true
    host: localhost
    port: 15672
    username: monitor
    password: your-secure-password

С HTTPS

plugins:
  rabbitmq:
    enabled: true
    host: rabbitmq.example.com
    port: 15671
    username: monitor
    password: your-password
    use_ssl: true
    verify_ssl: true

Все параметры конфигурации

plugins:
  rabbitmq:
    enabled: true                      # Enable/disable plugin
    host: localhost                    # RabbitMQ host
    port: 15672                        # Management API port (15672=HTTP, 15671=HTTPS)
    username: guest                    # Management username
    password: guest                    # Management password
    vhost: /                           # Virtual host (default: /)
    use_ssl: false                     # Use HTTPS (default: false)
    verify_ssl: true                   # Verify SSL certificates
    timeout: 10                        # Request timeout (seconds)

Переменные окружения

Конфигурацию можно переопределить переменными окружения:

export RABBITMQ_HOST="localhost"
export RABBITMQ_PORT="15672"
export RABBITMQ_USERNAME="monitor"
export RABBITMQ_PASSWORD="password"

Настройка RabbitMQ

Установка

Ubuntu/Debian:

# Add RabbitMQ repository
curl -1sLf 'https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/setup.deb.sh' | sudo bash

# Install RabbitMQ
sudo apt-get install rabbitmq-server

# Start service
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server

CentOS/RHEL:

# Add RabbitMQ repository
curl -1sLf 'https://dl.cloudsmith.io/public/rabbitmq/rabbitmq-server/setup.rpm.sh' | sudo bash

# Install RabbitMQ
sudo yum install rabbitmq-server

# Start service
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server

Включение плагина Management

# Enable management plugin
sudo rabbitmq-plugins enable rabbitmq_management

# Restart RabbitMQ
sudo systemctl restart rabbitmq-server

Проверьте доступность management API:

curl http://localhost:15672/api/overview

Создание пользователя мониторинга

Создайте выделенного пользователя мониторинга:

# Create user
sudo rabbitmqctl add_user monitor secure-password

# Set tags (monitoring tag gives read-only access)
sudo rabbitmqctl set_user_tags monitor monitoring

# Grant permissions (read-only on all resources)
sudo rabbitmqctl set_permissions -p / monitor "^$" "^$" ".*"

Или используйте пользователя guest (не рекомендуется для продакшена):

Учётные данные по умолчанию:

  • Имя пользователя: guest
  • Пароль: guest
  • Примечание: Пользователь guest по умолчанию имеет доступ только с localhost

Теги и права пользователя

Тег monitoring предоставляет доступ только для чтения к management API:

sudo rabbitmqctl set_user_tags monitor monitoring

Необходимые права:

  • configure: ^$ (нет прав на configure)
  • write: ^$ (нет прав на запись)
  • read: .* (чтение всех ресурсов)
sudo rabbitmqctl set_permissions -p / monitor "^$" "^$" ".*"

Включение удалённого доступа к Management API

По умолчанию management API слушает только на localhost.

Отредактируйте конфигурацию RabbitMQ:

sudo nano /etc/rabbitmq/rabbitmq.conf

Добавьте:

# Listen on all interfaces
management.tcp.ip = 0.0.0.0

Или используйте переменную окружения:

sudo nano /etc/rabbitmq/rabbitmq-env.conf

# Add:
RABBITMQ_MANAGEMENT_LISTENER_IP=0.0.0.0

Перезапустите RabbitMQ:

sudo systemctl restart rabbitmq-server

Примечание по безопасности: Открывайте management API только доверенным сетям. Используйте правила файрвола.

Собираемые метрики

Метрики сообщений

Метрика Описание Единица Тип
messages_ready Сообщения, готовые к доставке Количество Gauge
messages_unacknowledged Доставленные, но не подтверждённые сообщения Количество Gauge
messages_total Всего сообщений во всех очередях Количество Gauge
publish_rate Скорость публикации сообщений msg/s Gauge
deliver_rate Скорость доставки сообщений msg/s Gauge
ack_rate Скорость подтверждения сообщений msg/s Gauge

Метрики очередей

Метрика Описание Единица Тип
queue_count Всего очередей Количество Gauge
consumers_total Всего потребителей Количество Gauge

Метрики соединений

Метрика Описание Единица Тип
connections_total Активные соединения Количество Gauge
channels_total Активные каналы Количество Gauge

Метрики ресурсов

Метрика Описание Единица Тип
memory_used_mb Память, используемая RabbitMQ MB Gauge
memory_limit_mb Лимит памяти MB Gauge
disk_free_gb Свободное место на диске GB Gauge
disk_free_alarm Статус дисковой тревоги (1=активна, 0=ок) Boolean Gauge
fd_used Использовано файловых дескрипторов Количество Gauge
fd_total Доступно файловых дескрипторов Количество Gauge
sockets_used Использовано сокетов Количество Gauge
sockets_total Доступно сокетов Количество Gauge

Метрики узла

Метрика Описание Единица Тип
node_name Имя узла RabbitMQ Строка Info
uptime_seconds Время работы узла Секунды Gauge

Метрики дашборда

Дашборд StatusRadar отображает:

Карточка обзора

  • Messages Ready - Сообщения в очереди, ожидающие доставки
  • Publish Rate - Сообщений опубликовано в секунду
  • Queue Count - Всего очередей
  • Memory Used - Утилизация памяти против лимита
  • Connections - Активные клиентские соединения
  • Consumers - Активные потребители сообщений

График сообщений во времени

  • Готовые сообщения
  • Неподтверждённые сообщения
  • Тренд общего числа сообщений

График скорости сообщений

  • Скорость публикации (msg/s)
  • Скорость доставки (msg/s)
  • Скорость подтверждений (msg/s)

График использования памяти

  • Используемая память во времени
  • Порог лимита памяти

График соединений и очередей

  • Активные соединения
  • Активные потребители
  • Число очередей
  • Число каналов

Таблица информации о сервере

  • Имя узла и время работы
  • Статистика сообщений
  • Метрики очередей
  • Число соединений и каналов
  • Использование ресурсов (память, диск, файловые дескрипторы, сокеты)
  • Статус тревог

Установка

Быстрая установка

PLUGINS='rabbitmq' \
TOKEN='your-agent-token' \
RABBITMQ_USERNAME='monitor' \
RABBITMQ_PASSWORD='your-password' \
bash -c "$(curl -sL https://statusradar.dev/install-agent.sh)"

Установка на существующий агент

  1. Включите плагин RabbitMQ management (см. выше)

  2. Настройте агент:

    sudo nano /opt/statusradar/config/agent.yaml

    Добавьте:

    plugins:
      rabbitmq:
        enabled: true
        host: localhost
        port: 15672
        username: monitor
        password: your-secure-password
  3. Перезапустите агент:

    sudo systemctl restart statusradar-agent
  4. Проверьте:

    sudo journalctl -u statusradar-agent -n 50 --no-pager | grep rabbitmq

    Ожидаемо:

    INFO: Plugin rabbitmq: Metrics collected successfully
    INFO: Plugin rabbitmq: 5 queues, 123 messages ready

Тестирование

Ручной тест плагина

cd /opt/statusradar
python3 plugins/rabbitmq_plugin.py

Ожидаемый вывод:

Plugin: rabbitmq
Enabled: True
Available: True

Collecting metrics...
{
  "node_name": "rabbit@localhost",
  "uptime_seconds": 86400,
  "messages_ready": 123,
  "messages_unacknowledged": 45,
  "messages_total": 168,
  "queue_count": 5,
  "publish_rate": 12.5,
  "deliver_rate": 11.8,
  "ack_rate": 11.8,
  "connections_total": 8,
  "channels_total": 12,
  "consumers_total": 10,
  "memory_used_mb": 145.6,
  "memory_limit_mb": 1024.0,
  "disk_free_gb": 25.3,
  "disk_free_alarm": 0,
  "fd_used": 45,
  "fd_total": 1024,
  "sockets_used": 12,
  "sockets_total": 943
}

Тест Management API

# Get overview
curl -u monitor:password http://localhost:15672/api/overview

# Get queues
curl -u monitor:password http://localhost:15672/api/queues

# Get connections
curl -u monitor:password http://localhost:15672/api/connections

Доступ к веб-интерфейсу Management

Откройте браузер:

http://localhost:15672

Войдите с учётными данными (по умолчанию: guest/guest)

Устранение неполадок

Плагин не собирает метрики

Проверка 1: Запущен ли RabbitMQ?

sudo systemctl status rabbitmq-server

Проверка 2: Включён ли плагин management?

sudo rabbitmq-plugins list | grep management
# Should show: [E*] rabbitmq_management

Проверка 3: Может ли агент получить доступ к management API?

curl -u monitor:password http://localhost:15672/api/overview

Проверка 4: Проверьте логи агента

sudo journalctl -u statusradar-agent -n 100 --no-pager | grep rabbitmq

Распространённые ошибки

"Management plugin not enabled"

Ошибка:

ERROR: Plugin rabbitmq: HTTP 404 - management plugin not enabled

Решение:

sudo rabbitmq-plugins enable rabbitmq_management
sudo systemctl restart rabbitmq-server

"Authentication failed"

Ошибка:

ERROR: Plugin rabbitmq: HTTP 401 - Authentication failed

Причины:

  1. Неверные имя пользователя/пароль
  2. Пользователь не существует
  3. У пользователя нет прав

Решение:

# Verify user exists
sudo rabbitmqctl list_users

# Recreate user
sudo rabbitmqctl delete_user monitor
sudo rabbitmqctl add_user monitor secure-password
sudo rabbitmqctl set_user_tags monitor monitoring
sudo rabbitmqctl set_permissions -p / monitor "^$" "^$" ".*"

"Connection refused"

Ошибка:

ERROR: Plugin rabbitmq: Connection refused

Причины:

  1. RabbitMQ не запущен
  2. Management API не слушает на ожидаемом порту
  3. Файрвол блокирует соединение

Решение:

# Check RabbitMQ is running
sudo systemctl status rabbitmq-server

# Check port
sudo netstat -tlnp | grep 15672

# Check management listener
sudo rabbitmqctl status | grep listeners

"Guest access refused"

Ошибка:

ERROR: Plugin rabbitmq: HTTP 401 - Access refused for user 'guest'

Причина: Пользователь guest по умолчанию имеет доступ только с localhost

Решения:

Вариант 1: используйте localhost (если агент работает на том же сервере):

plugins:
  rabbitmq:
    host: localhost  # or 127.0.0.1

Вариант 2: включите удалённый доступ для guest (не рекомендуется):

sudo nano /etc/rabbitmq/rabbitmq.conf

# Add:
loopback_users = none

Вариант 3: создайте выделенного пользователя (рекомендуется):

sudo rabbitmqctl add_user monitor password
sudo rabbitmqctl set_user_tags monitor monitoring
sudo rabbitmqctl set_permissions -p / monitor "^$" "^$" ".*"

Влияние на производительность

На RabbitMQ

Минимальное влияние:

  • Management API возвращает предварительно рассчитанную статистику
  • Без влияния на обработку или маршрутизацию сообщений
  • Время ответа: < 50 мс

Бенчмарк:

  • Накладные расходы: < 0.1% CPU
  • Нет измеримого падения производительности

На агент

Использование ресурсов:

  • Память: +12 MB
  • CPU: +2% во время сбора
  • Сеть: +2 KB за сбор

Время сбора: 0.1-0.5 секунды

Сценарии использования

1. Мониторинг глубины очередей

Отслеживайте:

  • Готовые сообщения
  • Неподтверждённые сообщения
  • Скорость роста очередей

Настройте оповещения на:

  • Готовые сообщения > 10,000 (затор в очереди)
  • Быстрый рост сообщений
  • Отсутствие потребителей на очередях

2. Мониторинг потребителей

Отслеживайте:

  • Число потребителей на очередь
  • Скорость доставки против скорости публикации
  • Скорость подтверждений

Настройте оповещения на:

  • Потребители = 0 (нет обработки)
  • Скорость доставки < скорости публикации (отставание)
  • Скорость ack < скорости доставки (медленная обработка)

3. Мониторинг соединений

Отслеживайте:

  • Активные соединения
  • Число каналов
  • Скорость создания соединений

Настройте оповещения на:

  • Соединения приближаются к лимиту
  • Перегрузку соединениями (частое открытие/закрытие)
  • Каналы без потребителей

4. Мониторинг ресурсов

Отслеживайте:

  • Использование памяти против лимита
  • Свободное место на диске
  • Использование файловых дескрипторов
  • Использование сокетов

Настройте оповещения на:

  • Память > 80% от лимита
  • Активную дисковую тревогу
  • Файловые дескрипторы > 90% от лимита

5. Мониторинг скорости сообщений

Отслеживайте:

  • Скорость публикации
  • Скорость доставки
  • Соотношение скорости ack

Оптимизируйте:

  • Число потребителей
  • Настройки prefetch
  • Конфигурации очередей

Лучшие практики

1. Установите лимиты ресурсов

Лимит памяти (vm_memory_high_watermark):

sudo nano /etc/rabbitmq/rabbitmq.conf

# Add:
vm_memory_high_watermark.relative = 0.4  # 40% of system RAM

Лимит свободного места на диске:

disk_free_limit.absolute = 10GB

2. Следите за тревогами памяти

Когда срабатывает тревога памяти:

  • Публикаторы блокируются
  • Сообщения не могут быть опубликованы
  • Потребители продолжают обработку

Проверьте статус тревог:

sudo rabbitmqctl status | grep alarms

3. Настройте файловые дескрипторы

Увеличьте лимит FD:

sudo nano /etc/systemd/system/rabbitmq-server.service.d/limits.conf

# Add:
[Service]
LimitNOFILE=65536
sudo systemctl daemon-reload
sudo systemctl restart rabbitmq-server

4. Следите за глубиной очередей

Здоровая глубина очереди: < 1000 сообщений на очередь

Если очереди растут:

  • Добавьте больше потребителей
  • Увеличьте prefetch count
  • Оптимизируйте обработку потребителем
  • Проверьте dead letter очереди

5. Используйте тег monitoring

Всегда создавайте пользователя мониторинга с тегом monitoring (только чтение):

sudo rabbitmqctl set_user_tags monitor monitoring

Никогда не используйте тег administrator для мониторинга - избыточные привилегии.

6. Включите heartbeat

Настройте интервал heartbeat:

heartbeat = 60

Помогает обнаруживать и очищать мёртвые соединения.

Тюнинг производительности RabbitMQ

Оптимизация потребителей

Установите подходящий prefetch count:

channel.basic_qos(prefetch_count=10)
  • Слишком низкий → недозагруженные потребители
  • Слишком высокий → проблемы с памятью

Конфигурация очередей

Durable очереди:

channel.queue_declare(queue='tasks', durable=True)
  • Durable: Переживают перезапуски (медленнее)
  • Transient: Быстрее, теряются при перезапуске

Lazy очереди (для больших очередей):

rabbitmqctl set_policy lazy-queue "^lazy-" '{"queue-mode":"lazy"}' --apply-to queues

Конфигурация кластера

Для высокой доступности:

# Set policy for mirrored queues
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'

Расширенная конфигурация

Несколько виртуальных хостов

Мониторинг разных виртуальных хостов:

plugins:
  rabbitmq_main:
    enabled: true
    host: localhost
    vhost: /
    username: monitor
    password: password

  rabbitmq_staging:
    enabled: true
    host: localhost
    vhost: /staging
    username: monitor
    password: password

Кластер RabbitMQ

Мониторьте каждый узел отдельно:

plugins:
  rabbitmq_node1:
    enabled: true
    host: rabbit1.example.com
    port: 15672
    username: monitor
    password: password

  rabbitmq_node2:
    enabled: true
    host: rabbit2.example.com
    port: 15672
    username: monitor
    password: password

Docker-контейнер

Мониторинг RabbitMQ в Docker:

plugins:
  rabbitmq:
    enabled: true
    host: rabbitmq-container
    port: 15672
    username: guest
    password: guest

Docker run:

docker run -d --name rabbitmq \
  -p 5672:5672 \
  -p 15672:15672 \
  rabbitmq:3-management

Примеры конфигураций

Базовый продакшен

plugins:
  rabbitmq:
    enabled: true
    host: localhost
    port: 15672
    username: monitor
    password: ${RABBITMQ_PASSWORD}

С HTTPS

plugins:
  rabbitmq:
    enabled: true
    host: rabbitmq.internal
    port: 15671
    username: monitor
    password: ${RABBITMQ_PASSWORD}
    use_ssl: true
    verify_ssl: true

Кластер высокой доступности

plugins:
  rabbitmq_node1:
    enabled: true
    host: rabbit-node1.internal
    port: 15672
    username: monitor
    password: ${RABBITMQ_PASSWORD}

  rabbitmq_node2:
    enabled: true
    host: rabbit-node2.internal
    port: 15672
    username: monitor
    password: ${RABBITMQ_PASSWORD}

  rabbitmq_node3:
    enabled: true
    host: rabbit-node3.internal
    port: 15672
    username: monitor
    password: ${RABBITMQ_PASSWORD}

Ограничения

Текущие ограничения

  1. Нет деталей по отдельным очередям - Только агрегированная статистика
  2. Нет метрик по отдельным exchange - Мониторинг на уровне exchange недоступен
  3. Нет деталей по потребителям - Метрики отдельных потребителей не собираются

Масштабируемость

Протестировано с:

  • 1000+ очередей
  • 10,000+ сообщений в секунду
  • 500+ соединений

Производительность:

  • Время ответа API слегка растёт с числом очередей
  • Рекомендуется: < 1000 очередей для оптимальной производительности

Чек-лист мониторинга

Критические метрики:

  1. Готовые сообщения > 10,000
  2. Активная тревога памяти
  3. Активная дисковая тревога
  4. Файловые дескрипторы > 90%

Важные метрики: 5. Число потребителей = 0 6. Скорость публикации >> скорости доставки 7. Рост соединений 8. Утечки каналов

Пороги оповещений

# Recommended thresholds
messages_ready: > 10000
memory_usage_percent: > 80
disk_free_alarm: == 1
fd_usage_percent: > 90
consumers_total: == 0  # For queues that should have consumers

Дальнейшие шаги

On this page