JMX Data Collection
The JMX collector is used to collect data from java applications using exposed MBeans. For issues with configuring JMX collection, see this page.
An MBean is identified by the combination of a domain and a list of properties. For example, domain= java.lang, and properties type=Memory, identifies the MBean that reports on memory usage of a JVM.
Each MBean exposes one or more attributes that can be queried and collected by name.
An MBean attribute could be:
- A primitive java data type such as int, long, double, or String
- An array of data (‘data’ itself could be a primitive data type, an array of data, a hash of data, and so on)
- A hash of data
LogicMonitor can deal with all the above data types, so long as each attribute is fully specified to result in a primitive data type. However, please note that LogicMonitor does not currently support JMX queries that include a dot/period (i.e. "." ) when they are not part of an array, e.g. an attribute name of rep.Container.
When specifying which JMX objects to collect, you must specify:
- name - used to identify the object
- MBean ObjectName - used to specify the JMX Domain and path of the MBean
- Mbean Attribute - used to specify an attribute to collect.
e.g. a simple case:
If the attribute to be collected is part of a complex object, it can be qualified by use of period separator:
And if necessary, multiple levels of selectors can be specified. For example, to collect the value of the attribute "key1" for the map with index "move" for the MBean with type rrdfs in the LogicMonitor domain:
CompositeData and Map Support
The MBean attribute expression supports CompositeData and Map. For example, the MBeanjava.lang:type=GarbageCollector,name=Copy has an attribute LastGcInfo whose value is a CompositeData (see the figure below).1
To access the value of GcThreadCount, the attribute expression could be "LastGcInfo.GcThreadCount". Same rule could be used if the value is a Map.
The MBean expression supports TabularData. For example, the MBean java.lang:type=GarbageCollector,name=Copy has an attribute LastGcInfo. One of its child values, memoryUsageAfterGc, is a TabularData. The figure below describes its schema and data.1
The table has 2 columns - 'key' and 'value'. The column 'key' is used to index the table (so you can uniquely locate a row by specifying an index value. For instance, key="Code Cache" will return the 1st row). If you want to retrieve the value of the column 'value' of the second row, the expression could be"LastGcInfo.memoryUsageAfterGc.Eden Space.value", where "Eden Space" is the value of the column 'key' to uniquely locate the row, and "value" is the name of the column whose value you want to access.
Sometimes, a TabularData may have multiple index columns. Here is an example (note that this example is faked):
This TabularData has 4 columns. The column "process" and "heap" are index columns. The combination of their value is used to uniquely locate a row. For example, process=Tomcat,heap=Code Cache will return the first row.
To retrieve the value of the column 'committed' of the 3rd row, the expression could be "LastGcInfo.memoryUsageAfterGc.Tomcat,Perm Gen.committed", where 'Tomcat,Perm Gen" are value for index columns (separated by comma), 'committed' is the name of the column you want to access the value.
Array or List Support
The Mbean expression supports array or List. For example, the MBean java.lang:type=GarbageCollector,name=Copy has an attribute MemoryPoolNames whose value is a string array (String, see figure below).
To access the first element of MemoryPoolNames, the expression could be "MemoryPoolNames.0", where "0" is the index to the array (0-based). Same rule is used to access elements in a List.
The jmx collector gets username and password information from the device properties – jmx.user and jmx.pass.