通过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(); } }