+

Search Tips   |   Advanced Search

Use the JMX interface to develop your own monitoring application


Use AdminClient API to get Performance Monitoring Infrastructure (PMI) data by using either PerfMBean or individual MBeans.

We can invoke methods on MBeans through the AdminClient Java Management Extension (JMX) interface. Use AdminClient API to get Performance Monitoring Infrastructure (PMI) data by using either PerfMBean or individual MBeans. See information about using individual MBeans at bottom of this article.

Individual MBeans provide the Stats attribute from which we can get PMI data. The PerfMBean provides extended methods for PMI administration and more efficient ways to access PMI data. To set the PMI module instrumentation level, invoke methods on PerfMBean. To query PMI data from multiple MBeans, it is faster to invoke the getStatsArray method in PerfMBean than to get the Stats attribute from multiple individual MBeans. Perf MBean can provide PMI data from multiple MBeans using a single JMX call, but multiple JMX calls have to be made through individual MBeans.

See the topic "Developing an admin client program" for more information on AdminClient JMX.

After the performance monitoring service is enabled and the application server is started or restarted, a PerfMBean is located in each application server giving access to PMI data. To use PerfMBean:

 

  1. Create an instance of AdminClient. When using AdminClient API, we need to first create an instance of AdminClient by passing the host name, port number and connector type. The example code is:

            AdminClient ac = null;
            java.util.Properties props = new java.util.Properties();
            props.put(AdminClient.CONNECTOR_TYPE, connector);
            props.put(AdminClient.CONNECTOR_HOST, host);
            props.put(AdminClient.CONNECTOR_PORT, port);
            try {
                ac = AdminClientFactory.createAdminClient(props);
            }
            catch(Exception ex) {
                failed = true;
                new AdminException(ex).printStackTrace();
                System.out.println("getAdminClient: exception");
            }
    
    

  2. Use AdminClient to query the MBean ObjectNames Once you get the AdminClient instance, we can call queryNames to get a list of MBean ObjectNames depending on the query string. To get all the ObjectNames, we can use the following example code. If we have a specified query string, you will get a subset of ObjectNames.

    javax.management.ObjectName on = new javax.management.ObjectName("WebSphere:*");
         Set objectNameSet= ac.queryNames(on, null);
      
    // we can check properties like type, name, and process to find a specified ObjectName      
    

    After you get all the ObjectNames, we can use the following example code to get all the node names:

        HashSet nodeSet = new HashSet();
             for(Iterator i = objectNameSet.iterator(); i.hasNext(); on =  (ObjectName)i.next()) {
                String type = on.getKeyProperty("type");
                if(type != null && type.equals("Server")) {
        nodeSet.add(servers[i].getKeyProperty("node"));
                }
      }
      
    

    Note, this will only return nodes that are started. To list running servers on the node, we can either check the node name and type for all the ObjectNames or use the following example code:

         StringBuffer oNameQuery= new StringBuffer(41);
            oNameQuery.append("WebSphere:*");
            oNameQuery.append(",type=").append("Server");
            oNameQuery.append(",node=").append(mynode);
    
            oSet= ac.queryNames(new ObjectName(oNameQuery.toString()), null);
             Iterator i = objectNameSet.iterator ();
            while (i.hasNext ()) {
            on=(objectName) i.next();
          String process= on[i].getKeyProperty("process");
          serversArrayList.add(process);
        }
      
    

  3. Get the PerfMBean ObjectName for the appserver from which you want to get PMI data. Use this example code:

    for(Iterator i = objectNameSet.iterator(); i.hasNext(); on = (ObjectName)i.next()) {
          
    // First make sure the node name and server name is what you want
          
    // Second, check if the type is Perf
                String type = on.getKeyProperty("type");
          String node = on.getKeyProperty("node");
          String process= on.getKeyProperty("process");
                if (type.equals("Perf") && node.equals(mynode) &
    & server.equals(myserver)) {
        perfOName = on;
                }
      }
    

  4. Invoke operations on PerfMBean through the AdminClient. Once you get the PerfMBean(s) in the appserver from which you want to get PMI data, we can invoke the following operations on the PerfMBean through AdminClient API:

    - setStatisticSet: Enable PMI data using the pre-defined statistic sets.
      Object[] params = new Object[] { com.ibm.websphere.pmi.stat.StatConstants.STATISTIC_SET_EXTENDED};
      String[] signature = new String[] {"java.lang.String"};
      ac.invoke (perfOName, "setStatisticSet", params, signature);
    
    - getStatisticSet: Returns the current statistic set.
      String setname = (String) ac.invoke (perfOName, "getStatisticSet", null, null);
    
    - setCustomSetString: Customizing PMI data that is enabled using fine-grained control.  This method allows to enable or disable statistics selectively. The format of the custom  set spec string is STATS_NAME=ID1,ID2,ID3 seperated by ':', where STATS_NAME  and IDs are defined in WS*Stat interfaces in com.ibm.websphere.pmi.stat package.
      params[0] = new String (WSJVMStats.NAME + "=" + WSJVMStats.HeapSize);
      params[1] = new Boolean (false);
      signature = new String[] {"java.lang.String", "java.lang.Boolean"};
      ac.invoke (perfOName, "setCustomSetString", params, signature);
    
      
    

    Statistics that are not listed in the set string are not changed. - getCustomSetString: Returns the current custom set spec as a string String setstring = (String) ac.invoke (perfOName, "getCustomSetString", null, null); - setInstrumentationLevel: set the instrumentation level params[0] = new MBeanLevelSpec(objectName, new int[]{WSJVMStats.HEAPSIZE}); params[1] = new Boolean(true); signature= new String[]{ "com.ibm.websphere.pmi.stat.MBeanLevelSpec", "java.lang.Boolean"}; ac.invoke(perfOName, "setInstrumentationLevel", params, signature); - getInstrumentationLevel: get the instrumentation level params[0] = objectName; params[1] = new Boolean(recursive); String[] signature= new String[]{ "javax.management.ObjectName", "java.lang.Boolean"}; MBeanLevelSpec[] mlss = (MBeanLevelSpec[])ac.invoke(perfOName, "getInstrumentationLevel", params, signature); - setInstrumentationLevel: set the instrumentation level (deprecated in V6.0) params[0] = new MBeanLevelSpec(objectName, optionalSD, level); params[1] = new Boolean(true); signature= new String[]{ "com.ibm.websphere.pmi.stat.MBeanLevelSpec", "java.lang.Boolean"}; ac.invoke(perfOName, "setInstrumentationLevel", params, signature); - getInstrumentationLevel: get the instrumentation level (deprecated in V6.0) Object[] params = new Object[2]; params[0] = new MBeanStatDescriptor(objectName, optionalSD); params[1] = new Boolean(recursive); String[] signature= new String[]{ "com.ibm.websphere.pmi.stat.MBeanStatDescriptor", "java.lang.Boolean"}; MBeanLevelSpec[] mlss = (MBeanLevelSpec[])ac.invoke(perfOName, "getInstrumentationLevel", params, signature); - getConfigs: get PMI static config info for all the MBeans configs = (PmiModuleConfig[])ac.invoke(perfOName, "getConfigs", null, null); - getConfig: get PMI static config info for a specific MBean ObjectName[] params = {objectName}; String[] signature= { "javax.management.ObjectName" }; config = (PmiModuleConfig)ac.invoke(perfOName, "getConfig", params, signature); - getStatsObject: we can use either ObjectName or MBeanStatDescriptor Object[] params = new Object[2]; params[0] = objectName; // either ObjectName or or MBeanStatDescriptor params[1] = new Boolean(recursive); String[] signature = new String[] { "javax.management.ObjectName", "java.lang.Boolean"}; Stats stats = (Stats)ac.invoke(perfOName, "getStatsObject", params, signature);

    The returned data only have dynamic information (value and time stamp). See PmiJmxTest.java for additional code to link the configuration information with the returned data. - getStatsArray: we can use either ObjectName or MBeanStatDescriptor ObjectName[] onames = new ObjectName[]{objectName1, objectName2}; Object[] params = new Object[]{onames, new Boolean(true)}; String[] signature = new String[]{"[Ljavax.management.ObjectName;", "java.lang.Boolean"}; Stats[] statsArray = (Stats[])ac.invoke(perfOName, "getStatsArray", params, signature);

    The returned data only have dynamic information (value and time stamp). See PmiJmxTest.java for additional code to link the configuration information with the returned data. - listStatMembers: navigate the PMI module trees Object[] params = new Object[]{mName}; String[] signature= new String[]{"javax.management.ObjectName"}; MBeanStatDescriptor[] msds = (MBeanStatDescriptor[])ac.invoke(perfOName, "listStatMembers", params, signature); or, Object[] params = new Object[]{mbeanSD}; String[] signature= new String[] {"com.ibm.websphere.pmi.stat.MBeanStatDescriptor"}; MBeanStatDescriptor[] msds = (MBeanStatDescriptor[])ac.invoke (perfOName, "listStatMembers", params, signature);

    Refer the API documentation for deprecated classes

    • To use an individual MBean: we need to get the AdminClient instance and the ObjectName for the individual MBean. Then we can simply get the Stats attribute on the MBean.


Example: Administering Java Management Extension-based interface

 

Related tasks


Develop an admin client program