Search code examples
javaloggingjmxjconsole

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?


Solution

  • 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.