通过JMX获取weblogic的监控指标

通过JMX获取weblogic的监控数据,包括JDBC,SESSION,SERVERLET,JVM等信息。主要用到weblogic自己的t3协议,所以要用到weblogic的jar包:wlfullclient.jar和wlclient.jar。这两个jar包怎么获取我专门在另外一篇文章中讲。下面贴一些获取监控指标的代码,做个备份只用吧。

1、对JDBC的监控,只取了最重要的监控指标:

package test;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;

import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

public class PrintJdbc {
	private static MBeanServerConnection connection;
	private static JMXConnector connector;
	private static final ObjectName service;
	

	   static {
	      try {
	         service = new ObjectName("com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean");
	      }catch (MalformedObjectNameException e) {
	         throw new AssertionError(e.getMessage());
	      }
	   }
	 
	   public static void initConnection(String hostname, String portString, 
	      String username, String password) throws IOException,
	      MalformedURLException { 
	      String protocol = "t3";
	      Integer portInteger = Integer.valueOf(portString);
	      int port = portInteger.intValue();
	      String jndiroot = "/jndi/";
	      String mserver = "weblogic.management.mbeanservers.runtime";
	      JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname,
	         port, jndiroot + mserver);
	      Hashtable h = new Hashtable();
	      h.put(Context.SECURITY_PRINCIPAL, username);
	      h.put(Context.SECURITY_CREDENTIALS, password);
	      h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
	         "weblogic.management.remote");
	      connector = JMXConnectorFactory.connect(serviceURL, h);
	      connection = connector.getMBeanServerConnection();
	   }
	
	   public static ObjectName getServerRuntimes() throws Exception {
		    return (ObjectName)connection.getAttribute(service,
	    		  "ServerRuntime");
	   }
	   
	  
	   public  ObjectName getJDBCServer() throws Exception {
		   ObjectName dc = getServerRuntimes();
		   ObjectName jdbcService = (ObjectName)connection.getAttribute(dc,
				   "JDBCServiceRuntime");
		   return jdbcService;
	   }
	   
		public ObjectName[] getJDBCDataSourceRuntime() throws Exception   {
			ObjectName[] jdbcDataSourceRTMB = (ObjectName[]) connection.getAttribute(getJDBCServer(), "JDBCDataSourceRuntimeMBeans");
			return jdbcDataSourceRTMB;
		}
		
		
	   public void printJdbc() throws Exception {
		   ObjectName[] objectList = getJDBCDataSourceRuntime();
		   if(objectList != null && objectList.length > 0){
			   for(ObjectName obj : objectList){
				   int connectionsTotalCount = (int) connection.getAttribute(obj, "ConnectionsTotalCount");
				   int activeConnectionsCurrentCount = (int)connection.getAttribute(obj, "ActiveConnectionsCurrentCount");
				   int activeConnectionsAverageCount = (int)connection.getAttribute(obj,"ActiveConnectionsAverageCount");
				   int failuresToReconnectCount = (int)connection.getAttribute(obj, "FailuresToReconnectCount");
				   String name = (String)connection.getAttribute(obj, "Name");
				   int waitingForConnectionCurrentCount = (int)connection.getAttribute(obj, "WaitingForConnectionCurrentCount");
				   long waitingForConnectionFailureTotal = (long)connection.getAttribute(obj, "WaitingForConnectionFailureTotal");
				   int waitSecondsHighCount = (int)connection.getAttribute(obj, "WaitSecondsHighCount");
				   int connectionDelayTime = (int)connection.getAttribute(obj, "ConnectionDelayTime");
				   int activeConnectionsHighCount = (int)connection.getAttribute(obj, "ActiveConnectionsHighCount");
				   int currCapacity = (int)connection.getAttribute(obj, "CurrCapacity");
				   System.out.println("currCapacity==" + currCapacity);
				   System.out.println("activeConnectionsHighCount==" + activeConnectionsHighCount);
				   System.out.println("connectionDelayTime==" + connectionDelayTime);
				   System.out.println("connectionsTotalCount==" + connectionsTotalCount);
				   System.out.println("activeConnectionsCurrentCount==" + activeConnectionsCurrentCount);
				   System.out.println("activeConnectionsAverageCount==" + activeConnectionsAverageCount);
				   System.out.println("failuresToReconnectCount==" + failuresToReconnectCount);
				   System.out.println("name==" + name);
				   System.out.println("waitingForConnectionCurrentCount==" +waitingForConnectionCurrentCount );
				   System.out.println("waitingForConnectionFailureTotal==" + waitingForConnectionFailureTotal);
				   System.out.println("waitSecondsHighCount==" + waitSecondsHighCount);
				  
				
			   }
		   }
	   }
	   public static void main(String[] args) throws Exception {
		 
		      String hostname = "10.111.131.50";
		      String portString = "7001";
		      String username = "weblogic";
		      String password = "weblogic123";
		      PrintJdbc s = new PrintJdbc();
		      initConnection(hostname, portString, username, password);
		      s.printJdbc();
		      connector.close();
		   }
	   
	   
}

  2、有关thread的监控:

