diff --git a/src/main/java/com/alibaba/druid/support/console/Option.java b/src/main/java/com/alibaba/druid/support/console/Option.java index 202e541be6..bf59ef4e54 100644 --- a/src/main/java/com/alibaba/druid/support/console/Option.java +++ b/src/main/java/com/alibaba/druid/support/console/Option.java @@ -25,6 +25,7 @@ public class Option { private PrintStyle style = PrintStyle.HORIZONTAL; private int printDataType = 0; private int vmid = -1; + private int id = -1; public void addPrintDataType(int newValue) { this.printDataType= this.printDataType | newValue; @@ -33,7 +34,7 @@ public class Option { public static boolean isPrintHelp(String[] args) { if (args == null ) return true; for (String arg: args) { - if (arg.equals("-h") || arg.equals("--help")) { + if (arg.equals("-help") ) { return true; } } @@ -112,6 +113,13 @@ public class Option { option.setStyle(PrintStyle.HORIZONTAL); } else if (args[i].equals("-s2")) { option.setStyle(PrintStyle.VERTICAL); + } else if (args[i].equals("-id")) { + try { + int id = Integer.parseInt(args[i+1]); + option.setId(id); + } catch (NumberFormatException e) { + throw new OptionParseException("vmid argument is not a integer!"); + } } i++; } @@ -122,7 +130,7 @@ public class Option { } public static void printHelp() { - System.out.println("Usage: druidStat -help | -sql -ds -act -s1 -s2 vmid"); + System.out.println("Usage: druidStat -help | -sql -ds -act -s1 -s2 -id vmid"); System.out.println(); System.out.println("arguments: "); System.out.println(" vmid the process id of jvm that running druid"); @@ -131,8 +139,17 @@ public class Option { System.out.println(" -act print active connection stacktrace data"); System.out.println(" -s1 print field name in first row"); System.out.println(" -s2 print field name in first column"); + System.out.println(" -id only print the sql data matched with id, use this with -sql argument" ); } + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + } diff --git a/src/main/java/com/alibaba/druid/support/console/TabledDataPrinter.java b/src/main/java/com/alibaba/druid/support/console/TabledDataPrinter.java index c6b8ece8f5..8645e71a51 100644 --- a/src/main/java/com/alibaba/druid/support/console/TabledDataPrinter.java +++ b/src/main/java/com/alibaba/druid/support/console/TabledDataPrinter.java @@ -19,11 +19,26 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import com.alibaba.druid.sql.SQLUtils; + public class TabledDataPrinter { private static final int SQL_MAX_LEN = 32; - - private static final String[] sqlFields = new String[] { + private static final int MAX_COL = 4; + + private static final String[] sqlRowTitle = new String[] { + "ID", "SQL", "ExecCount", "ExecTime", + "ExecMax","Txn", "Error","Update","FetchRow","Running","Concurrent", + "ExecHisto", "ExecRsHisto","FetchRowHisto","UpdateHisto" }; + + + private static final String[] sqlRowField = new String[] { + "ID", "SQL", "ExecuteCount", "TotalTime", "MaxTimespan", + "InTransactionCount", "ErrorCount", "EffectedRowCount", "FetchRowCount", + "RunningCount","ConcurrentMax","Histogram","ExecuteAndResultHoldTimeHistogram", + "FetchRowCountHistogram","EffectedRowCountHistogram" }; + + private static final String[] sqlColField = new String[] { "ID", "DataSource", "SQL", "ExecuteCount", "ErrorCount", "TotalTime", "LastTime", "MaxTimespan", "LastError", "EffectedRowCount", "FetchRowCount", "MaxTimespanOccurTime", "BatchSizeMax", "BatchSizeTotal", "ConcurrentMax", @@ -33,7 +48,21 @@ public class TabledDataPrinter { "Histogram", "LastSlowParameters", "ResultSetHoldTime", "ExecuteAndResultSetHoldTime", "FetchRowCountHistogram", "EffectedRowCountHistogram", "ExecuteAndResultHoldTimeHistogram", "EffectedRowCountMax", "FetchRowCountMax", "ClobOpenCount" }; - private static final String[] dsFields = new String[] { + + private static final String[] dsRowTitle = new String[] { + "Name", "DbType", + "PoolingCount", "PoolingPeak", "PoolingPeakTime", + "ActiveCount", "ActivePeak", "ActivePeakTime", + "ExecuteCount", "ErrorCount", "CommitCount", "RollbackCount" }; + + private static final String[] dsRowField = new String[] { + "Name", "DbType", + "PoolingCount", "PoolingPeak", "PoolingPeakTime", + "ActiveCount", "ActivePeak", "ActivePeakTime", + "ExecuteCount", "ErrorCount", "CommitCount", "RollbackCount" }; + + + private static final String[] dsColField = new String[] { "Identity", "Name", "DbType", "DriverClassName", "URL", "UserName", "FilterClassNames", "WaitThreadCount", "NotEmptyWaitCount", "NotEmptyWaitMillis", "PoolingCount", "PoolingPeak", "PoolingPeakTime", @@ -60,29 +89,48 @@ public class TabledDataPrinter { public static void printDataSourceData(List> content,Option opt) { if (opt.getStyle() == Option.PrintStyle.HORIZONTAL) { - System.out.println(getFormattedOutput(content, dsFields)); + System.out.println(getFormattedOutput(content, dsRowTitle, dsRowField)); } else { - System.out.println(getVerticalFormattedOutput(content, dsFields)); + System.out.println(getVerticalFormattedOutput(content, dsColField)); } } public static void printSqlData(List> content, Option opt) { + if (opt.getId() != -1) { + List> matchedContent = new ArrayList>(); + for (Map sqlStat : content) { + Integer idStr = (Integer)sqlStat.get("ID"); + if (idStr.intValue() == opt.getId()) { + matchedContent.add(sqlStat); + String dbType = (String) sqlStat.get("DbType"); + String sql = (String) sqlStat.get("SQL"); + System.out.println(SQLUtils.format(sql, dbType)); + System.out.println("===============================\n"); + break; + } + } + content = matchedContent; + + + } if (opt.getStyle() == Option.PrintStyle.HORIZONTAL) { - System.out.println(getFormattedOutput(content, sqlFields)); + System.out.println(getFormattedOutput(content, sqlRowTitle, sqlRowField)); } else { - System.out.println(getVerticalFormattedOutput(content, sqlFields)); + System.out.println(getVerticalFormattedOutput(content, sqlColField)); } } - public static String getFormattedOutput(List> content, String[] titleFields) { + public static String getFormattedOutput(List> content, + String[] title , String[] rowField) { + List printContents = new ArrayList(); - printContents.add(titleFields); + printContents.add(title); for (Map sqlStat : content) { - String[] row = new String[titleFields.length]; - for (int i = 0; i < titleFields.length; ++i) { - Object value = sqlStat.get(titleFields[i]); - row[i] = handleAndConvert(value,titleFields[i]); + String[] row = new String[rowField.length]; + for (int i = 0; i < rowField.length; ++i) { + Object value = sqlStat.get(rowField[i]); + row[i] = handleAndConvert(value,rowField[i]); } printContents.add(row); } @@ -94,10 +142,12 @@ public class TabledDataPrinter { public static String getVerticalFormattedOutput(List> content, String[] titleFields) { List printContents = new ArrayList(); + int maxCol = content.size() > MAX_COL ? MAX_COL: content.size(); + for (int i = 0; i < titleFields.length; ++i) { - String[] row = new String[content.size()+1]; + String[] row = new String[maxCol+1]; row[0] = titleFields[i]; - for (int j=0; j sqlStat = content.get(j); Object value = sqlStat.get(titleFields[i]); row[j+1] = handleAndConvert(value, titleFields[i]); @@ -112,6 +162,8 @@ public class TabledDataPrinter { if (value == null) value = ""; if (fieldName.equals("SQL")) { String sql = (String)value; + sql = sql.replace("\n", " "); + sql = sql.replace("\t", " "); if (sql.length() > SQL_MAX_LEN) { sql = sql.substring(0,SQL_MAX_LEN-3) + "..."; } diff --git a/src/main/scripts/druid.bat b/src/main/scripts/druid.bat new file mode 100644 index 0000000000..55d16282a2 --- /dev/null +++ b/src/main/scripts/druid.bat @@ -0,0 +1,18 @@ +@echo off + +rem Copyright 1999-2011 Alibaba Group Holding Ltd. +rem +rem Licensed under the Apache License, Version 2.0 (the "License"); +rem you may not use this file except in compliance with the License. +rem You may obtain a copy of the License at +rem +rem http://www.apache.org/licenses/LICENSE-2.0 +rem +rem Unless required by applicable law or agreed to in writing, software +rem distributed under the License is distributed on an "AS IS" BASIS, +rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +rem See the License for the specific language governing permissions and +rem limitations under the License. + + +java -classpath "../druid.jar" com.alibaba.druid.support.console.DruidStat diff --git a/src/test/java/com/alibaba/druid/bvt/console/OptionTest.java b/src/test/java/com/alibaba/druid/bvt/console/OptionTest.java index 7ab1673b53..f6f97420b6 100644 --- a/src/test/java/com/alibaba/druid/bvt/console/OptionTest.java +++ b/src/test/java/com/alibaba/druid/bvt/console/OptionTest.java @@ -35,6 +35,13 @@ public class OptionTest extends TestCase { Assert.assertFalse(opt.printActiveConn()); Assert.assertEquals(opt.getStyle(), Option.PrintStyle.VERTICAL); Assert.assertEquals(opt.getVmid(), 1319); + + cmdArray = new String[] {"-sql","-id","5","200"}; + opt = Option.parseOptions(cmdArray); + Assert.assertNotNull(opt); + Assert.assertEquals(opt.getId(), 5); + Assert.assertEquals(opt.getVmid(), 200); + //not enough arguments