diff --git a/src/main/java/com/alibaba/druid/support/console/DruidStat.java b/src/main/java/com/alibaba/druid/support/console/DruidStat.java new file mode 100644 index 0000000000..8a66350a14 --- /dev/null +++ b/src/main/java/com/alibaba/druid/support/console/DruidStat.java @@ -0,0 +1,151 @@ +package com.alibaba.druid.support.console; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import javax.management.MBeanServerConnection; +import javax.management.ObjectName; +import javax.management.remote.JMXConnector; +import javax.management.remote.JMXConnectorFactory; +import javax.management.remote.JMXServiceURL; + +import com.alibaba.druid.stat.DruidStatService; +import com.alibaba.druid.support.json.JSONUtils; +import com.sun.tools.attach.AgentInitializationException; +import com.sun.tools.attach.AgentLoadException; +import com.sun.tools.attach.AttachNotSupportedException; +import com.sun.tools.attach.VirtualMachine; + +@SuppressWarnings({ "restriction" }) +public class DruidStat { + + private static final String LOCAL_CONNECTOR_ADDRESS_PROP = "com.sun.management.jmxremote.localConnectorAddress"; + + public static void main(String[] args) throws Exception { + if (args.length == 0) { + printHelp(); + return; + } + + String option = args[0]; + String url; + + if (option.equals("-sql")) { + url = "/sql.json"; + } else { + printHelp(); + return; + } + + String arg = args[1]; + int vmid = Integer.parseInt(arg); + + String address = loadManagementAgentAndGetAddress(vmid); + JMXServiceURL jmxUrl = new JMXServiceURL(address); + JMXConnector jmxc = JMXConnectorFactory.connect(jmxUrl); + MBeanServerConnection jmxConn = jmxc.getMBeanServerConnection(); + + ObjectName name = new ObjectName(DruidStatService.MBEAN_NAME); + + String result = (String) jmxConn.invoke(name, "service", new String[] { url }, + new String[] { String.class.getName() }); + Map o = (Map) JSONUtils.parse(result); + + if (option.equals("-sql")) { + List> content = (List>) o.get("Content"); + + for (Map sqlStat : content) { + Number id = (Number) sqlStat.get("ID"); + String sql = (String) sqlStat.get("SQL"); + System.out.print(id); + System.out.print(" : "); + System.out.println(); + System.out.println(sql); + System.out.println(); + } + + String[] fields = new String[] {"ID", "RunningCount", "ExecuteCount" }; + for (int i = 0; i < fields.length; ++i) { + if (i != 0) { + System.out.print('\t'); + } + System.out.print(fields[i]); + } + System.out.println(); + + for (Map sqlStat : content) { + for (int i = 0; i < fields.length; ++i) { + if (i != 0) { + System.out.print('\t'); + } + Object value = sqlStat.get(fields[i]); + System.out.print(value); + } + System.out.println(); + } + } + + //System.out.println(o); + + // ... ... + } + + private static void printHelp() { + System.out.println("Usage: druidStat -help|-options"); + System.out.println(" druidStat -