package test;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;

import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

public class PrintThread {

	private static MBeanServerConnection connection;
	private static JMXConnector connector;
	private static final ObjectName service;
	

	   static {
	      try {
	         service = new ObjectName("com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean");
	      }catch (MalformedObjectNameException e) {
	         throw new AssertionError(e.getMessage());
	      }
	   }
	 
	   public static void initConnection(String hostname, String portString, 
	      String username, String password) throws IOException,
	      MalformedURLException { 
	      String protocol = "t3";
	      Integer portInteger = Integer.valueOf(portString);
	      int port = portInteger.intValue();
	      String jndiroot = "/jndi/";
	      String mserver = "weblogic.management.mbeanservers.runtime";
	      JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname,
	         port, jndiroot + mserver);
	      Hashtable h = new Hashtable();
	      h.put(Context.SECURITY_PRINCIPAL, username);
	      h.put(Context.SECURITY_CREDENTIALS, password);
	      h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
	         "weblogic.management.remote");
	      connector = JMXConnectorFactory.connect(serviceURL, h);
	      connection = connector.getMBeanServerConnection();
	   }
	
	   public static ObjectName getServerRuntimes() throws Exception {
		    return (ObjectName)connection.getAttribute(service,
	    		  "ServerRuntime");
	   }
	   
	   public void printInfo() throws Exception{
		   ObjectName objThreadPool = null;
		   ObjectName serverRT = getServerRuntimes();
		   
		   objThreadPool = (ObjectName) connection.getAttribute(serverRT, "ThreadPoolRuntime");
		   double throughput  = Double.parseDouble(String.valueOf(connection.getAttribute(
				   objThreadPool,"Throughput")));
		   System.out.println("throughput:" + throughput);
		   
		   int executeThreadTotalCount = Integer.parseInt(String.valueOf(connection.getAttribute(objThreadPool, "ExecuteThreadTotalCount")));
		   System.out.println("executeThreadTotalCount:" + executeThreadTotalCount);
		 
		
		   int executeThreadIdleCount = Integer.parseInt(String.valueOf(connection.getAttribute(objThreadPool, "ExecuteThreadIdleCount")));
		   System.out.println("executeThreadIdleCount:" + executeThreadIdleCount);
		  
		   int StandbyThreadCount = Integer.parseInt(String.valueOf(connection.getAttribute(objThreadPool, "StandbyThreadCount")));
	       System.out.println("StandbyThreadCount:" + StandbyThreadCount);
	       
	       
	       long timestamp = System.currentTimeMillis() / 1000;
			String metricJson = "";
			String jsonFormat = "{"name": "weblogic_threadpool_metric_demo", " +
	                ""command":"weblogic_threadpool_metric"," +
	                ""type": "metric"," +
	                ""handlers": ["influxdb"],"+
	                ""output": "%s %.5f %d\n%s %d %d\n%s %d %d\n"," +
	                ""status": 0}";
			metricJson = String.format(jsonFormat,
		              ".weblogic.threadpool.throughput", (double)throughput, timestamp,
		              ".weblogic.threadpool.executeThreadTotalCount", (int)executeThreadTotalCount, timestamp,
		              ".weblogic.threadpool.executeThreadIdleCount", (int)executeThreadIdleCount, timestamp);
			System.out.println("metricJson==" + metricJson);
			
			
			
	   }
	   
	   
	public static void main(String args[]) throws Exception {
		 String hostname = "10.111.131.50";
	      String portString = "7001";
	      String username = "weblogic";
	      String password = "weblogic123";
	      PrintThread s = new PrintThread();
	      initConnection(hostname, portString, username, password);
	      s.printInfo();
	      connector.close();
	}
}

  3、有关session的监控:

package test;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;

import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

public class PrintServerState {
	private static MBeanServerConnection connection;
	private static JMXConnector connector;
	private static final ObjectName service;
	
	
	   static {
	      try {
	         service = new ObjectName("com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");
	      }catch (MalformedObjectNameException e) {
	         throw new AssertionError(e.getMessage());
	      }
	   }
	   
