
# WildFly Server by JMX

## Overview

Official JMX Template for WildFly server.


## Requirements

Zabbix version: 7.0 and higher.

## Tested versions

This template has been tested on:
- WildFly 22.6.0 

## 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.
This template works with standalone and domain instances.

1. Enable and configure JMX access to WildFly. See documentation for [instructions](https://docs.wildfly.org/23/Admin_Guide.html#JMX).
2. Copy jboss-client.jar from `/(wildfly,EAP,Jboss,AS)/bin/client` in to directory `/usr/share/zabbix-java-gateway/lib`
3. Restart Zabbix Java gateway
4. Set the user name and password in host macros {$WILDFLY.USER} and {$WILDFLY.PASSWORD}.
Depending on your server setup, you may need to specify a custom JMX scheme in macro {$WILDFLY.JMX.PROTOCOL} (default: remote+http)


### Macros used

|Name|Description|Default|
|----|-----------|-------|
|{$WILDFLY.USER}||`zabbix`|
|{$WILDFLY.PASSWORD}||`zabbix`|
|{$WILDFLY.JMX.PROTOCOL}||`remote+http`|
|{$WILDFLY.DEPLOYMENT.MATCHES}|
Filter of discoverable deployments
|`.*`|
|{$WILDFLY.DEPLOYMENT.NOT_MATCHES}|
Filter to exclude discovered deployments
|`CHANGE_IF_NEEDED`|
|{$WILDFLY.CONN.USAGE.WARN.MAX}|
The maximum connection usage percent for trigger expression.
|`80`|
|{$WILDFLY.CONN.WAIT.MAX.WARN}|
The maximum number of waiting connections for trigger expression.
|`300`|

### Items

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Launch type|
The manner in which the server process was launched. Either "DOMAIN" for a domain mode server launched by a Host Controller, "STANDALONE" for a standalone server launched from the command line, or "EMBEDDED" for a standalone server launched as an embedded part of an application running in the same virtual machine.
|JMX agent|jmx["jboss.as:management-root=server","launchType"]
**Preprocessing**

- 
Discard unchanged with heartbeat: `3h`

|
|Name|
For standalone mode: The name of this server. If not set, defaults to the runtime value of InetAddress.getLocalHost().getHostName().

For domain mode: The name given to this domain.
|JMX agent|jmx["jboss.as:management-root=server","name"]
**Preprocessing**

- 
Discard unchanged with heartbeat: `3h`

|
|Process type|
The type of process represented by this root resource.
|JMX agent|jmx["jboss.as:management-root=server","processType"]
**Preprocessing**

- 
Discard unchanged with heartbeat: `3h`

|
|Runtime configuration state|
The current persistent configuration state, one of starting, ok, reload-required, restart-required, stopping or stopped.
|JMX agent|jmx["jboss.as:management-root=server","runtimeConfigurationState"]
**Preprocessing**

- 
Discard unchanged with heartbeat: `3h`

|
|Server controller state|
The current state of the server controller; either STARTING, RUNNING, RESTART_REQUIRED, RELOAD_REQUIRED or STOPPING.
|JMX agent|jmx["jboss.as:management-root=server","serverState"]
**Preprocessing**

- 
Discard unchanged with heartbeat: `3h`

|
|Version|
The version of the WildFly Core based product release.
|JMX agent|jmx["jboss.as:management-root=server","productVersion"]
**Preprocessing**

- 
Discard unchanged with heartbeat: `3h`

|
|Uptime|
WildFly server uptime.
|JMX agent|jmx["java.lang:type=Runtime","Uptime"]
**Preprocessing**

- 
Custom multiplier: `0.001`

|
|Transactions: Total, rate|
The total number of transactions (top-level and nested) created per second.
|JMX agent|jmx["jboss.as:subsystem=transactions","numberOfTransactions"]
**Preprocessing**

- Change per second
|
|Transactions: Aborted, rate|
The number of aborted (i.e. rolledback) transactions per second.
|JMX agent|jmx["jboss.as:subsystem=transactions","numberOfAbortedTransactions"]
**Preprocessing**

- Change per second
|
|Transactions: Application rollbacks, rate|
The number of transactions that have been rolled back by application request. This includes those that timeout, since the timeout behavior is considered an attribute of the application configuration.
|JMX agent|jmx["jboss.as:subsystem=transactions","numberOfApplicationRollbacks"]
**Preprocessing**

- Change per second
|
|Transactions: Committed, rate|
The number of committed transactions.
|JMX agent|jmx["jboss.as:subsystem=transactions","numberOfCommittedTransactions"]
**Preprocessing**

- Change per second
|
|Transactions: Heuristics, rate|
The number of transactions which have terminated with heuristic outcomes.
|JMX agent|jmx["jboss.as:subsystem=transactions","numberOfHeuristics"]
**Preprocessing**

- Change per second
|
|Transactions: Current|
The number of transactions that have begun but not yet terminated.
|JMX agent|jmx["jboss.as:subsystem=transactions","numberOfInflightTransactions"]|
|Transactions: Nested, rate|
The total number of nested (sub) transactions created.
|JMX agent|jmx["jboss.as:subsystem=transactions","numberOfNestedTransactions"]
**Preprocessing**

- Change per second
|
|Transactions: ResourceRollbacks, rate|
The number of transactions that rolled back due to resource (participant) failure.
|JMX agent|jmx["jboss.as:subsystem=transactions","numberOfResourceRollbacks"]
**Preprocessing**

- Change per second
|
|Transactions: System rollbacks, rate|
The number of transactions that have been rolled back due to internal system errors.
|JMX agent|jmx["jboss.as:subsystem=transactions","numberOfSystemRollbacks"]
**Preprocessing**

- Change per second
|
|Transactions: Timed out, rate|
The number of transactions that have rolled back due to timeout.
|JMX agent|jmx["jboss.as:subsystem=transactions","numberOfTimedOutTransactions"]
**Preprocessing**

- Change per second
|

### Triggers

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|WildFly Server: Server needs to restart for configuration change.||`find(/WildFly Server by JMX/jmx["jboss.as:management-root=server","runtimeConfigurationState"],,"like","ok")=0`|Warning||
|WildFly Server: Server controller is not in RUNNING state||`find(/WildFly Server by JMX/jmx["jboss.as:management-root=server","serverState"],,"like","running")=0`|Warning|**Depends on**:

- WildFly Server: Server needs to restart for configuration change.
|
|WildFly Server: Version has changed|
WildFly version has changed. Acknowledge to close the problem manually.
|`last(/WildFly Server by JMX/jmx["jboss.as:management-root=server","productVersion"],#1)<>last(/WildFly Server by JMX/jmx["jboss.as:management-root=server","productVersion"],#2) and length(last(/WildFly Server by JMX/jmx["jboss.as:management-root=server","productVersion"]))>0`|Info|**Manual close**: Yes|
|WildFly Server: Host has been restarted|
Uptime is less than 10 minutes.
|`last(/WildFly Server by JMX/jmx["java.lang:type=Runtime","Uptime"])<10m`|Info|**Manual close**: Yes|
|WildFly Server: Failed to fetch info data|
Zabbix has not received data for items for the last 15 minutes
|`nodata(/WildFly Server by JMX/jmx["java.lang:type=Runtime","Uptime"],15m)=1`|Warning||

### LLD rule Deployments discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Deployments discovery|
Discovery deployments metrics.
|JMX agent|jmx.get[beans,"jboss.as.expr:deployment=*"]|

### Item prototypes for Deployments discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Deployment [{#DEPLOYMENT}]: Status|
The current runtime status of a deployment.

Possible status modes are OK, FAILED, and STOPPED.

FAILED indicates a dependency is missing or a service could not start.

STOPPED indicates that the deployment was not enabled or was manually stopped.
|JMX agent|jmx["{#JMXOBJ}",status]
**Preprocessing**

- 
Discard unchanged with heartbeat: `3h`

|
|Deployment [{#DEPLOYMENT}]: Enabled|
Boolean indicating whether the deployment content is currently deployed in the runtime (or should be deployed in the runtime the next time the server starts).
|JMX agent|jmx["{#JMXOBJ}",enabled]
**Preprocessing**

- Boolean to decimal
- 
Discard unchanged with heartbeat: `3h`

|
|Deployment [{#DEPLOYMENT}]: Managed|
Indicates if the deployment is managed (aka uses the ContentRepository).
|JMX agent|jmx["{#JMXOBJ}",managed]
**Preprocessing**

- Boolean to decimal
- 
Discard unchanged with heartbeat: `3h`

|
|Deployment [{#DEPLOYMENT}]: Persistent|
Indicates if the deployment is managed (aka uses the ContentRepository).
|JMX agent|jmx["{#JMXOBJ}",persistent]
**Preprocessing**

- Boolean to decimal
- 
Discard unchanged with heartbeat: `3h`

|
|Deployment [{#DEPLOYMENT}]: Enabled time|
Indicates if the deployment is managed (aka uses the ContentRepository).
|JMX agent|jmx["{#JMXOBJ}",enabledTime]
**Preprocessing**

- 
Custom multiplier: `0.001`

- 
Discard unchanged with heartbeat: `3h`

|

### Trigger prototypes for Deployments discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|WildFly Server: Deployment [{#DEPLOYMENT}]: Deployment status has changed|
Deployment status has changed. Acknowledge to close the problem manually.
|`last(/WildFly Server by JMX/jmx["{#JMXOBJ}",status],#1)<>last(/WildFly Server by JMX/jmx["{#JMXOBJ}",status],#2) and length(last(/WildFly Server by JMX/jmx["{#JMXOBJ}",status]))>0`|Warning|**Manual close**: Yes|

### LLD rule JDBC metrics discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|JDBC metrics discovery||JMX agent|jmx.get[beans,"jboss.as:subsystem=datasources,data-source=*,statistics=jdbc"]|

### Item prototypes for JDBC metrics discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|{#JMX_DATA_SOURCE}: Cache access, rate|
The number of times that the statement cache was accessed  per second.
|JMX agent|jmx["{#JMXOBJ}",PreparedStatementCacheAccessCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: Cache add, rate|
The number of statements added to the statement cache per second.
|JMX agent|jmx["{#JMXOBJ}",PreparedStatementCacheAddCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: Cache current size|
The number of prepared and callable statements currently cached in the statement cache.
|JMX agent|jmx["{#JMXOBJ}",PreparedStatementCacheCurrentSize]|
|{#JMX_DATA_SOURCE}: Cache delete, rate|
The number of statements discarded from the cache per second.
|JMX agent|jmx["{#JMXOBJ}",PreparedStatementCacheDeleteCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: Cache hit, rate|
The number of times that statements from the cache were used per second.
|JMX agent|jmx["{#JMXOBJ}",PreparedStatementCacheHitCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: Cache miss, rate|
The number of times that a statement request could not be satisfied with a statement from the cache per second.
|JMX agent|jmx["{#JMXOBJ}",PreparedStatementCacheMissCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: Statistics enabled|
Define whether runtime statistics are enabled or not.
|JMX agent|jmx["{#JMXOBJ}",statisticsEnabled, "JDBC"]
**Preprocessing**

- Boolean to decimal
- 
Discard unchanged with heartbeat: `3h`

|

### Trigger prototypes for JDBC metrics discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|WildFly Server: {#JMX_DATA_SOURCE}: JDBC monitoring statistic is not enabled||`last(/WildFly Server by JMX/jmx["{#JMXOBJ}",statisticsEnabled, "JDBC"])=0`|Info||

### LLD rule Pools metrics discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Pools metrics discovery||JMX agent|jmx.get[beans,"jboss.as:subsystem=datasources,data-source=*,statistics=pool"]|

### Item prototypes for Pools metrics discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|{#JMX_DATA_SOURCE}: Connections: Active|
The number of open connections.
|JMX agent|jmx["{#JMXOBJ}",ActiveCount]|
|{#JMX_DATA_SOURCE}: Connections: Available|
The available count.
|JMX agent|jmx["{#JMXOBJ}",AvailableCount]|
|{#JMX_DATA_SOURCE}: Blocking time, avg|
Average Blocking Time for pool.
|JMX agent|jmx["{#JMXOBJ}",AverageBlockingTime]|
|{#JMX_DATA_SOURCE}: Connections: Creating time, avg|
The average time spent creating a physical connection.
|JMX agent|jmx["{#JMXOBJ}",AverageCreationTime]|
|{#JMX_DATA_SOURCE}: Connections: Get time, avg|
The average time spent obtaining a physical connection.
|JMX agent|jmx["{#JMXOBJ}",AverageGetTime]|
|{#JMX_DATA_SOURCE}: Connections: Pool time, avg|
The average time for a physical connection spent in the pool.
|JMX agent|jmx["{#JMXOBJ}",AveragePoolTime]|
|{#JMX_DATA_SOURCE}: Connections: Usage time, avg|
The average time spent using a physical connection
|JMX agent|jmx["{#JMXOBJ}",AverageUsageTime]|
|{#JMX_DATA_SOURCE}: Connections: Blocking failure, rate|
The number of failures trying to obtain a physical connection per second.
|JMX agent|jmx["{#JMXOBJ}",BlockingFailureCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: Connections: Created, rate|
The created per second
|JMX agent|jmx["{#JMXOBJ}",CreatedCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: Connections: Destroyed, rate|
The destroyed count.
|JMX agent|jmx["{#JMXOBJ}",DestroyedCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: Connections: Idle|
The number of physical connections currently idle.
|JMX agent|jmx["{#JMXOBJ}",IdleCount]|
|{#JMX_DATA_SOURCE}: Connections: In use|
The number of physical connections currently in use.
|JMX agent|jmx["{#JMXOBJ}",InUseCount]|
|{#JMX_DATA_SOURCE}: Connections: Used, max|
The maximum number of connections used.
|JMX agent|jmx["{#JMXOBJ}",MaxUsedCount]|
|{#JMX_DATA_SOURCE}: Statistics enabled|
Define whether runtime statistics are enabled or not.
|JMX agent|jmx["{#JMXOBJ}",statisticsEnabled]
**Preprocessing**

- Boolean to decimal
- 
Discard unchanged with heartbeat: `3h`

|
|{#JMX_DATA_SOURCE}: Connections: Timed out, rate|
The timed out connections per second.
|JMX agent|jmx["{#JMXOBJ}",TimedOut]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: Connections: Wait|
The number of requests that had to wait to obtain a physical connection.
|JMX agent|jmx["{#JMXOBJ}",WaitCount]|
|{#JMX_DATA_SOURCE}: XA: Commit time, avg|
The average time for a XAResource commit invocation.
|JMX agent|jmx["{#JMXOBJ}",XACommitAverageTime]|
|{#JMX_DATA_SOURCE}: XA: Commit, rate|
The number of XAResource commit invocations per second.
|JMX agent|jmx["{#JMXOBJ}",XACommitCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: XA: End time, avg|
The average time for a XAResource end invocation.
|JMX agent|jmx["{#JMXOBJ}",XAEndAverageTime]|
|{#JMX_DATA_SOURCE}: XA: End, rate|
The number of XAResource end invocations per second.
|JMX agent|jmx["{#JMXOBJ}",XAEndCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: XA: Forget time, avg|
The average time for a XAResource forget invocation.
|JMX agent|jmx["{#JMXOBJ}",XAForgetAverageTime]|
|{#JMX_DATA_SOURCE}: XA: Forget, rate|
The number of XAResource forget invocations per second.
|JMX agent|jmx["{#JMXOBJ}",XAForgetCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: XA: Prepare time, avg|
The average time for a XAResource prepare invocation.
|JMX agent|jmx["{#JMXOBJ}",XAPrepareAverageTime]|
|{#JMX_DATA_SOURCE}: XA: Prepare, rate|
The number of XAResource prepare invocations per second.
|JMX agent|jmx["{#JMXOBJ}",XAPrepareCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: XA: Recover time, avg|
The average time for a XAResource recover invocation.
|JMX agent|jmx["{#JMXOBJ}",XARecoverAverageTime]|
|{#JMX_DATA_SOURCE}: XA: Recover, rate|
The number of XAResource recover invocations per second.
|JMX agent|jmx["{#JMXOBJ}",XARecoverCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: XA: Rollback time, avg|
The average time for a XAResource rollback invocation.
|JMX agent|jmx["{#JMXOBJ}",XARollbackAverageTime]|
|{#JMX_DATA_SOURCE}: XA: Rollback, rate|
The number of XAResource rollback invocations per second.
|JMX agent|jmx["{#JMXOBJ}",XARollbackCount]
**Preprocessing**

- Change per second
|
|{#JMX_DATA_SOURCE}: XA: Start time, avg|
The average time for a XAResource start invocation.
|JMX agent|jmx["{#JMXOBJ}",XAStartAverageTime]|
|{#JMX_DATA_SOURCE}: XA: Start rate|
The number of XAResource start invocations per second.
|JMX agent|jmx["{#JMXOBJ}",XAStartCount]
**Preprocessing**

- Change per second
|

### Trigger prototypes for Pools metrics discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|WildFly Server: {#JMX_DATA_SOURCE}: There are no active connections for 5m||`max(/WildFly Server by JMX/jmx["{#JMXOBJ}",ActiveCount],5m)=0`|Warning||
|WildFly Server: {#JMX_DATA_SOURCE}: Connection usage is too high||`min(/WildFly Server by JMX/jmx["{#JMXOBJ}",InUseCount],5m)/last(/WildFly Server by JMX/jmx["{#JMXOBJ}",AvailableCount])*100>{$WILDFLY.CONN.USAGE.WARN.MAX}`|High||
|WildFly Server: {#JMX_DATA_SOURCE}: Pools monitoring statistic is not enabled|
Zabbix has not received data for items for the last 15 minutes
|`last(/WildFly Server by JMX/jmx["{#JMXOBJ}",statisticsEnabled])=0`|Info||
|WildFly Server: {#JMX_DATA_SOURCE}: There are timeout connections||`last(/WildFly Server by JMX/jmx["{#JMXOBJ}",TimedOut])>0`|Warning||
|WildFly Server: {#JMX_DATA_SOURCE}: Too many waiting connections||`min(/WildFly Server by JMX/jmx["{#JMXOBJ}",WaitCount],5m)>{$WILDFLY.CONN.WAIT.MAX.WARN}`|Warning||

### LLD rule Undertow metrics discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Undertow metrics discovery||JMX agent|jmx.get[beans,"jboss.as:subsystem=undertow,server=*,http-listener=*"]|

### Item prototypes for Undertow metrics discovery

|Name|Description|Type|Key and additional info|
|----|-----------|----|-----------------------|
|Listener {#HTTP_LISTENER}: Errors, rate|
The number of 500 responses that have been sent by this listener per second.
|JMX agent|jmx["{#JMXOBJ}",errorCount]
**Preprocessing**

- Change per second
|
|Listener {#HTTP_LISTENER}: Requests, rate|
The number of requests this listener has served per second.
|JMX agent|jmx["{#JMXOBJ}",requestCount]
**Preprocessing**

- Change per second
|
|Listener {#HTTP_LISTENER}: Bytes sent, rate|
The number of bytes that have been sent out on this listener per second.
|JMX agent|jmx["{#JMXOBJ}",bytesSent]
**Preprocessing**

- Change per second
|
|Listener {#HTTP_LISTENER}: Bytes received, rate|
The number of bytes that have been received by this listener per second.
|JMX agent|jmx["{#JMXOBJ}",bytesReceived]
**Preprocessing**

- Change per second
|

### Trigger prototypes for Undertow metrics discovery

|Name|Description|Expression|Severity|Dependencies and additional info|
|----|-----------|----------|--------|--------------------------------|
|WildFly Server: Listener {#HTTP_LISTENER}: There are 500 responses by this listener.||`last(/WildFly Server by JMX/jmx["{#JMXOBJ}",errorCount])>0`|Warning||

## 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)

