Мониторинг 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Хост, на котором работает агент
instancename из instances: конфига чека (activemq_instance и т.п.)
jmx_domainorg.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
ЛейблГде появляетсяПример
brokerNamebroker- и queue-метрикиlocalhost
typebroker- и queue-метрикиBroker
destinationNamequeue-метрики (и activemq_broker_memory_pct per-destination)demo.queue
destinationTypequeue-метрики (и activemq_broker_memory_pct per-destination)Queue / Topic
Специфичные для ActiveMQ Artemis
ЛейблГде появляетсяПример
brokerвсе метрики Artemis0.0.0.0
addressaddress- и queue-метрикиdemo.queue
componentaddress- и queue-метрикиaddresses
subcomponentqueue-метрикиqueues
queuequeue-метрикиdemo.queue
routing_typequeue-метрикиanycast / multicast

Метрики ActiveMQ Classic

Уровень брокера

Несут лейблы brokerName, type. Значения в процентах (0–100).

Имя метрикиЕдиницаОписание
activemq_broker_memory_pctpercentИспользование heap-лимита брокера (MemoryPercentUsage) — также собирается per-destination
activemq_broker_store_pctpercentИспользование persistent message store (StorePercentUsage)
activemq_broker_temp_pctpercentИспользование temporary store (TempPercentUsage)
Уровень очереди / топика

Несут лейблы brokerName, destinationName, destinationType, type.

Имя метрикиЕдиницаОписание
activemq_queue_sizemessageТекущее количество сообщений в очереди
activemq_queue_consumer_countconsumerКоличество подключённых консьюмеров
activemq_queue_producer_countproducerКоличество подключённых продюсеров
activemq_queue_enqueue_countmessage/secondСкорость поступления сообщений (rate из EnqueueCount)
activemq_queue_dequeue_countmessage/secondСкорость потребления сообщений (rate из DequeueCount)
activemq_queue_dispatch_countmessage/secondСкорость доставки сообщений консьюмерам (rate из DispatchCount)
activemq_queue_in_flight_countmessage/secondСкорость in-flight (доставлено, но не подтверждено)
activemq_queue_expired_countmessage/secondСкорость истечения TTL у сообщений
activemq_queue_avg_enqueue_timemillisecondСреднее время нахождения сообщения в очереди
activemq_queue_min_enqueue_timemillisecondМинимальное время нахождения сообщения в очереди
activemq_queue_max_enqueue_timemillisecondМаксимальное время нахождения сообщения в очереди
activemq_queue_memory_pctpercentИспользование memory-лимита destination

Метрики ActiveMQ Artemis

Уровень брокера

Несут лейбл broker.

Имя метрикиЕдиницаОписание
activemq_artemis_connection_countconnectionТекущее число открытых клиентских соединений
activemq_artemis_total_connection_countconnectionСуммарное число соединений, обслуженных брокером
activemq_artemis_total_consumer_countconsumerСуммарное число консьюмеров на брокере
activemq_artemis_total_message_countmessageСуммарное число сообщений во всех очередях брокера
activemq_artemis_total_messages_addedmessage/secondСкорость добавления сообщений в очереди по всему брокеру
activemq_artemis_total_messages_acknowledgedmessage/secondСкорость подтверждения сообщений по всему брокеру
activemq_artemis_address_memory_usagebyteОбъём памяти, занятый сообщениями всех адресов
activemq_artemis_address_memory_usage_pctpercentИспользование global-max-size всеми адресами
activemq_artemis_disk_store_usage_pctpercentИспользование диска, на котором лежит journal
activemq_artemis_max_disk_usagepercentСконфигурированный порог max-disk-usage (по умолчанию 90)
Уровень адреса

Несут лейблы broker, address, component=addresses.

Имя метрикиЕдиницаОписание
activemq_artemis_address_sizebyteТекущий объём памяти, занятый сообщениями адреса
activemq_artemis_address_number_of_messagesmessageКоличество сообщений во всех очередях адреса
activemq_artemis_address_pages_countpageКоличество page-файлов на диске для адреса
activemq_artemis_address_bytes_per_pagebyteРазмер одного page-файла (по умолчанию 10485760 = 10 MiB)
activemq_artemis_address_routed_messagesmessage/secondСкорость сообщений, маршрутизированных в очереди адреса
activemq_artemis_address_unrouted_messagesmessage/secondСкорость сообщений, отправленных в адрес без подходящих очередей (потери)
Уровень очереди

Несут лейблы broker, address, queue, routing_type, component=addresses, subcomponent=queues.

Имя метрикиЕдиницаОписание
activemq_artemis_queue_message_countmessageСколько сообщений сейчас в очереди
activemq_artemis_queue_consumer_countconsumerКоличество консьюмеров на очереди
activemq_artemis_queue_max_consumersconsumerЛимит консьюмеров (-1 = без ограничений)
activemq_artemis_queue_messages_addedmessage/secondСкорость добавления сообщений в очередь
activemq_artemis_queue_messages_acknowledgedmessage/secondСкорость подтверждения сообщений из очереди
activemq_artemis_queue_messages_expiredmessage/secondСкорость истечения TTL у сообщений в очереди
activemq_artemis_queue_messages_killedmessage/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 — сколько сообщения ждали консьюмера.

Сбор логов 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}"}]}]'

Проверка

В выводе agent status должен быть раздел Logs Agent со статусом running и хотя бы один источник activemq (или artemis) с ненулевым BytesRead:

docker exec protoobp-agent agent status \
  | sed -n '/^==== Logs Agent ====/,/^====/p'