Мониторинг ActiveMQ с помощью Proto Observability
Сбор метрик 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— сколько сообщения ждали консьюмера.