	   public static void initConnection(String hostname, String portString, 
	      String username, String password) throws IOException,
	      MalformedURLException { 
	      String protocol = "t3";
	      Integer portInteger = Integer.valueOf(portString);
	      int port = portInteger.intValue();
	      String jndiroot = "/jndi/";
	      String mserver = "weblogic.management.mbeanservers.domainruntime";
	      JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname,
	         port, jndiroot + mserver);
	      Hashtable h = new Hashtable();
	      h.put(Context.SECURITY_PRINCIPAL, username);
	      h.put(Context.SECURITY_CREDENTIALS, password);
	      h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
	         "weblogic.management.remote");
	      connector = JMXConnectorFactory.connect(serviceURL, h);
	      connection = connector.getMBeanServerConnection();
	   }
	   
	   public static ObjectName[] getServerRuntimes() throws Exception {
	      return (ObjectName[]) connection.getAttribute(service,
	         "ServerRuntimes");
	   }
	   
	   public static ObjectName[] getApplicationRuntimes(ObjectName serverRuntime) throws Exception {
		   return (ObjectName[])connection.getAttribute(serverRuntime, "ApplicationRuntimes");
	   }
	   
	   public static ObjectName[] getComponentRuntimes(ObjectName componentRutime) throws Exception {
		   return (ObjectName[]) connection.getAttribute(componentRutime, "ComponentRuntimes");
	   }
	   
	   
	   public void printSessionState() throws Exception {
		   ObjectName[] serverRT = getServerRuntimes();
		   int length = (int) serverRT.length;
		  
		   for(int i = 0;i<length;i++){
			   ObjectName[] applicationRT = getApplicationRuntimes(serverRT[i]);
			   int length_app = (int)applicationRT.length;
			 
			   for(int y = 0;y<length_app;y++){
				   String applicationName =  (String)connection.getAttribute(applicationRT[y], "ApplicationName");
				  
				   if(applicationName.equals("helloworld")){
					  
				   ObjectName[]  componentRuntime = getComponentRuntimes(applicationRT[y]);
				   int length_component = (int)componentRuntime.length;
				   System.out.println("length_component==" + length_component);
				   for(int z = 0;z<length_component;z++){
					   
					   String type =  (String)connection.getAttribute(componentRuntime[z], "Type");
					   if(type.equals("WebAppComponentRuntime")){
						   
					  
					   int SessionsOpenedTotalCount = (int)connection.getAttribute(componentRuntime[z], "SessionsOpenedTotalCount");
					   System.out.println("SessionsOpenedTotalCount==" + SessionsOpenedTotalCount);
					   
					   int openSessionsHighCount = (int)connection.getAttribute(componentRuntime[z], "OpenSessionsHighCount");
					   System.out.println("openSessionsHighCount==" + openSessionsHighCount);
					   
					   int openSessionsCurrentCount = (int)connection.getAttribute(componentRuntime[z], "OpenSessionsCurrentCount");
					   System.out.println("openSessionsCurrentCount==" + openSessionsCurrentCount);
					   break;
					   }
					   
				     }
				     break;
				  }
			   }
		   }
	   }
	   
	   public void printNameAndState() throws Exception {
	      ObjectName[] serverRT = getServerRuntimes();
	      System.out.println("got server runtimes");
	      int length = (int) serverRT.length;
	      for (int i = 0; i < length; i++) {
	    	
	         String name = (String) connection.getAttribute(serverRT[i],
	            "Name");
	         
	         String state = (String) connection.getAttribute(serverRT[i],
	            "State");
	         
	      
	         long activationTime  = (Long)connection.getAttribute(serverRT[i], "ActivationTime");
	         System.out.println("Server name: " + name);
	         System.out.println("Server state:" + state);
	         System.out.println("Server activationTime:" + activationTime);
	       
	         String weblogicVersion  = (String) connection.getAttribute(serverRT[i], "WeblogicVersion");
	         System.out.println("Server weblogicVersion:" + weblogicVersion);
	         
	         String weblogicHome = (String) connection.getAttribute(serverRT[i], "WeblogicHome");
	         System.out.println("Server WeblogicHome:" +weblogicHome );
	         
	         
	      }
	   }
	    public static void main(String[] args) throws Exception {
	      String hostname = "10.111.131.50";
	      String portString = "7001";
	      String username = "weblogic";
	      String password = "weblogic123";
	       PrintServerState s = new PrintServerState();
	      initConnection(hostname, portString, username, password);
	      s.printNameAndState();
	      s.printSessionState();
	      connector.close();
	   }
}

  4、有关serverlet的监控:

package test;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Hashtable;

import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import javax.naming.Context;

public class PrintServerlet {

	private static MBeanServerConnection connection;
	   private static JMXConnector connector;
	   private static final ObjectName service;
	   private final String applicationName_app="helloworld";
	   private final String serverletName1="index.jsp";
	   private final String serverletName2="helloworld.jsp";
	    
