Мониторинг RabbitMQ с помощью Proto Observability
На этой странице:
- Сбор метрик RabbitMQ
- Сбор логов RabbitMQ
Сбор метрик RabbitMQ
Интеграция rabbitmq собирает метрики через HTTP management API
(/api, порт 15672), а не через JMX — поэтому образ агента можно
использовать обычный, без суффикса -jmx.
Проверка собирает 59 метрик пятью группами: соединения (connection), узлы (node),
кластер (overview), exchange и очередь (queue).
Конфигурация RabbitMQ
Включите management plugin (в официальных образах
rabbitmq:*-managementон уже включён; для самостоятельной установки —rabbitmq-plugins enable rabbitmq_management).Создайте read-only пользователя
protoobpс тегомmonitoring:rabbitmqctl add_user protoobp <PASSWORD> rabbitmqctl set_user_tags protoobp monitoring rabbitmqctl set_permissions -p / protoobp "^aliveness-test$" "^amq\.default$" ".*"Те же права можно выставить через management API (удобно из docker-compose, где нет erlang-cookie):
BASE="http://admin:admin@rabbitmq:15672/api" curl -fsS -X PUT "$BASE/users/protoobp" \ -H "content-type: application/json" \ -d '{"password":"<PASSWORD>","tags":"monitoring"}' curl -fsS -X PUT "$BASE/permissions/%2F/protoobp" \ -H "content-type: application/json" \ -d '{"configure":"^aliveness-test$","write":"^amq\\.default$","read":".*"}'
Готовность management API
Healthcheck rabbitmq-diagnostics ping отдаёт OK раньше, чем management
plugin поднимется на порту 15672. Если внешние клиенты или агент обращаются
к API через depends_on: service_healthy, используйте более точный
healthcheck:
healthcheck:
test: ["CMD-SHELL", "rabbitmq-diagnostics -q check_running && rabbitmq-diagnostics -q check_port_listener 15672"]
Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
Создайте файл
/etc/protoobp-agent/conf.d/rabbitmq.d/conf.yaml:init_config: instances: - rabbitmq_api_url: http://localhost:15672/api/ username: protoobp password: "<PASSWORD>"Перезапустите агента:
systemctl restart protoobp-agent.
Если агент запускается в виде Docker контейнера
Добавьте autodiscovery-лейблы к контейнеру RabbitMQ. В docker-compose.yaml:
labels:
com.protoobp.ad.check_names: '["rabbitmq"]'
com.protoobp.ad.init_configs: '[{}]'
com.protoobp.ad.instances: '[{"rabbitmq_api_url": "http://%%host%%:15672/api/", "username": "protoobp", "password": "<PASSWORD>"}]'
Или в Dockerfile:
LABEL "com.protoobp.ad.check_names"='["rabbitmq"]'
LABEL "com.protoobp.ad.init_configs"='[{}]'
LABEL "com.protoobp.ad.instances"='[{"rabbitmq_api_url": "http://%%host%%:15672/api/", "username": "protoobp", "password": "<PASSWORD>"}]'
Проверка
Убедитесь, что проверка запустилась и собирает метрики:
docker exec protoobp-agent agent status | grep -A 8 "^ rabbitmq"
Ожидаемый вывод — Total Runs > 0 и Metric Samples ненулевые:
rabbitmq (3.2.0)
Instance ID: rabbitmq:f69305ac6ed2be42 [OK]
Total Runs: 2
Metric Samples: Last Run: 58, Total: 73
Average Execution Time : 101ms
Собираемые метрики
Проверка различает три типа метрик:
_count— кумулятивные счётчики, монотонно растут от старта брокера. Для дашбордов и алертов применяйте PromQLrate(... [5m])._rate— скорость в секунду, рассчитанная самим RabbitMQ. Используется как есть.- Без суффикса — мгновенные значения (
gauge).
Лейблы
Общие (на всех метриках)
Добавляются агентом и ProtoOBP backend’ом:
| Лейбл | Значение |
|---|---|
host | Хост, на котором работает агент |
service | Тег service (через com.protoobp.tags.service или POBP_TAGS) |
env | Тег env |
docker_image | Полный ref образа контейнера |
image_name | Имя образа без тега |
image_tag | Тег образа |
short_image | Короткое имя образа |
Специфичные для RabbitMQ
| Лейбл | Где появляется | Пример |
|---|---|---|
rabbitmq_node | node-метрики, queue-метрики | rabbit@97c01dab56bd |
rabbitmq_cluster | overview-метрики | rabbit@97c01dab56bd |
rabbitmq_vhost | connection / exchange / queue | / |
rabbitmq_queue | queue-метрики | demo.queue |
rabbitmq_exchange | exchange-метрики | demo.exchange |
rabbitmq_conn_state | rabbitmq_connections_state | running / flow / blocked |
Метрики соединений
| Имя метрики | Доп. лейблы | Описание |
|---|---|---|
rabbitmq_connections | rabbitmq_vhost | Открытых AMQP-соединений в vhost’е |
rabbitmq_connections_state | rabbitmq_conn_state | Соединений в каждом состоянии (running / flow / blocked / …) |
Метрики узла
Несут лейбл rabbitmq_node.
| Имя метрики | Единица | Описание |
|---|---|---|
rabbitmq_node_running | bool | Узел запущен и достижим |
rabbitmq_node_partitions | partition | Network partitions, в которых видит себя узел (в здоровом кластере 0) |
rabbitmq_node_disk_alarm | bool | Поднята тревога по свободному месту на диске |
rabbitmq_node_disk_free | byte | Свободно байт на диске, где лежит journal |
rabbitmq_node_mem_alarm | bool | Поднята тревога по высокой памяти |
rabbitmq_node_mem_limit | byte | Сконфигурированный лимит памяти узла |
rabbitmq_node_mem_used | byte | Текущее потребление памяти узлом |
rabbitmq_node_fd_used | descriptor | Открытых file descriptors |
rabbitmq_node_run_queue | process | Длина очереди готовых к выполнению Erlang-процессов (индикатор перегрузки CPU) |
rabbitmq_node_sockets_used | socket | Открытых сетевых сокетов |
Метрики кластера (overview)
Несут лейбл rabbitmq_cluster (для одиночного узла равен имени node).
Сводка по объектам
| Имя метрики | Единица | Описание |
|---|---|---|
rabbitmq_overview_object_totals_queues | queue | Всего очередей в кластере |
rabbitmq_overview_object_totals_channels | channel | Всего открытых AMQP-каналов |
rabbitmq_overview_object_totals_connections | connection | Всего открытых соединений |
rabbitmq_overview_object_totals_consumers | consumer | Всего активных консьюмеров |
Сводка по очередям кластера
| Имя метрики | Единица | Описание |
|---|---|---|
rabbitmq_overview_queue_totals_messages_count | message | Всего сообщений в очередях кластера |
rabbitmq_overview_queue_totals_messages_rate | message/second | Скорость изменения общего числа сообщений |
rabbitmq_overview_queue_totals_messages_ready_count | message | Сообщения, готовые к доставке |
rabbitmq_overview_queue_totals_messages_ready_rate | message/second | Скорость изменения числа ready-сообщений |
rabbitmq_overview_queue_totals_messages_unacknowledged_count | message | Сообщения, доставленные, но не подтверждённые |
rabbitmq_overview_queue_totals_messages_unacknowledged_rate | message/second | Скорость изменения числа unack-сообщений |
Поток сообщений (cluster)
Каждая операция представлена парой _count (cumulative counter) и _rate
(rate per second).
| Базовое имя метрики | Описание |
|---|---|
rabbitmq_overview_messages_publish_(count|rate) | Сообщения, опубликованные клиентами в exchange’и |
rabbitmq_overview_messages_deliver_get_(count|rate) | Сообщения, доставленные консьюмерам (push) или прочитанные basic.get |
rabbitmq_overview_messages_ack_(count|rate) | Подтверждения от консьюмеров (basic.ack) |
rabbitmq_overview_messages_confirm_(count|rate) | Подтверждения publisher confirm от брокера |
rabbitmq_overview_messages_redeliver_(count|rate) | Повторные доставки (после basic.nack/reject с requeue или channel close) |
rabbitmq_overview_messages_return_unroutable_(count|rate) | Сообщения, вернутые брокером как unroutable (mandatory=true) |
Метрики exchange
Несут лейблы rabbitmq_exchange, rabbitmq_vhost. Каждая операция — пара
_count / _rate.
| Базовое имя метрики | Описание |
|---|---|
rabbitmq_exchange_messages_publish_in_(count|rate) | Сообщения, поступившие в exchange от продюсеров |
rabbitmq_exchange_messages_publish_out_(count|rate) | Сообщения, исходящие из exchange в очереди после маршрутизации |
Метрики очереди
Несут лейблы rabbitmq_queue, rabbitmq_vhost, rabbitmq_node.
Состояние очереди
| Имя метрики | Единица | Описание |
|---|---|---|
rabbitmq_queue_messages | message | Всего сообщений в очереди (ready + unacknowledged) |
rabbitmq_queue_messages_ready | message | Сообщений, готовых к доставке |
rabbitmq_queue_messages_ready_rate | message/second | Скорость изменения числа ready-сообщений |
rabbitmq_queue_messages_unacknowledged | message | Сообщений, доставленных, но не подтверждённых |
rabbitmq_queue_messages_unacknowledged_rate | message/second | Скорость изменения числа unack-сообщений |
rabbitmq_queue_messages_rate | message/second | Скорость изменения общего числа сообщений в очереди |
rabbitmq_queue_message_bytes | byte | Общий размер тел всех сообщений в очереди |
rabbitmq_queue_memory | byte | Память Erlang-процесса очереди (включая индексы, дедуп. таблицы и т.д.) |
rabbitmq_queue_consumers | consumer | Количество подключённых консьюмеров |
rabbitmq_queue_consumer_utilisation | fraction | Доля времени, в течение которой очередь способна доставлять сообщения консьюмерам (0–1) |
rabbitmq_queue_bindings_count | binding | Количество биндингов exchange→queue, ведущих в эту очередь |
Поток сообщений per-queue
Каждая операция — пара _count (cumulative counter) и _rate (rate per second).
| Базовое имя метрики | Описание |
|---|---|
rabbitmq_queue_messages_publish_(count|rate) | Поступление сообщений в очередь |
rabbitmq_queue_messages_deliver_(count|rate) | Push-доставка сообщений консьюмерам |
rabbitmq_queue_messages_deliver_get_(count|rate) | Push-доставка + pull через basic.get |
rabbitmq_queue_messages_ack_(count|rate) | Подтверждения сообщений из очереди |
rabbitmq_queue_messages_redeliver_(count|rate) | Повторные доставки |
Ключевые метрики для дашбордов и алертов
Здоровье узлов и кластера
rabbitmq_node_running == 0— алерт: узел недоступен.rabbitmq_node_partitions > 0— алерт: split brain (network partition).rabbitmq_node_disk_alarm == 1илиrabbitmq_node_mem_alarm == 1— алерт: поднята защитная блокировка приёма сообщений.
Ресурсы узла
rabbitmq_node_mem_used / rabbitmq_node_mem_limit— алерт при > 0.8 (флоу-контроль активируется околоvm_memory_high_watermark).rabbitmq_node_disk_free— алерт по абсолютному порогу (по умолчанию RabbitMQ начинает блокировку при <50 МБ).rabbitmq_node_fd_used— рост FD = утечка соединений или каналов.rabbitmq_node_run_queueстабильно высокий (> числа scheduler-ов) — перегрузка CPU.
Накопление сообщений (backlog)
rabbitmq_queue_messagesperrabbitmq_queue/rabbitmq_vhost— основной SLI; алерт по абсолютному порогу или производной.rabbitmq_queue_consumers == 0при ненулевомrabbitmq_queue_messages_publish_rate= некому потреблять.rabbitmq_queue_consumer_utilisation < 0.4— консьюмеры медленные или prefetch неоптимальный.rabbitmq_overview_queue_totals_messages_unacknowledged_countрастёт — клиенты не подтверждают.
Поток сообщений
rate(rabbitmq_overview_messages_publish_count[5m])vsrate(rabbitmq_overview_messages_ack_count[5m])— публикация против подтверждений (рассинхрон → backlog).rate(rabbitmq_overview_messages_redeliver_count[5m])— растёт = ошибки обработки и nack/reject у консьюмеров.rate(rabbitmq_overview_messages_return_unroutable_count[5m]) > 0— сообщения сmandatory=trueне находят очередь (потери при mis-routing).
Соединения и каналы
rabbitmq_connections_state{rabbitmq_conn_state="blocked"} > 0или..."flow"— продюсеров принудительно тормозит (memory/disk alarm или flow control).- Резкий рост
rabbitmq_overview_object_totals_connections/_channels— утечка клиентских ресурсов.
Сбор логов RabbitMQ
Логи RabbitMQ собираются ProtoOBP агентом и отправляются в бэкенд ProtoOBP.
Здесь — только специфичные для RabbitMQ настройки. Включение логов на стороне
агента (logs_enabled, logs_pobp_url) описано в
Получение данных логов.
Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
При установке RabbitMQ из пакета или вручную брокер пишет логи в файл
<RABBITMQ_LOG_BASE>/rabbit@<hostname>.log (по умолчанию
/var/log/rabbitmq/rabbit@<hostname>.log). Каталог можно переопределить
переменной окружения RABBITMQ_LOGS или директивой log.dir в
/etc/rabbitmq/rabbitmq.conf.
Дополните уже существующий /etc/protoobp-agent/conf.d/rabbitmq.d/conf.yaml
(тот же файл, в котором лежит instances: для management API) блоком logs::
logs:
- type: file
path: /var/log/rabbitmq/*.log
source: rabbitmq
service: rabbitmq
log_processing_rules:
- type: multi_line
name: log_start_with_date
pattern: \d{4}-\d{2}-\d{2}
Маска *.log подхватывает основной лог брокера и *_upgrade.log, который
RabbitMQ пишет при миграции схемы между версиями.
Перезапустите агента: systemctl restart protoobp-agent.
Если агент запускается в виде Docker контейнера
Шаг 1 — включите сбор логов в самом агенте через переменные окружения и смонтируйте директорию JSON-логов docker-демона:
services:
protoobp-agent:
environment:
POBP_LOGS_ENABLED: "true"
POBP_LOGS_CONFIG_USE_HTTP: "true"
POBP_LOGS_CONFIG_LOGS_POBP_URL: <protoobp-backend>:<port>
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
# Прямое чтение JSON-лог файлов docker-демона быстрее,
# чем тянуть их через Docker socket API.
- /var/lib/docker/containers:/var/lib/docker/containers:ro
Шаг 2 — добавьте лейбл com.protoobp.ad.logs к контейнеру брокера. Агент
подхватит stdout/stderr контейнера и пометит записи указанными source и
service:
services:
rabbitmq:
labels:
com.protoobp.ad.logs: '[{"source": "rabbitmq", "service": "rabbitmq", "log_processing_rules": [{"type": "multi_line", "name": "log_start_with_date", "pattern": "\\d{4}-\\d{2}-\\d{2}"}]}]'
Только нужные контейнеры
Если в агенте не задана переменнаяPOBP_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true,
агент собирает логи только тех контейнеров, на которых есть лейбл
com.protoobp.ad.logs.Multi-line
Современный RabbitMQ (3.7+ и все варианты rabbitmq:*-management-образа)
пишет записи с префиксом времени в формате
yyyy-MM-dd HH:mm:ss.SSSSSS+TZ [level] <pid> …. Правило log_processing_rules
с type: multi_line склеивает следующие за ней строки (Erlang stack traces,
SASL- и crash-репорты) в одну логическую запись. Без этого правила каждая
строка трейса попадёт в ProtoOBP как отдельная запись.
Если у вас старый брокер (до 3.7) или в rabbitmq.conf явно включён
legacy-формат (log.console.formatter = legacy), записи начинаются не с даты,
а со строки =INFO REPORT==== <дата> ===. В этом случае замените
pattern на = (name: log_start_with_equal_sign).
Проверка
В выводе agent status должен быть раздел Logs Agent со статусом running
и хотя бы один источник rabbitmq с ненулевым BytesRead:
docker exec protoobp-agent agent status \
| sed -n '/^==== Logs Agent ====/,/^====/p'