Skip to content

ActiveMQ Monitoring with JMX Exporter, Prometheus, and Grafana

Overview

This guide explains how to monitor ActiveMQ using JMX Exporter in standalone mode, with metrics collected by Prometheus and visualized in Grafana. It also includes an alert rule for detecting stalled queues.


1. Prepare JMX Exporter on the ActiveMQ Host

1.1 Create the Exporter Directory

sudo mkdir -p /opt/monitoring/activemq-exporter
sudo chown qcuser:qcuser /opt/monitoring/activemq-exporter
cd /opt/monitoring/activemq-exporter

1.2 Download the Standalone JMX Exporter

curl -Lo jmx_exporter_standalone.jar \
https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_httpserver/0.20.0/jmx_prometheus_httpserver-0.20.0.jar

1.3 Create the Configuration File config.yml

startDelaySeconds: 0
jmxUrl: service:jmx:rmi:///jndi/rmi://127.0.0.1:1099/jmxrmi
username: amqusername
password: amqpasswd
lowercaseOutputName: true
lowercaseOutputLabelNames: true

1.4 Create docker-compose.yml

version: '3.8'
services:
  activemq-exporter:
    image: openjdk:17-slim
    container_name: activemq-exporter
    network_mode: host
    volumes:
      - ./config.yml:/config.yml:ro
      - ./jmx_exporter_standalone.jar:/exporter.jar:ro
    command:
      - sh
      - -c
      - |
        java -jar /exporter.jar 9404 /config.yml
    restart: unless-stopped

1.5 Deploy via Portainer or docker-compose up -d


2. Verify Metrics

curl http://localhost:9404/metrics

Make sure you see metrics like:

org_apache_activemq_broker_enqueuecounter{...}
org_apache_activemq_broker_dequeuecounter{...}

3. Configure Prometheus

3.1 Add Scrape Job in prometheus.yml

scrape_configs:
  - job_name: 'activemq'
    static_configs:
      - targets: ['mgewtest:9404']  # Replace with actual exporter IP

3.2 Reload Prometheus


4. Visualize in Grafana

4.1 Create Grafana Dashboard

4.2 Custom Stat Panels

Enqueued Messages

sum(org_apache_activemq_broker_enqueuecounter{destinationname="updatecache"})

Dequeued Messages

sum(org_apache_activemq_broker_dequeuecounter{destinationname="updatecache"})

Current Queue Size

sum(org_apache_activemq_broker_enqueuecounter{destinationname="updatecache"}) - \
sum(org_apache_activemq_broker_dequeuecounter{destinationname="updatecache"})

5. Alert on Stuck Queue

5.1 Create activemq_alerts.yml for prometheus

groups:
  - name: activemq.rules
    rules:
      - alert: QueueStuck
        expr: |
          (
            sum(org_apache_activemq_broker_enqueuecounter{destinationname="updatecache"}) -
            sum(org_apache_activemq_broker_dequeuecounter{destinationname="updatecache"})
          ) > 0
          and
          increase(org_apache_activemq_broker_dequeuecounter{destinationname="updatecache"}[10m]) == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Queue 'updatecache' stuck"
          description: "Queue has messages but no dequeue activity for 10+ minutes"

5.2 Include Rule File in prometheus.yml

rule_files:
  - "rules/activemq_alerts.yml"

5.3 Reload Prometheus


✅ Done

You now have full monitoring of ActiveMQ:

  • JMX metrics exposed and collected
  • Grafana visualizations
  • Alert on message pile-up

Changelog

Date Author Message
2026-02-25 aresnikowa Merge remote-tracking branch 'origin/master'