	   static {
	      try {
	         service = new ObjectName(
	          "com.bea:Name=DomainRuntimeService,Type=weblogic.management.mbeanservers.domainruntime.DomainRuntimeServiceMBean");
	      }catch (MalformedObjectNameException e) {
	         throw new AssertionError(e.getMessage());
	      }
	   }
	   
	   public static void initConnection(String hostname, String portString, 
	      String username, String password) throws IOException,
	      MalformedURLException { 
	      String protocol = "t3";
	      Integer portInteger = Integer.valueOf(portString);
	      int port = portInteger.intValue();
	      String jndiroot = "/jndi/";
	      String mserver = "weblogic.management.mbeanservers.domainruntime";
	       JMXServiceURL serviceURL = new JMXServiceURL(protocol, hostname,
	         port, jndiroot + mserver);
	      Hashtable h = new Hashtable();
	      h.put(Context.SECURITY_PRINCIPAL, username);
	      h.put(Context.SECURITY_CREDENTIALS, password);
	      h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES,
	         "weblogic.management.remote");
	      connector = JMXConnectorFactory.connect(serviceURL, h);
	      connection = connector.getMBeanServerConnection();
	   }
	   
	   public static ObjectName[] getServerRuntimes() throws Exception {
	      return (ObjectName[]) connection.getAttribute(service,
	         "ServerRuntimes");
	   }
	   
	   public String getApplicationName(ObjectName objectName) throws Exception {
		   return (String)connection.getAttribute(objectName, "Name");
	   }
	   
	   public String getServletName(ObjectName objectName) throws Exception {
		   return (String)connection.getAttribute(objectName,"Name");
	   }
	   
	   public void getServletData() throws Exception {
	      ObjectName[] serverRT = getServerRuntimes();
	      int length = (int) serverRT.length;
	      for (int i = 0; i < length; i++) {
	         ObjectName[] appRT = 
	            (ObjectName[]) connection.getAttribute(serverRT[i],
	            "ApplicationRuntimes");
	         int appLength = (int) appRT.length;
	         for (int x = 0; x < appLength; x++) {
	        	 String applicationName = getApplicationName(appRT[x]);
	        	 if(applicationName_app.equals(applicationName)){
	        		 System.out.println("Application name: " + applicationName);
	        		 ObjectName[] compRT = 
	        	               (ObjectName[]) connection.getAttribute(appRT[x],
	        	               "ComponentRuntimes");
	        	     int compLength = (int) compRT.length;
	        	 
	            for (int y = 0; y < compLength; y++) {
	            	printValue("Component name",(String)connection.getAttribute(compRT[y], "Name"));
	               String componentType = 
	                  (String) connection.getAttribute(compRT[y], "Type");
	               System.out.println(componentType.toString());
	               if (componentType.toString().equals("WebAppComponentRuntime")){
	                  ObjectName[] servletRTs = (ObjectName[])
	                     connection.getAttribute(compRT[y], "Servlets");
	                  int servletLength = (int) servletRTs.length;
	                  for (int z = 0; z < servletLength; z++) {
	                	  String servletName = getServletName(servletRTs[z]);
	                	  if (servletName.contains(serverletName1) || servletName.contains(serverletName2)){
	                		   printValue("Servlet name",servletName);

	                		   printValue("Servlet context path" ,
	 	                        (String)connection.getAttribute(servletRTs[z],
	 	                         "ContextPath"));
		 	                    printValue("Invocation Total Count" ,
		 		                        (Object)connection.getAttribute(servletRTs[z],
		 		                         "InvocationTotalCount"));
		 	                   printValue("ExecutionTimeHigh",
		 		 	                        (Object)connection.getAttribute(servletRTs[z],
		 		 	                         "ExecutionTimeHigh"));
		 		                printValue("ExecutionTimeTotal",(Object)connection.getAttribute(servletRTs[z],
		 	                         "ExecutionTimeTotal"));
		 		                printValue("ExecutionTimeAverage",(Object)connection.getAttribute(servletRTs[z],
		 		                		"ExecutionTimeAverage"));
	 		               
	                	  }
	                    
	                     
	               
	                  }
	               }
	            }
	           }
	         }
	      }
	   }
	   
	   private void printValue(String key,Object value){
		   System.out.println("  " + key + " : " + value);
	   }
	    public static void main(String[] args) throws Exception {
	    	 String hostname = "10.111.131.50";
		      String portString = "7001";
		      String username = "weblogic";
		      String password = "weblogic123";
		      PrintServerlet s = new PrintServerlet();
		      initConnection(hostname, portString, username, password);
		      s.getServletData();
		      connector.close();
	   }
}

  

原文地址:https://www.cnblogs.com/ahang/p/4460656.html