Как мониторить ваш экземпляр RabbitMQ для оптимальной производительности

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

Как отслеживать производительность вашего экземпляра RabbitMQ

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

Хороший мониторинг RabbitMQ отслеживает поток сообщений, работоспособность потребителей, ресурсы узла и состояние кластера. Это руководство охватывает встроенный плагин управления, Prometheus и Grafana, а также команды rabbitmqctl, которые можно использовать во время инцидента.

Основные метрики RabbitMQ для отслеживания

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

Метрики работоспособности очередей

Метрики очередей являются наиболее критическими показателями эффективности обработки сообщений и потенциальных задержек:

  • Скорость сообщений (Публикация/Доставка/Подтверждение): Отслеживает сообщения, поступающие, покидающие и подтверждаемые потребителями. Низкая скорость доставки в сочетании с высокой скоростью публикации часто указывает на медленных потребителей или узкие места.
  • Длина очереди (messages_ready): Общее количество сообщений, ожидающих доставки. Быстро растущая длина указывает на то, что потребители не успевают за нагрузкой производителя.
  • Неподтвержденные сообщения (messages_unacknowledged): Сообщения, которые были доставлены, но все еще ожидают подтверждения. Высокое значение может указывать на сбои потребителей, длительное время обработки или взаимоблокировки потребителей.
  • Количество потребителей: Количество активных потребителей, подключенных к очереди. Очередь с высокой нагрузкой, но без потребителей, является явной точкой отказа.
  • Использование устойчивых очередей и постоянных сообщений: Убедитесь, что очереди и сообщения, которые должны пережить перезапуск брокера, настроены на устойчивость. Устойчивость — это настройка дизайна, в то время как поведение записи на диск также зависит от подтверждений издателя и состояния хранилища.

Активность соединений и каналов

Эти метрики помогают выявить утечки или неправильную очистку ресурсов:

  • Количество соединений: Общее количество открытых TCP-соединений. Слишком много соединений может перегрузить операционную систему или виртуальную машину Erlang.
  • Количество каналов: Активные каналы внутри соединений. Каналы дешевле соединений, но чрезмерное количество все равно указывает на нагрузку на ресурсы.
  • Состояние клиентского соединения: Ищите соединения, застрявшие в переходных состояниях, или высокую частоту смены соединений.

Системные ресурсы и ресурсы виртуальной машины Erlang

RabbitMQ работает на виртуальной машине Erlang, что делает его внутреннее использование ресурсов отличным от стандартных процессов ОС:

  • Использование памяти: Общий объем памяти, потребляемый виртуальной машиной Erlang. RabbitMQ использует систему пороговых значений; если память достигает верхнего порога, он ограничивает производителей.
  • Процессы Erlang: Общее количество легковесных процессов, работающих внутри виртуальной машины. Неуправляемое количество процессов указывает на возможную утечку ресурсов или бесконечный цикл внутри плагина.
  • Файловые дескрипторы: Отслеживает доступность файловых дескрипторов, критически важных для соединений, очередей и постоянного хранения.
  • Лимит свободного места на диске: RabbitMQ поднимает дисковую тревогу и блокирует издателей, когда свободное место на диске падает ниже настроенного порога. По умолчанию для небольших тестовых систем это значение часто было низким, поэтому производственные узлы должны устанавливать и отслеживать явное значение.

Мониторинг с помощью плагина управления RabbitMQ

Плагин управления RabbitMQ — это основной встроенный инструмент для визуализации и оперативных проверок в реальном времени. Он предоставляет как веб-интерфейс, так и мощный HTTP API.

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

Плагин обычно устанавливается вместе с RabbitMQ, но его необходимо явно включить:

sudo rabbitmq-plugins enable rabbitmq_management

