Мониторинг ActiveMQ с помощью Proto Observability

Сбор метрик брокеров, очередей, адресов и потоков сообщений Apache 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.

Конфигурация 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.

Конфигурация ProtoOBP агента

Если агент запускается в виде службы на хосте

  1. Создайте файл /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
    
  2. Перезапустите агента: 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 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_size per destinationName — основной SLI. Алерт по абсолютному порогу или производной (рост быстрее N в минуту).
  • Artemis: activemq_artemis_queue_message_count per address/queue.
  • activemq_queue_consumer_count == 0 при ненулевом activemq_queue_enqueue_count = некому потреблять.

Поток сообщений

  • Classic: activemq_queue_enqueue_count (in) vs activemq_queue_dequeue_count (out) — рассинхрон → backlog растёт.
  • Artemis: activemq_artemis_queue_messages_added vs activemq_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 — сколько сообщения ждали консьюмера.