Мониторинг ActiveMQ с помощью Proto Observability
На этой странице:
- Сбор метрик ActiveMQ
- Сбор логов ActiveMQ
Сбор метрик ActiveMQ
Интеграция activemq собирает метрики через JMX и обслуживает оба варианта брокера:
- Apache ActiveMQ Classic (5.x и 6.x) — namespace MBean’ов
org.apache.activemq:*. - Apache ActiveMQ Artemis (2.x) — namespace MBean’ов
org.apache.activemq.artemis:*.
Отдельная интеграция для Artemis не нужна — проверка опрашивает оба namespace в рамках одного instance.
Образ агента для JMX
Если ProtoOBP Агент работает в контейнере (Docker, Kubernetes), используйте образ с суффиксом-jmx, например protoobp-agent:7.40.3-jmx. Без этого
суффикса в образе нет JRE и интеграция падает с ошибкой запуска JMX-проверки.Конфигурация ActiveMQ
JMX Remote должен быть включён и доступен с хоста, на котором работает агент. Настройка зависит от варианта ActiveMQ.
Скрипт bin/env поддерживает переменную окружения ACTIVEMQ_SUNJMX_START
(ACTIVEMQ_SUNJMX_START="${ACTIVEMQ_SUNJMX_START:-}"), её значение полностью
определяет JVM-флаги для JMX. Включите удалённый JMX так:
ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.rmi.port=1099 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.local.only=false \
-Djava.rmi.server.hostname=<имя_хоста_или_контейнера>"
В docker-compose.yaml это пробрасывается через environment::
services:
activemq:
image: apache/activemq-classic:6.1.4
environment:
ACTIVEMQ_SUNJMX_START: >-
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.rmi.port=1099
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=activemq # имя сервиса в docker network
ports:
- "1099:1099"
У Artemis из коробки есть собственный JMX-коннектор на порту 1099, защищённый
правилами etc/management.xml. Простейший способ — поднять рядом стандартный
JVM JMX RMI server на отдельном порту (например, 11099) без аутентификации.
Образ apache/activemq-artemis поддерживает переменную JAVA_ARGS_APPEND —
её значение docker-run.sh дописывает в etc/artemis.profile:
services:
artemis:
image: apache/activemq-artemis:2.31.2
environment:
ARTEMIS_USER: artemis
ARTEMIS_PASSWORD: artemis
JAVA_ARGS_APPEND: >-
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=11099
-Dcom.sun.management.jmxremote.rmi.port=11099
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=artemis
ports:
- "11099:11099"
При установке без Docker те же флаги добавляются в JAVA_ARGS файла
<broker_instance>/etc/artemis.profile.
`java.rmi.server.hostname`
JMX RMI отдаёт клиенту адрес второго сокета через значение
java.rmi.server.hostname. Этот адрес должен резолвиться и быть достижим
из контейнера агента:
- В Docker Compose — указывайте имя сервиса (например,
activemqилиartemis), оно резолвится через embedded DNS docker network. - На хосте — FQDN или адрес интерфейса, на который смотрит агент.
- Не указывайте
0.0.0.0илиlocalhost— это распространённая ошибка, агент получит этот адрес и упадёт сConnection refused.
Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
Создайте файл
/etc/protoobp-agent/conf.d/activemq.d/conf.yaml:init_config: is_jmx: true collect_default_metrics: true instances: - host: localhost port: 1099 # 11099 для Artemis в схеме выше # user: username # если на JMX включена аутентификация # password: password name: activemq_instanceПерезапустите агента:
systemctl restart protoobp-agent.
Если агент запускается в виде Docker контейнера
Добавьте autodiscovery-лейблы к контейнеру брокера. В docker-compose.yaml:
labels:
com.protoobp.ad.check_names: '["activemq"]'
com.protoobp.ad.init_configs: '[{"is_jmx": true, "collect_default_metrics": true}]'
com.protoobp.ad.instances: '[{"host": "%%host%%", "port": "1099", "name": "activemq_instance"}]'
Для Artemis — тот же набор лейблов, но port соответствует порту JMX RMI server’а:
labels:
com.protoobp.ad.check_names: '["activemq"]'
com.protoobp.ad.init_configs: '[{"is_jmx": true, "collect_default_metrics": true}]'
com.protoobp.ad.instances: '[{"host": "%%host%%", "port": "11099", "name": "artemis_instance"}]'
Контейнер агента
Контейнер агента должен находиться в той же docker network, что и брокер, а образ агента — иметь суффикс-jmx. Также агенту нужен смонтированный
/var/run/docker.sock:/var/run/docker.sock:ro для autodiscovery контейнеров.Проверка
Убедитесь, что чек запустился и собирает метрики:
docker exec protoobp-agent agent status | grep -A 8 "^ activemq$"
Ожидаемый вывод — status : OK и metric_count > 0 для каждого instance:
activemq
instance_name : activemq_instance
message : <no value>
metric_count : 46
status : OK
Полный список найденных JMX-атрибутов:
docker exec protoobp-agent agent jmx list collected
Собираемые метрики
Все метрики собираются по JMX и имеют тип gauge — содержат мгновенное
значение на момент сбора. Метрики, имена которых заканчиваются на _count,
не являются кумулятивными счётчиками: интеграция конвертирует их в
rate в секунду на стороне агента.
Лейблы
Общие (на всех метриках)
Добавляются агентом и ProtoOBP backend’ом:
| Лейбл | Значение |
|---|---|
host | Хост, на котором работает агент |
instance | name из instances: конфига чека (activemq_instance и т.п.) |
jmx_domain | org.apache.activemq (Classic) или org.apache.activemq.artemis |
service | Тег service (через com.protoobp.tags.service или POBP_TAGS) |
env | Тег env |
docker_image | Полный ref образа контейнера (например, apache/activemq-classic:6.1.4) |
image_name | Имя образа без тега |
image_tag | Тег образа |
short_image | Короткое имя образа |
Специфичные для ActiveMQ Classic
| Лейбл | Где появляется | Пример |
|---|---|---|
brokerName | broker- и queue-метрики | localhost |
type | broker- и queue-метрики | Broker |
destinationName | queue-метрики (и activemq_broker_memory_pct per-destination) | demo.queue |
destinationType | queue-метрики (и activemq_broker_memory_pct per-destination) | Queue / Topic |
Специфичные для ActiveMQ Artemis
| Лейбл | Где появляется | Пример |
|---|---|---|
broker | все метрики Artemis | 0.0.0.0 |
address | address- и queue-метрики | demo.queue |
component | address- и queue-метрики | addresses |
subcomponent | queue-метрики | queues |
queue | queue-метрики | demo.queue |
routing_type | queue-метрики | anycast / multicast |
Метрики ActiveMQ Classic
Уровень брокера
Несут лейблы brokerName, type. Значения в процентах (0–100).
| Имя метрики | Единица | Описание |
|---|---|---|
activemq_broker_memory_pct | percent | Использование heap-лимита брокера (MemoryPercentUsage) — также собирается per-destination |
activemq_broker_store_pct | percent | Использование persistent message store (StorePercentUsage) |
activemq_broker_temp_pct | percent | Использование temporary store (TempPercentUsage) |
Уровень очереди / топика
Несут лейблы brokerName, destinationName, destinationType, type.
| Имя метрики | Единица | Описание |
|---|---|---|
activemq_queue_size | message | Текущее количество сообщений в очереди |
activemq_queue_consumer_count | consumer | Количество подключённых консьюмеров |
activemq_queue_producer_count | producer | Количество подключённых продюсеров |
activemq_queue_enqueue_count | message/second | Скорость поступления сообщений (rate из EnqueueCount) |
activemq_queue_dequeue_count | message/second | Скорость потребления сообщений (rate из DequeueCount) |
activemq_queue_dispatch_count | message/second | Скорость доставки сообщений консьюмерам (rate из DispatchCount) |
activemq_queue_in_flight_count | message/second | Скорость in-flight (доставлено, но не подтверждено) |
activemq_queue_expired_count | message/second | Скорость истечения TTL у сообщений |
activemq_queue_avg_enqueue_time | millisecond | Среднее время нахождения сообщения в очереди |
activemq_queue_min_enqueue_time | millisecond | Минимальное время нахождения сообщения в очереди |
activemq_queue_max_enqueue_time | millisecond | Максимальное время нахождения сообщения в очереди |
activemq_queue_memory_pct | percent | Использование memory-лимита destination |
Метрики ActiveMQ Artemis
Уровень брокера
Несут лейбл broker.
| Имя метрики | Единица | Описание |
|---|---|---|
activemq_artemis_connection_count | connection | Текущее число открытых клиентских соединений |
activemq_artemis_total_connection_count | connection | Суммарное число соединений, обслуженных брокером |
activemq_artemis_total_consumer_count | consumer | Суммарное число консьюмеров на брокере |
activemq_artemis_total_message_count | message | Суммарное число сообщений во всех очередях брокера |
activemq_artemis_total_messages_added | message/second | Скорость добавления сообщений в очереди по всему брокеру |
activemq_artemis_total_messages_acknowledged | message/second | Скорость подтверждения сообщений по всему брокеру |
activemq_artemis_address_memory_usage | byte | Объём памяти, занятый сообщениями всех адресов |
activemq_artemis_address_memory_usage_pct | percent | Использование global-max-size всеми адресами |
activemq_artemis_disk_store_usage_pct | percent | Использование диска, на котором лежит journal |
activemq_artemis_max_disk_usage | percent | Сконфигурированный порог max-disk-usage (по умолчанию 90) |
Уровень адреса
Несут лейблы broker, address, component=addresses.
| Имя метрики | Единица | Описание |
|---|---|---|
activemq_artemis_address_size | byte | Текущий объём памяти, занятый сообщениями адреса |
activemq_artemis_address_number_of_messages | message | Количество сообщений во всех очередях адреса |
activemq_artemis_address_pages_count | page | Количество page-файлов на диске для адреса |
activemq_artemis_address_bytes_per_page | byte | Размер одного page-файла (по умолчанию 10485760 = 10 MiB) |
activemq_artemis_address_routed_messages | message/second | Скорость сообщений, маршрутизированных в очереди адреса |
activemq_artemis_address_unrouted_messages | message/second | Скорость сообщений, отправленных в адрес без подходящих очередей (потери) |
Уровень очереди
Несут лейблы broker, address, queue, routing_type, component=addresses,
subcomponent=queues.
| Имя метрики | Единица | Описание |
|---|---|---|
activemq_artemis_queue_message_count | message | Сколько сообщений сейчас в очереди |
activemq_artemis_queue_consumer_count | consumer | Количество консьюмеров на очереди |
activemq_artemis_queue_max_consumers | consumer | Лимит консьюмеров (-1 = без ограничений) |
activemq_artemis_queue_messages_added | message/second | Скорость добавления сообщений в очередь |
activemq_artemis_queue_messages_acknowledged | message/second | Скорость подтверждения сообщений из очереди |
activemq_artemis_queue_messages_expired | message/second | Скорость истечения TTL у сообщений в очереди |
activemq_artemis_queue_messages_killed | message/second | Скорость отбраковки сообщений (DLQ / превышение лимита) |
Ключевые метрики для дашбордов и алертов
Доступность брокера
- Отсутствие свежих серий по
instance— алерт: брокер недоступен или JMX отвалился (агент не получает метрики). - Artemis:
activemq_artemis_connection_count == 0при ожидаемом трафике — клиенты отвалились.
Накопление сообщений (backlog)
- Classic:
activemq_queue_sizeperdestinationName— основной SLI. Алерт по абсолютному порогу или производной (рост быстрее N в минуту). - Artemis:
activemq_artemis_queue_message_countperaddress/queue. activemq_queue_consumer_count == 0при ненулевомactivemq_queue_enqueue_count= некому потреблять.
Поток сообщений
- Classic:
activemq_queue_enqueue_count(in) vsactivemq_queue_dequeue_count(out) — рассинхрон → backlog растёт. - Artemis:
activemq_artemis_queue_messages_addedvsactivemq_artemis_queue_messages_acknowledged. activemq_artemis_address_unrouted_messages > 0— алерт: потери при маршрутизации (нет подходящей очереди для адреса).
Качество доставки
activemq_queue_expired_count/activemq_artemis_queue_messages_expired— сообщения теряются по TTL.activemq_queue_in_flight_countстабильно высокий = консьюмеры медленно подтверждают.activemq_artemis_queue_messages_killed > 0— попадание в DLQ или превышение лимита очереди.
Ресурсы брокера
- Classic:
activemq_broker_memory_pct,activemq_broker_store_pct,activemq_broker_temp_pct— алерт при> 80–90 %(флоу-контроль брокера). - Artemis:
activemq_artemis_address_memory_usage_pct,activemq_artemis_disk_store_usage_pct— приближение кmax-disk-usageблокирует приём сообщений. activemq_artemis_address_pages_count— рост = paging активен (память под адрес исчерпана, ушли на диск).
Время в очереди (latency)
- Classic:
activemq_queue_avg_enqueue_time,activemq_queue_max_enqueue_time— сколько сообщения ждали консьюмера.
Сбор логов ActiveMQ
Логи брокера собираются ProtoOBP агентом и отправляются в бэкенд ProtoOBP.
Здесь — только специфичные для ActiveMQ настройки. Включение логов на стороне
агента (logs_enabled, logs_pobp_url) описано в
Получение данных логов.
Конфигурация ProtoOBP агента
Если агент запускается в виде службы на хосте
Дополните уже существующий /etc/protoobp-agent/conf.d/activemq.d/conf.yaml
(тот же файл, в котором лежит instances: для JMX) блоком logs:.
ActiveMQ Classic:
logs:
- type: file
path: <ACTIVEMQ_BASEDIR>/data/activemq.log
source: activemq
service: activemq
log_processing_rules:
- type: multi_line
name: log_start_with_date
pattern: \d{4}-\d{2}-\d{2}
- type: file
path: <ACTIVEMQ_BASEDIR>/data/audit.log
source: activemq
service: activemq
<ACTIVEMQ_BASEDIR> — корень установки брокера (для Classic обычно
/opt/apache-activemq). audit.log создаётся, только если в
conf/log4j2.properties явно включён аудит-логгер; без него этот пункт
можно убрать.
ActiveMQ Artemis:
logs:
- type: file
path: <BROKER_INSTANCE>/log/artemis.log
source: artemis
service: artemis
log_processing_rules:
- type: multi_line
name: log_start_with_date
pattern: \d{4}-\d{2}-\d{2}
<BROKER_INSTANCE> — каталог инстанса Artemis, созданный командой
artemis create.
Перезапустите агента: 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.
ActiveMQ Classic:
services:
activemq:
labels:
com.protoobp.ad.logs: '[{"source": "activemq", "service": "activemq", "log_processing_rules": [{"type": "multi_line", "name": "log_start_with_date", "pattern": "\\d{4}-\\d{2}-\\d{2}"}]}]'
ActiveMQ Artemis:
services:
artemis:
labels:
com.protoobp.ad.logs: '[{"source": "artemis", "service": "artemis", "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
Записи вactivemq.log и artemis.log начинаются с метки времени вида
yyyy-MM-dd HH:mm:ss,SSS …. Правило log_processing_rules с
type: multi_line склеивает следующие за ней строки (Java stack traces) в
одну логическую запись. Без этого правила каждая строка трейса попадёт в
ProtoOBP как отдельная запись.Проверка
В выводе agent status должен быть раздел Logs Agent со статусом running
и хотя бы один источник activemq (или artemis) с ненулевым BytesRead:
docker exec protoobp-agent agent status \
| sed -n '/^==== Logs Agent ====/,/^====/p'