Add human readable option to nodetool outputs.

Patch by Michael Nelson, reviewed by brandonwilliams for CASSANDRA-5433


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/1cef273e
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/1cef273e
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/1cef273e

Branch: refs/heads/trunk
Commit: 1cef273ed3d77505bf3ad2afc9eef1a0b37405b3
Parents: 25eb830
Author: Brandon Williams <brandonwilli...@apache.org>
Authored: Sat Sep 13 12:15:48 2014 -0500
Committer: Brandon Williams <brandonwilli...@apache.org>
Committed: Sat Sep 13 12:17:09 2014 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../org/apache/cassandra/tools/NodeTool.java    | 73 ++++++++++++++------
 2 files changed, 51 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/1cef273e/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index fdf6fbe..7f10ca5 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.1
+ * Add human readable option to nodetool commands (CASSANDRA-5433)
  * Don't try to set repairedAt on old sstables (CASSANDRA-7913)
  * Add metrics for tracking PreparedStatement use (CASSANDRA-7719)
  * (cqlsh) tab-completion for triggers (CASSANDRA-7824)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1cef273e/src/java/org/apache/cassandra/tools/NodeTool.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java 
b/src/java/org/apache/cassandra/tools/NodeTool.java
index d5a4bb3..cc38107 100644
--- a/src/java/org/apache/cassandra/tools/NodeTool.java
+++ b/src/java/org/apache/cassandra/tools/NodeTool.java
@@ -375,33 +375,33 @@ public class NodeTool
             CacheServiceMBean cacheService = probe.getCacheServiceMBean();
 
             // Key Cache: Hits, Requests, RecentHitRate, SavePeriodInSeconds
