
# Apache ActiveMQ by JMX

## Overview

This template is designed for the effortless deployment of Apache ActiveMQ monitoring by Zabbix via JMX and doesn't require any external scripts.

## Requirements

Zabbix version: 7.0 and higher.

## Tested versions

This template has been tested on:
- Apache ActiveMQ 5.15.5

## Configuration

> Zabbix should be configured according to the instructions in the [Templates out of the box](https://www.zabbix.com/documentation/7.0/manual/config/templates_out_of_the_box) section.

## Setup

Metrics are collected by JMX.

1. Enable and configure JMX access to Apache ActiveMQ.
 See documentation for [instructions](https://activemq.apache.org/jmx.html).
2. Set values in host macros {$ACTIVEMQ.USERNAME}, {$ACTIVEMQ.PASSWORD} and {$ACTIVEMQ.PORT}.

### Macros used

|Name|Description|Default|
|----|-----------|-------|
|{$ACTIVEMQ.USER}|
User for JMX
|`admin`|
|{$ACTIVEMQ.PASSWORD}|
Password for JMX
|`activemq`|
|{$ACTIVEMQ.PORT}|
Port for JMX
|`1099`|
|{$ACTIVEMQ.LLD.FILTER.BROKER.MATCHES}|
Filter of discoverable discovered brokers
|`.*`|
|{$ACTIVEMQ.LLD.FILTER.BROKER.NOT_MATCHES}|
Filter to exclude discovered brokers
|`CHANGE IF NEEDED`|
|{$ACTIVEMQ.LLD.FILTER.DESTINATION.MATCHES}|
Filter of discoverable discovered destinations
|`.*`|
|{$ACTIVEMQ.LLD.FILTER.DESTINATION.NOT_MATCHES}|
Filter to exclude discovered destinations
|`CHANGE IF NEEDED`|
|{$ACTIVEMQ.MSG.RATE.WARN.TIME}|
The time for message enqueue/dequeue rate. Can be used with destination or broker name as context.
|`15m`|
|{$ACTIVEMQ.MEM.MAX.WARN}|
Memory threshold for AVERAGE trigger. Can be used with destination or broker name as context.
|`75`|
|{$ACTIVEMQ.MEM.MAX.HIGH}|
Memory threshold for HIGH trigger. Can be used with destination or broker name as context.
|`90`|
|{$ACTIVEMQ.MEM.TIME}|
Time during which the metric can be above the threshold. Can be used with destination or broker name as context.
|`5m`|
|{$ACTIVEMQ.STORE.MAX.WARN}|
Storage threshold for AVERAGE trigger. Can be used with broker name as context.
|`75`|
|{$ACTIVEMQ.STORE.TIME}|
Time during which the metric can be above the threshold. Can be used with destination or broker name as context.
|`5m`|
|{$ACTIVEMQ.STORE.MAX.HIGH}|
Storage threshold for HIGH trigger. Can be used with broker name as context.
|`90`|
|{$ACTIVEMQ.TEMP.MAX.WARN}|
Temp threshold for AVERAGE trigger. Can be used with broker name as context.
|`75`|
|{$ACTIVEMQ.TEMP.MAX.HIGH}|
Temp threshold for HIGH trigger. Can be used with broker name as context.
|`90`|
|{$ACTIVEMQ.TEMP.TIME}|
Time during which the metric can be above the threshold. Can be used with destination or broker name as context.
|`5m`|
|{$ACTIVEMQ.DESTINATION.CONSUMERS.MIN.TIME}|
Time during which there may be no consumers in destination. Can be used with destination name as context.
|`10m`|
|{$ACTIVEMQ.DESTINATION.CONSUMERS.MIN.HIGH}|
Minimum amount of consumers for destination. Can be used with destination name as context.
|`1`|
|{$ACTIVEMQ.DESTINATION.PRODUCERS.MIN.TIME}|
Time during which there may be no producers on destination. Can be used with destination name as context.
|`10m`|
|{$ACTIVEMQ.DESTINATION.PRODUCERS.MIN.HIGH}|
Minimum amount of producers for destination. Can be used with destination name as context.
|`1`|
|{$ACTIVEMQ.BROKER.CONSUMERS.MIN.TIME}|
Time during which there may be no consumers on destination. Can be used with broker name as context.
|`5m`|
|{$ACTIVEMQ.BROKER.CONSUMERS.MIN.HIGH}|
Minimum amount of consumers for broker. Can be used with broker name as context.
|`1`|
|{$ACTIVEMQ.BROKER.PRODUCERS.MIN.TIME}|
Time during which there may be no producers on broker. Can be used with broker name as context.
|`5m`|
|{$ACTIVEMQ.BROKER.PRODUCERS.MIN.HIGH}|
Minimum amount of producers for broker. Can be used with broker name as context.
|`1`|
|{$ACTIVEMQ.TOTAL.CONSUMERS.COUNT}|
Attribute for TotalConsumerCount per destination. Used to suppress destination's triggers when the count of consumers on the broker is lower than threshold.
|`TotalConsumerCount`|
|{$ACTIVEMQ.TOTAL.PRODUCERS.COUNT}|
Attribute for TotalProducerCount per destination. Used to suppress destination's triggers when the count of consumers on the broker is lower than threshold.
|`TotalProducerCount`|
|{$ACTIVEMQ.QUEUE.TIME}|
Time during which the QueueSize can be higher than threshold. Can be used with destination name as context.
|`10m`|
|{$ACTIVEMQ.QUEUE.WARN}|
Threshold for QueueSize. Can be used with destination name as context.
|`100`|
|{$ACTIVEMQ.QUEUE.ENABLED}|
Use this to disable alerting for specific destination. 1 = enabled, 0 = disabled. Can be used with destination name as context.
|`1`|
|{$ACTIVEMQ.EXPIRED.WARN}|
Threshold for expired messages count. Can be used with destination name as context.
|`0`|

### LLD rule Brokers discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Brokers discovery|
Discovery of brokers
|JMX agent|jmx.discovery[beans,"org.apache.activemq:type=Broker,brokerName=*"]|

### Item prototypes for Brokers discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Broker {#JMXBROKERNAME}: Version|
The version of the broker.
|JMX agent|jmx[{#JMXOBJ},BrokerVersion]
**Preprocessing**

- 
Discard unchanged with heartbeat: `3h`

|
|Broker {#JMXBROKERNAME}: Uptime|
The uptime of the broker.
|JMX agent|jmx[{#JMXOBJ},UptimeMillis]
**Preprocessing**

- 
Custom multiplier: `0.001`

|
|Broker {#JMXBROKERNAME}: Memory limit|
Memory limit, in bytes, used for holding undelivered messages before paging to temporary storage.
|JMX agent|jmx[{#JMXOBJ},MemoryLimit]
**Preprocessing**

- 
Discard unchanged with heartbeat: `1h`

|
|Broker {#JMXBROKERNAME}: Memory usage in percents|
Percent of memory limit used.
|JMX agent|jmx[{#JMXOBJ}, MemoryPercentUsage]|
|Broker {#JMXBROKERNAME}: Storage limit|
Disk limit, in bytes, used for persistent messages before producers are blocked.
|JMX agent|jmx[{#JMXOBJ},StoreLimit]
**Preprocessing**

- 
Discard unchanged with heartbeat: `1h`

|
|Broker {#JMXBROKERNAME}: Storage usage in percents|
Percent of store limit used.
|JMX agent|jmx[{#JMXOBJ},StorePercentUsage]|
|Broker {#JMXBROKERNAME}: Temp limit|
Disk limit, in bytes, used for non-persistent messages and temporary data before producers are blocked.
|JMX agent|jmx[{#JMXOBJ},TempLimit]
**Preprocessing**

- 
Discard unchanged with heartbeat: `1h`

|
|Broker {#JMXBROKERNAME}: Temp usage in percents|
Percent of temp limit used.
|JMX agent|jmx[{#JMXOBJ},TempPercentUsage]|
|Broker {#JMXBROKERNAME}: Messages enqueue rate|
Rate of messages that have been sent to the broker.
|JMX agent|jmx[{#JMXOBJ},TotalEnqueueCount]
**Preprocessing**

- Change per second
|
|Broker {#JMXBROKERNAME}: Messages dequeue rate|
Rate of messages that have been delivered by the broker and acknowledged by consumers.
|JMX agent|jmx[{#JMXOBJ},TotalDequeueCount]
**Preprocessing**

- Change per second
|
|Broker {#JMXBROKERNAME}: Consumers count total|
Number of consumers attached to this broker.
|JMX agent|jmx[{#JMXOBJ},TotalConsumerCount]|
|Broker {#JMXBROKERNAME}: Producers count total|
Number of producers attached to this broker.
|JMX agent|jmx[{#JMXOBJ},TotalProducerCount]|

### Trigger prototypes for Brokers discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Apache ActiveMQ: Broker {#JMXBROKERNAME}: Version has been changed|
The Broker {#JMXBROKERNAME} version has changed. Acknowledge to close the problem manually.
|`last(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},BrokerVersion],#1)<>last(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},BrokerVersion],#2) and length(last(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},BrokerVersion]))>0`|Info|**Manual close**: Yes|
|Apache ActiveMQ: Broker {#JMXBROKERNAME}: Broker has been restarted|
Uptime is less than 10 minutes.
|`last(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},UptimeMillis])<10m`|Info|**Manual close**: Yes|
|Apache ActiveMQ: Broker {#JMXBROKERNAME}: Memory usage is too high||`min(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ}, MemoryPercentUsage],{$ACTIVEMQ.MEM.TIME:"{#JMXBROKERNAME}"})>{$ACTIVEMQ.MEM.MAX.WARN:"{#JMXBROKERNAME}"}`|Average|**Depends on**:

- Apache ActiveMQ: Broker {#JMXBROKERNAME}: Memory usage is too high
|
|Apache ActiveMQ: Broker {#JMXBROKERNAME}: Memory usage is too high||`min(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ}, MemoryPercentUsage],{$ACTIVEMQ.MEM.TIME:"{#JMXBROKERNAME}"})>{$ACTIVEMQ.MEM.MAX.HIGH:"{#JMXBROKERNAME}"}`|High||
|Apache ActiveMQ: Broker {#JMXBROKERNAME}: Storage usage is too high||`min(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},StorePercentUsage],{$ACTIVEMQ.STORE.TIME:"{#JMXBROKERNAME}"})>{$ACTIVEMQ.STORE.MAX.WARN:"{#JMXBROKERNAME}"}`|Average|**Depends on**:

- Apache ActiveMQ: Broker {#JMXBROKERNAME}: Storage usage is too high
|
|Apache ActiveMQ: Broker {#JMXBROKERNAME}: Storage usage is too high||`min(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},StorePercentUsage],{$ACTIVEMQ.STORE.TIME:"{#JMXBROKERNAME}"})>{$ACTIVEMQ.STORE.MAX.HIGH:"{#JMXBROKERNAME}"}`|High||
|Apache ActiveMQ: Broker {#JMXBROKERNAME}: Temp usage is too high||`min(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},TempPercentUsage],{$ACTIVEMQ.TEMP.TIME:"{#JMXBROKERNAME}"})>{$ACTIVEMQ.TEMP.MAX.WARN}`|Average|**Depends on**:

- Apache ActiveMQ: Broker {#JMXBROKERNAME}: Temp usage is too high
|
|Apache ActiveMQ: Broker {#JMXBROKERNAME}: Temp usage is too high||`min(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},TempPercentUsage],{$ACTIVEMQ.TEMP.TIME:"{#JMXBROKERNAME}"})>{$ACTIVEMQ.TEMP.MAX.HIGH}`|High||
|Apache ActiveMQ: Broker {#JMXBROKERNAME}: Message enqueue rate is higher than dequeue rate|
Enqueue rate is higher than dequeue rate. It may indicate performance problems.
|`avg(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},TotalEnqueueCount],{$ACTIVEMQ.MSG.RATE.WARN.TIME:"{#JMXBROKERNAME}"})>avg(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},TotalEnqueueCount],{$ACTIVEMQ.MSG.RATE.WARN.TIME:"{#JMXBROKERNAME}"})`|Average||
|Apache ActiveMQ: Broker {#JMXBROKERNAME}: Consumers count is too low||`max(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},TotalConsumerCount],{$ACTIVEMQ.BROKER.CONSUMERS.MIN.TIME:"{#JMXBROKERNAME}"})<{$ACTIVEMQ.BROKER.CONSUMERS.MIN.HIGH:"{#JMXBROKERNAME}"}`|High||
|Apache ActiveMQ: Broker {#JMXBROKERNAME}: Producers count is too low||`max(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},TotalProducerCount],{$ACTIVEMQ.BROKER.PRODUCERS.MIN.TIME:"{#JMXBROKERNAME}"})<{$ACTIVEMQ.BROKER.PRODUCERS.MIN.HIGH:"{#JMXBROKERNAME}"}`|High||

### LLD rule Destinations discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Destinations discovery|
Discovery of destinations
|JMX agent|jmx.discovery[beans,"org.apache.activemq:type=Broker,brokerName=*,destinationType=*,destinationName=*"]|

### Item prototypes for Destinations discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Consumers count|
Number of consumers attached to this destination.
|JMX agent|jmx[{#JMXOBJ},ConsumerCount]|
|{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Consumers count total on {#JMXBROKERNAME}|
Number of consumers attached to the broker of this destination. Used to suppress destination's triggers when the count of consumers on the broker is lower than threshold.
|JMX agent|jmx["org.apache.activemq:type=Broker,brokerName={#JMXBROKERNAME}",{$ACTIVEMQ.TOTAL.CONSUMERS.COUNT: "{#JMXDESTINATIONNAME}"}]
**Preprocessing**

- 
In range: `0 -> {$ACTIVEMQ.BROKER.CONSUMERS.MIN.HIGH}`

⛔️Custom on fail: Set value to: `{$ACTIVEMQ.BROKER.CONSUMERS.MIN.HIGH}`

- 
Discard unchanged with heartbeat: `3h`

|
|{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Producers count|
Number of producers attached to this destination.
|JMX agent|jmx[{#JMXOBJ},ProducerCount]|
|{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Producers count total on {#JMXBROKERNAME}|
Number of producers attached to the broker of this destination. Used to suppress destination's triggers when the count of producers on the broker is lower than threshold.
|JMX agent|jmx["org.apache.activemq:type=Broker,brokerName={#JMXBROKERNAME}",{$ACTIVEMQ.TOTAL.PRODUCERS.COUNT: "{#JMXDESTINATIONNAME}"}]
**Preprocessing**

- 
In range: `0 -> {$ACTIVEMQ.BROKER.PRODUCERS.MIN.HIGH}`

⛔️Custom on fail: Set value to: `{$ACTIVEMQ.BROKER.PRODUCERS.MIN.HIGH}`

- 
Discard unchanged with heartbeat: `3h`

|
|{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Memory usage in percents|
The percentage of the memory limit used.
|JMX agent|jmx[{#JMXOBJ},MemoryPercentUsage]|
|{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Messages enqueue rate|
Rate of messages that have been sent to the destination.
|JMX agent|jmx[{#JMXOBJ},EnqueueCount]
**Preprocessing**

- Change per second
|
|{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Messages dequeue rate|
Rate of messages that has been acknowledged (and removed) from the destination.
|JMX agent|jmx[{#JMXOBJ},DequeueCount]
**Preprocessing**

- Change per second
|
|{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Queue size|
Number of messages on this destination, including any that have been dispatched but not acknowledged.
|JMX agent|jmx[{#JMXOBJ},QueueSize]|
|{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Expired messages count|
Number of messages that have been expired.
|JMX agent|jmx[{#JMXOBJ},ExpiredCount]
**Preprocessing**

- 
Discard unchanged with heartbeat: `3h`

|

### Trigger prototypes for Destinations discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|Apache ActiveMQ: {#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Consumers count is too low||`max(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},ConsumerCount],{$ACTIVEMQ.DESTINATION.CONSUMERS.MIN.TIME:"{#JMXDESTINATIONNAME}"})<{$ACTIVEMQ.DESTINATION.CONSUMERS.MIN.HIGH:"{#JMXDESTINATIONNAME}"} and last(/Apache ActiveMQ by JMX/jmx["org.apache.activemq:type=Broker,brokerName={#JMXBROKERNAME}",{$ACTIVEMQ.TOTAL.CONSUMERS.COUNT: "{#JMXDESTINATIONNAME}"}])>{$ACTIVEMQ.BROKER.CONSUMERS.MIN.HIGH:"{#JMXBROKERNAME}"}`|Average|**Manual close**: Yes|
|Apache ActiveMQ: {#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Producers count is too low||`max(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},ProducerCount],{$ACTIVEMQ.DESTINATION.PRODUCERS.MIN.TIME:"{#JMXDESTINATIONNAME}"})<{$ACTIVEMQ.DESTINATION.PRODUCERS.MIN.HIGH:"{#JMXDESTINATIONNAME}"} and last(/Apache ActiveMQ by JMX/jmx["org.apache.activemq:type=Broker,brokerName={#JMXBROKERNAME}",{$ACTIVEMQ.TOTAL.PRODUCERS.COUNT: "{#JMXDESTINATIONNAME}"}])>{$ACTIVEMQ.BROKER.PRODUCERS.MIN.HIGH:"{#JMXBROKERNAME}"}`|Average|**Manual close**: Yes|
|Apache ActiveMQ: {#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Memory usage is too high||`last(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},MemoryPercentUsage])>{$ACTIVEMQ.MEM.MAX.WARN:"{#JMXDESTINATIONNAME}"}`|Average||
|Apache ActiveMQ: {#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Memory usage is too high||`last(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},MemoryPercentUsage])>{$ACTIVEMQ.MEM.MAX.HIGH:"{#JMXDESTINATIONNAME}"}`|High||
|Apache ActiveMQ: {#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Message enqueue rate is higher than dequeue rate|
Enqueue rate is higher than dequeue rate. It may indicate performance problems.
|`avg(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},EnqueueCount],{$ACTIVEMQ.MSG.RATE.WARN.TIME:"{#JMXDESTINATIONNAME}"})>avg(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},DequeueCount],{$ACTIVEMQ.MSG.RATE.WARN.TIME:"{#JMXDESTINATIONNAME}"})`|Average||
|Apache ActiveMQ: {#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Queue size is high|
Queue size is higher than threshold. It may indicate performance problems.
|`min(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},QueueSize],{$ACTIVEMQ.QUEUE.TIME:"{#JMXDESTINATIONNAME}"})>{$ACTIVEMQ.QUEUE.WARN:"{#JMXDESTINATIONNAME}"} and {$ACTIVEMQ.QUEUE.ENABLED:"{#JMXDESTINATIONNAME}"}=1`|Average||
|Apache ActiveMQ: {#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Expired messages count is high|
This metric represents the number of messages that expired before they could be delivered. If you expect all messages to be delivered and acknowledged within a certain amount of time, you can set an expiration for each message, and investigate if your ExpiredCount metric rises above zero.
|`last(/Apache ActiveMQ by JMX/jmx[{#JMXOBJ},ExpiredCount])>{$ACTIVEMQ.EXPIRED.WARN:"{#JMXDESTINATIONNAME}"}`|Average||

## Feedback

Please report any issues with the template at [`https://support.zabbix.com`](https://support.zabbix.com)

You can also provide feedback, discuss the template, or ask for help at [`ZABBIX forums`](https://www.zabbix.com/forum/zabbix-suggestions-and-feedback)

