Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I programmatically dump JMX data?

I want to be able to log all JMX data accessible via jconsole. Is there a way to do this programmatically? I'm building a form of logging of the system, and I want to create intervaled data viewable with some tool similar to jconsole.

How would I go about doing this?

like image 462
Stefan Kendall Avatar asked Feb 25 '10 17:02

Stefan Kendall


People also ask

What are Jmx MBeans?

An MBean is a managed Java object, similar to a JavaBeans component, that follows the design patterns set forth in the JMX specification. An MBean can represent a device, an application, or any resource that needs to be managed.

What is JMX API?

Java™ Management Extensions (JMX) APIs provide programmatic access to configuration and status information for IBM® Streams objects, such as a domain and its instances, jobs, and resources. You can manage and monitor these objects by using a set of JMX beans.

What is JMX data?

The Java Management Extensions (JMX) API is a standard —developed through the Java Community Process (JCP) as JSR 3—for managing and monitoring applications and services.

How does JMX monitoring work?

JMX Monitoring is done by querying data from “Managed Beans” (MBeans) that are exposed via a JVM port (JMX console). An MBean represents a resource running inside a JVM and provides data on the configuration and usage of that resource.


2 Answers

java.lang.management.ManagementFactory gives you access to JMX data.

i.g.

List<MemoryPoolMXBean> memPoolBeans = ManagementFactory.getMemoryPoolMXBeans();
for (MemoryPoolMXBean mpb : memPoolBeans) {
    System.out.println("Memory Pool: " + mpb.getName());
}

Some samples are available at SO query: [java]+managementfactory

A good read: https://www.ibm.com/developerworks/library/j-jtp09196/index.html

For full implementation connecting to a remote VM:

Map<String,String[]> env = new HashMap<String, String[]>();
env.put( JMXConnector.CREDENTIALS, new String[]{"user","pass"} );
JMXServiceURL address = new JMXServiceURL("service:rmi:///jndi/rmi://host:port/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(address,env);
MBeanServerConnection mbs = connector.getMBeanServerConnection();

//get all mbeans
Set<ObjectInstance> beans = mbs.queryMBeans(null,null);

for( ObjectInstance instance : beans )
{
    MBeanInfo info = mbs.getMBeanInfo( instance.getObjectName() );
}

From the info, you can query object names and attributes as desired.

like image 179
stacker Avatar answered Oct 02 '22 16:10

stacker


I used this command line JMX client as a starting point when I wanted to do the same thing.

like image 35
Mark Avatar answered Oct 02 '22 15:10

Mark