-            System.out.printf("%-17s: entries %d, size %d (bytes), capacity %d 
(bytes), %d hits, %d requests, %.3f recent hit rate, %d save period in 
seconds%n",
+            System.out.printf("%-17s: entries %d, size %s, capacity %s, %d 
hits, %d requests, %.3f recent hit rate, %d save period in seconds%n",
                     "Key Cache",
                     probe.getCacheMetric("KeyCache", "Entries"),
-                    probe.getCacheMetric("KeyCache", "Size"),
-                    probe.getCacheMetric("KeyCache", "Capacity"),
+                    FileUtils.stringifyFileSize((long) 
probe.getCacheMetric("KeyCache", "Size")),
+                    FileUtils.stringifyFileSize((long) 
probe.getCacheMetric("KeyCache", "Capacity")),
                     probe.getCacheMetric("KeyCache", "Hits"),
                     probe.getCacheMetric("KeyCache", "Requests"),
                     probe.getCacheMetric("KeyCache", "HitRate"),
                     cacheService.getKeyCacheSavePeriodInSeconds());
 
             // Row Cache: Hits, Requests, RecentHitRate, SavePeriodInSeconds
-            System.out.printf("%-17s: entries %d, size %d (bytes), capacity %d 
(bytes), %d hits, %d requests, %.3f recent hit rate, %d save period in 
seconds%n",
+            System.out.printf("%-17s: entries %d, size %s, capacity %s, %d 
hits, %d requests, %.3f recent hit rate, %d save period in seconds%n",
                     "Row Cache",
                     probe.getCacheMetric("RowCache", "Entries"),
-                    probe.getCacheMetric("RowCache", "Size"),
-                    probe.getCacheMetric("RowCache", "Capacity"),
+                    FileUtils.stringifyFileSize((long) 
probe.getCacheMetric("RowCache", "Size")),
+                    FileUtils.stringifyFileSize((long) 
probe.getCacheMetric("RowCache", "Capacity")),
                     probe.getCacheMetric("RowCache", "Hits"),
                     probe.getCacheMetric("RowCache", "Requests"),
                     probe.getCacheMetric("RowCache", "HitRate"),
                     cacheService.getRowCacheSavePeriodInSeconds());
 
             // Counter Cache: Hits, Requests, RecentHitRate, 
SavePeriodInSeconds
-            System.out.printf("%-17s: entries %d, size %d (bytes), capacity %d 
(bytes), %d hits, %d requests, %.3f recent hit rate, %d save period in 
seconds%n",
+            System.out.printf("%-17s: entries %d, size %s, capacity %s, %d 
hits, %d requests, %.3f recent hit rate, %d save period in seconds%n",
                     "Counter Cache",
                     probe.getCacheMetric("CounterCache", "Entries"),
-                    probe.getCacheMetric("CounterCache", "Size"),
-                    probe.getCacheMetric("CounterCache", "Capacity"),
+                    FileUtils.stringifyFileSize((long) 
probe.getCacheMetric("CounterCache", "Size")),
+                    FileUtils.stringifyFileSize((long) 
probe.getCacheMetric("CounterCache", "Capacity")),
                     probe.getCacheMetric("CounterCache", "Hits"),
                     probe.getCacheMetric("CounterCache", "Requests"),
                     probe.getCacheMetric("CounterCache", "HitRate"),
@@ -544,6 +544,11 @@ public class NodeTool
     @Command(name = "netstats", description = "Print network information on 
provided host (connecting node by default)")
     public static class NetStats extends NodeToolCmd
     {
+        @Option(title = "human_readable",
+                name = {"-H", "--human-readable"},
+                description = "Display bytes in human readable form, i.e. KB, 
MB, GB, TB")
+        private boolean humanReadable = false;
+
         @Override
         public void execute(NodeProbe probe)
         {
@@ -559,7 +564,10 @@ public class NodeTool
                     System.out.printf("    %s%n", info.peer.toString());
                     if (!info.receivingSummaries.isEmpty())
                     {
-                        System.out.printf("        Receiving %d files, %d 
bytes total%n", info.getTotalFilesToReceive(), info.getTotalSizeToReceive());
+                        if (humanReadable)
+                            System.out.printf("        Receiving %d files, %s 
total%n", info.getTotalFilesToReceive(), 
FileUtils.stringifyFileSize(info.getTotalSizeToReceive()));
+                        else
+                            System.out.printf("        Receiving %d files, %d 
bytes total%n", info.getTotalFilesToReceive(), info.getTotalSizeToReceive());
                         for (ProgressInfo progress : info.getReceivingFiles())
                         {
                             System.out.printf("            %s%n", 
progress.toString());
@@ -567,7 +575,10 @@ public class NodeTool
                     }
                     if (!info.sendingSummaries.isEmpty())
                     {
-                        System.out.printf("        Sending %d files, %d bytes 
total%n", info.getTotalFilesToSend(), info.getTotalSizeToSend());
+                        if (humanReadable)
+                            System.out.printf("        Sending %d files, %s 
total%n", info.getTotalFilesToSend(), 
FileUtils.stringifyFileSize(info.getTotalSizeToSend()));
+                        else
+                            System.out.printf("        Sending %d files, %d 
bytes total%n", info.getTotalFilesToSend(), info.getTotalSizeToSend());
                         for (ProgressInfo progress : info.getSendingFiles())
                         {
                             System.out.printf("            %s%n", 
progress.toString());
@@ -614,6 +625,11 @@ public class NodeTool
         @Option(name = "-i", description = "Ignore the list of column families 
and display the remaining cfs")
         private boolean ignore = false;
 
+        @Option(title = "human_readable",
+                name = {"-H", "--human-readable"},
+                description = "Display bytes in human readable form, i.e. KB, 
MB, GB, TB")
+        private boolean humanReadable = false;
+
         @Override
         public void execute(NodeProbe probe)
         {
@@ -683,9 +699,9 @@ public class NodeTool
                                               : Double.NaN;
 
                 System.out.println("\tRead Count: " + keyspaceReadCount);
-                System.out.println("\tRead Latency: " + format("%s", 
keyspaceReadLatency) + " ms.");
+                System.out.println("\tRead Latency: " + String.format("%s", 
keyspaceReadLatency) + " ms.");
                 System.out.println("\tWrite Count: " + keyspaceWriteCount);
-                System.out.println("\tWrite Latency: " + format("%s", 
keyspaceWriteLatency) + " ms.");
+                System.out.println("\tWrite Latency: " + String.format("%s", 
keyspaceWriteLatency) + " ms.");
                 System.out.println("\tPending Flushes: " + 
keyspacePendingFlushes);
 
                 // print out column family statistics for this keyspace
@@ -720,12 +736,12 @@ public class NodeTool
                                 System.out.println("]");
                         }
                     }
-                    System.out.println("\t\tSpace used (live), bytes: " + 
probe.getColumnFamilyMetric(keyspaceName, cfName, "LiveDiskSpaceUsed"));
-                    System.out.println("\t\tSpace used (total), bytes: " + 
probe.getColumnFamilyMetric(keyspaceName, cfName, "TotalDiskSpaceUsed"));
-                    System.out.println("\t\tSpace used by snapshots (total), 
bytes: " + probe.getColumnFamilyMetric(keyspaceName, cfName, "SnapshotsSize"));
+                    System.out.println("\t\tSpace used (live): " + 
format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, 
"LiveDiskSpaceUsed"), humanReadable));
+                    System.out.println("\t\tSpace used (total): " + 
format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, 
"TotalDiskSpaceUsed"), humanReadable));
+                    System.out.println("\t\tSpace used by snapshots (total): " 
+ format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, 
"SnapshotsSize"), humanReadable));
                     System.out.println("\t\tSSTable Compression Ratio: " + 
probe.getColumnFamilyMetric(keyspaceName, cfName, "CompressionRatio"));
                     System.out.println("\t\tMemtable cell count: " + 
probe.getColumnFamilyMetric(keyspaceName, cfName, "MemtableColumnsCount"));
-                    System.out.println("\t\tMemtable data size, bytes: " + 
probe.getColumnFamilyMetric(keyspaceName, cfName, "MemtableLiveDataSize"));
+                    System.out.println("\t\tMemtable data size: " + 
format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, 
"MemtableLiveDataSize"), humanReadable));
                     System.out.println("\t\tMemtable switch count: " + 
probe.getColumnFamilyMetric(keyspaceName, cfName, "MemtableSwitchCount"));
                     System.out.println("\t\tLocal read count: " + 
((JmxReporter.TimerMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, 
"ReadLatency")).getCount());
                     double localReadLatency = ((JmxReporter.TimerMBean) 
probe.getColumnFamilyMetric(keyspaceName, cfName, "ReadLatency")).getMean() / 
1000;
@@ -737,11 +753,11 @@ public class NodeTool
                     System.out.printf("\t\tLocal write latency: %01.3f ms%n", 
localWLatency);
                     System.out.println("\t\tPending flushes: " + 
probe.getColumnFamilyMetric(keyspaceName, cfName, "PendingFlushes"));
                     System.out.println("\t\tBloom filter false positives: " + 
probe.getColumnFamilyMetric(keyspaceName, cfName, "BloomFilterFalsePositives"));
-                    System.out.println("\t\tBloom filter false ratio: " + 
format("%01.5f", probe.getColumnFamilyMetric(keyspaceName, cfName, 
"RecentBloomFilterFalseRatio")));
-                    System.out.println("\t\tBloom filter space used, bytes: " 
+ probe.getColumnFamilyMetric(keyspaceName, cfName, 
"BloomFilterDiskSpaceUsed"));
-                    System.out.println("\t\tCompacted partition minimum bytes: 
" + probe.getColumnFamilyMetric(keyspaceName, cfName, "MinRowSize"));
-                    System.out.println("\t\tCompacted partition maximum bytes: 
" + probe.getColumnFamilyMetric(keyspaceName, cfName, "MaxRowSize"));
-                    System.out.println("\t\tCompacted partition mean bytes: " 
+ probe.getColumnFamilyMetric(keyspaceName, cfName, "MeanRowSize"));
+                    System.out.printf("\t\tBloom filter false ratio: %s%n", 
String.format("%01.5f", probe.getColumnFamilyMetric(keyspaceName, cfName, 
"RecentBloomFilterFalseRatio")));
+                    System.out.println("\t\tBloom filter space used: " + 
format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, 
"BloomFilterDiskSpaceUsed"), humanReadable));
+                    System.out.println("\t\tCompacted partition minimum bytes: 
" + format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, 
"MinRowSize"), humanReadable));
+                    System.out.println("\t\tCompacted partition maximum bytes: 
" + format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, 
"MaxRowSize"), humanReadable));
+                    System.out.println("\t\tCompacted partition mean bytes: " 
+ format((Long) probe.getColumnFamilyMetric(keyspaceName, cfName, 
"MeanRowSize"), humanReadable));
                     JmxReporter.HistogramMBean histogram = 
(JmxReporter.HistogramMBean) probe.getColumnFamilyMetric(keyspaceName, cfName, 
"LiveScannedHistogram");
                     System.out.println("\t\tAverage live cells per slice (last 
five minutes): " + histogram.getMean());
                     System.out.println("\t\tMaximum live cells per slice (last 
five minutes): " + histogram.getMax());
@@ -755,6 +771,10 @@ public class NodeTool
             }
         }
 
+        private String format(long bytes, boolean humanReadable) {
+            return humanReadable ? FileUtils.stringifyFileSize(bytes) : 
Long.toString(bytes);
+        }
+
         /**
          * Used for filtering keyspaces and columnfamilies to be displayed 
using the cfstats command.
          */
@@ -1127,6 +1147,11 @@ public class NodeTool
     @Command(name = "compactionstats", description = "Print statistics on 
compactions")
     public static class CompactionStats extends NodeToolCmd
     {
+        @Option(title = "human_readable",
+                name = {"-H", "--human-readable"},
+                description = "Display bytes in human readable form, i.e. KB, 
MB, GB, TB")
+        private boolean humanReadable = false;
+
         @Override
         public void execute(NodeProbe probe)
         {
@@ -1147,9 +1172,11 @@ public class NodeTool
                     String taskType = c.get("taskType");
                     String keyspace = c.get("keyspace");
                     String columnFamily = c.get("columnfamily");
+                    String completedStr = humanReadable ? 
FileUtils.stringifyFileSize(completed) : Long.toString(completed);
+                    String totalStr = humanReadable ? 
FileUtils.stringifyFileSize(total) : Long.toString(total);
                     String unit = c.get("unit");
                     String percentComplete = total == 0 ? "n/a" : new 
DecimalFormat("0.00").format((double) completed / total * 100) + "%";
-                    addLine(lines, columnSizes, taskType, keyspace, 
columnFamily, Long.toString(completed), Long.toString(total), unit, 
percentComplete);
+                    addLine(lines, columnSizes, taskType, keyspace, 
columnFamily, completedStr, totalStr, unit, percentComplete);
                     if (taskType.equals(OperationType.COMPACTION.toString()))
                         remainingBytes += total - completed;
                 }

Reply via email to