diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java index 0ced8fa0bd..79559a2df3 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java +++ b/src/main/java/com/alibaba/druid/stat/DruidStatManagerFacade.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.stat; +import com.alibaba.druid.pool.DruidDataSource; import java.sql.Driver; import java.sql.DriverManager; import java.util.ArrayList; @@ -172,6 +173,15 @@ public class DruidStatManagerFacade { return datasourceList; } + public List> getActiveConnStackTraceList() { + List> traceList = new ArrayList>(); + for (Object dataSource : getDruidDataSourceInstances()) { + List stacks = ((DruidDataSource) dataSource).getActiveConnectionStackTrace(); + traceList.add(stacks); + } + return traceList; + } + public Map returnJSONBasicStat() { Map dataMap = new LinkedHashMap(); dataMap.put("Version", VERSION.getVersionNumber()); diff --git a/src/main/java/com/alibaba/druid/stat/DruidStatService.java b/src/main/java/com/alibaba/druid/stat/DruidStatService.java index e72ee40243..58dbd5e0cb 100644 --- a/src/main/java/com/alibaba/druid/stat/DruidStatService.java +++ b/src/main/java/com/alibaba/druid/stat/DruidStatService.java @@ -95,6 +95,10 @@ public class DruidStatService implements DruidStatServiceMBean { return returnJSONResult(RESULT_CODE_SUCCESS, statManagerFacade.getDataSourceStatDataList()); } + if (url.equals("/activeConnectionStackTrace.json")) { + return returnJSONResult(RESULT_CODE_SUCCESS, statManagerFacade.getActiveConnStackTraceList()); + } + if (url.startsWith("/datasource-")) { Integer id = StringUtils.subStringToInteger(url, "datasource-", "."); Object result = statManagerFacade.getDataSourceStatData(id); diff --git a/src/main/java/com/alibaba/druid/support/console/DruidStat.java b/src/main/java/com/alibaba/druid/support/console/DruidStat.java index 1fe9e16a06..73f207764d 100644 --- a/src/main/java/com/alibaba/druid/support/console/DruidStat.java +++ b/src/main/java/com/alibaba/druid/support/console/DruidStat.java @@ -39,83 +39,57 @@ public class DruidStat { private static final String LOCAL_CONNECTOR_ADDRESS_PROP = "com.sun.management.jmxremote.localConnectorAddress"; - @SuppressWarnings("unchecked") public static void main(String[] args) throws Exception { - if (args.length == 0) { - printHelp(); + Option opt = null; + + if (Option.isPrintHelp(args)) { + Option.printHelp(); return; } - - String option = args[0]; - String url; - if (option.equals("-sql")) { - url = "/sql.json"; - } else { - printHelp(); + try { + opt = Option.parseOptions(args); + } catch (OptionParseException e) { + System.out.println(e.getMessage()); + Option.printHelp(); return; } - - String arg = args[1]; - int vmid = Integer.parseInt(arg); - String address = loadManagementAgentAndGetAddress(vmid); + printDruidStat(opt); + } + + @SuppressWarnings("all") + public static void printDruidStat(Option option) throws Exception { + + String address = loadManagementAgentAndGetAddress(option.getVmid()); 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(); - } + if (option.printSqlData()) { + List> content = (List>) invokeService(jmxConn, Option.SQL); + TabledDataPrinter.printSqlData(content, option); } - - //System.out.println(o); - - // ... ... + if (option.printDataSourceData()) { + List> content = (List>) invokeService(jmxConn, Option.DATA_SOURCE); + TabledDataPrinter.printDataSourceData(content, option); + } + if (option.printActiveConn()) { + List> content = (List>) invokeService(jmxConn, Option.ACTIVE_CONN); + TabledDataPrinter.printActiveConnStack(content, option); + } + } - private static void printHelp() { - System.out.println("Usage: druidStat -help|-options"); - System.out.println(" druidStat -