После включения веб-интерфейс обычно доступен на порту 15672 (например, http://localhost:15672).

Ключевые представления в веб-интерфейсе

  1. Страница обзора: Предоставляет статистику высокого уровня, включая скорость потока сообщений (глобальная публикация/доставка), использование памяти и количество соединений. Это ваша начальная панель мониторинга работоспособности.
  2. Вкладка очередей: Предлагает подробные метрики для каждой очереди, включая мгновенную и агрегированную скорость сообщений, загрузку потребителей и длину очереди. Используйте функцию сортировки, чтобы быстро найти самые длинные или самые загруженные очереди.
  3. Вкладки соединений и каналов: Позволяет проверять отдельные клиентские соединения, показывая их статус, детали протокола и использование пропускной способности.

Использование HTTP API

Для автоматических проверок и интеграции в пользовательские панели мониторинга плагин управления предоставляет обширный HTTP API. Это идеально подходит для написания скриптов проверки работоспособности или интеграции с проприетарными системами мониторинга.

Пример: Проверка работоспособности кластера

# Проверка базовой статистики обзора
curl -u user:password http://localhost:15672/api/overview

# Получение метрик для конкретной очереди (например, 'task_queue')
curl -u user:password http://localhost:15672/api/queues/%2F/task_queue

Совет: HTTP API возвращает подробные данные в формате JSON, что позволяет фильтровать и создавать оповещения на основе определенных числовых порогов, таких как длина очереди или количество неподтвержденных сообщений.


Продвинутый мониторинг с Prometheus и Grafana

Для производственных сред рекомендуется интегрировать метрики RabbitMQ со стандартными системами мониторинга временных рядов, такими как Prometheus (для сбора) и Grafana (для визуализации). RabbitMQ предоставляет специальный плагин для этого.

1. Включение плагина Prometheus

Этот плагин предоставляет метрики в формате, ожидаемом Prometheus, обычно на порту 15692 (или 15672/metrics при использовании порта управления).

sudo rabbitmq-plugins enable rabbitmq_prometheus

2. Настройка сбора данных Prometheus

После включения необходимо настроить Prometheus для сбора данных с конечной точки. Добавьте задачу, аналогичную следующей, в вашу конфигурацию prometheus.yml:

scrape_configs:
  - job_name: 'rabbitmq'
    metrics_path: /metrics
    # Плагин rabbitmq_prometheus предоставляет /metrics на порту 15692 по умолчанию.
    static_configs:
      - targets: ['rabbitmq-host:15692']

3. Визуализация в Grafana

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

  • Задолженность очереди: График rabbitmq_queue_messages_ready и rabbitmq_queue_messages_unacked с течением времени.
  • Скорость сообщений: Отслеживайте скорость публикации, доставки и подтверждения, чтобы видеть, успевают ли потребители.
  • Использование ресурсов узла: Отслеживайте память, файловые дескрипторы, использование процессов Erlang и дисковые тревоги.

Пример метрики Prometheus для длины очереди:

Стандартная метрика для длины очереди, предоставляемая плагином:

rabbitmq_queue_messages_ready{queue="my_critical_queue", vhost="/"}

Лучшая практика мониторинга: Оповещения

Настройте оповещения в Prometheus Alertmanager или Grafana на основе четких порогов:

Сигнал Пример оповещения Рекомендуемое действие
Готовые сообщения Задолженность очереди растет в течение 5 минут Проверьте ошибки потребителей, добавьте потребителей, если приложение может безопасно обрабатывать, или замедлите производителей.
Неподтвержденные сообщения Количество неподтвержденных остается высоким, а скорость подтверждения низкой Проверьте задержку потребителей, сбои, настройки prefetch и зависимости ниже по потоку.
Дисковая тревога Узел сообщает о тревоге нехватки свободного места на диске Освободите место, расширьте хранилище или переместите данные, прежде чем производители останутся заблокированными.
Тревога памяти Узел сообщает о тревоге памяти Найдите большие очереди, большое количество соединений/каналов или плагины, интенсивно использующие память, и отрегулируйте емкость.

Диагностика через CLI с помощью rabbitmqctl

Утилита командной строки rabbitmqctl необходима для быстрой, прямой проверки и оперативных проверок, особенно когда веб-интерфейс или внешние системы мониторинга недоступны.

Проверка статуса узла

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

rabbitmqctl status

Список критических очередей

Вы можете использовать list_queues для быстрого выявления узких мест, фокусируясь на ключевых показателях эффективности (KPI):

# Список очередей с отображением имени, общего количества сообщений, готовых сообщений и количества потребителей
rabbitmqctl list_queues name messages messages_ready consumers

# Для загруженного узла отправьте вывод через локальную сортировку.
rabbitmqctl list_queues name messages messages_ready consumers | sort -k2 -nr | head

Анализ соединений и каналов

Для устранения неполадок с конкретным клиентом вы можете вывести список соединений и каналов, фильтруя по пользователю или сетевому адресу:

# Список активных соединений с отображением пользователя и исходного IP
rabbitmqctl list_connections user peer_host

# Список активных каналов и статус их потока сообщений
rabbitmqctl list_channels connection_details consumer_count messages_unacknowledged

В больших кластерах команды с широким списком могут добавить нагрузку на уже напряженный узел. Во время инцидента предпочтительнее использовать целевые проверки очередей, виртуальных хостов или соединений.

Лучшие практики для поддержания производительности

  1. Отслеживайте пропускную способность потребителей: Следите за загрузкой потребителей в интерфейсе управления и экспортируемых метриках. Низкое значение часто означает, что очереди могут доставлять быстрее, чем потребители могут принимать работу, что указывает на медленных потребителей, низкий prefetch или задержку ниже по потоку.
  2. Управляйте контролем потока производителей: RabbitMQ использует тревоги памяти и диска Erlang для применения обратного давления. Внимательно отслеживайте эти тревоги, так как они указывают на то, что узел достигает пределов емкости, и производители ограничиваются.
  3. Интеграция журналов: Интегрируйте журналы RabbitMQ в централизованную систему ведения журналов (стек ELK, Splunk и т.д.). Ищите повторяющиеся предупреждения, связанные с сетевыми сбоями, неудачными попытками аутентификации или медленной синхронизацией памяти.
  4. Проверки работоспособности кластера: Если вы используете кластер, отслеживайте членство узлов, сетевые разделы, работоспособность кворумных очередей и состояние синхронизации. rabbitmqctl cluster_status — это полезная первая проверка, когда узлы расходятся во мнениях о членстве в кластере.

Ключевой вывод

Используйте интерфейс управления для быстрой проверки, Prometheus и Grafana для трендов и оповещений, а rabbitmqctl для целенаправленной диагностики, когда что-то уже пошло не так. Настройте оповещения о растущих задержках, застрявших неподтвержденных сообщениях, дисковых тревогах, тревогах памяти и работоспособности кластера; эти сигналы обычно сообщают о проблемах до того, как произойдет тайм-аут приложений.