Мониторинг RabbitMQ с помощью Proto Observability
Сбор метрик 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— утечка клиентских ресурсов.