This is an automated email from the ASF dual-hosted git repository.

brandonwilliams pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 2dbba13  Fix yaml format and alignment in tpstats
2dbba13 is described below

commit 2dbba13fdb555b3a297a7677896091cc880b5da5
Author: Stefan Miklosovic <[email protected]>
AuthorDate: Fri Aug 21 20:01:30 2020 +0200

    Fix yaml format and alignment in tpstats
    
    Patch by Stefan Miklosovic, reviewed by brandonwilliams for
    CASSANDRA-11402
---
 CHANGES.txt                                        |  1 +
 src/java/org/apache/cassandra/tools/NodeProbe.java | 40 +++++------
 .../cassandra/tools/nodetool/ProxyHistograms.java  | 12 ++--
 .../cassandra/tools/nodetool/TableHistograms.java  |  6 +-
 .../apache/cassandra/tools/nodetool/TpStats.java   |  2 -
 .../tools/nodetool/stats/TpStatsHolder.java        |  3 +-
 .../tools/nodetool/stats/TpStatsPrinter.java       | 78 +++++++++++++++-------
 7 files changed, 85 insertions(+), 57 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 14df925..92c6b87 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,6 @@
 4.0-beta3
  * Add nodetool getfullquerylog (CASSANDRA-15988)
+ * Fix yaml format and alignment in tpstats (CASSANDRA-11402)
 
 4.0-beta2
  * Add addition incremental repair visibility to nodetool repair_admin 
(CASSANDRA-14939)
diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java 
b/src/java/org/apache/cassandra/tools/NodeProbe.java
index 685c153..3020fec 100644
--- a/src/java/org/apache/cassandra/tools/NodeProbe.java
+++ b/src/java/org/apache/cassandra/tools/NodeProbe.java
@@ -1634,26 +1634,26 @@ public class NodeProbe implements AutoCloseable
         }
     }
 
-    public double[] 
metricPercentilesAsArray(CassandraMetricsRegistry.JmxHistogramMBean metric)
-    {
-        return new double[]{ metric.get50thPercentile(),
-                metric.get75thPercentile(),
-                metric.get95thPercentile(),
-                metric.get98thPercentile(),
-                metric.get99thPercentile(),
-                metric.getMin(),
-                metric.getMax()};
-    }
-
-    public double[] 
metricPercentilesAsArray(CassandraMetricsRegistry.JmxTimerMBean metric)
-    {
-        return new double[]{ metric.get50thPercentile(),
-                metric.get75thPercentile(),
-                metric.get95thPercentile(),
-                metric.get98thPercentile(),
-                metric.get99thPercentile(),
-                metric.getMin(),
-                metric.getMax()};
+    public Double[] 
metricPercentilesAsArray(CassandraMetricsRegistry.JmxHistogramMBean metric)
+    {
+        return new Double[]{ metric.get50thPercentile(),
+                Double.valueOf(metric.get75thPercentile()),
+                Double.valueOf(metric.get95thPercentile()),
+                Double.valueOf(metric.get98thPercentile()),
+                Double.valueOf(metric.get99thPercentile()),
+                Double.valueOf(metric.getMin()),
+                Double.valueOf(metric.getMax())};
+    }
+
+    public Double[] 
metricPercentilesAsArray(CassandraMetricsRegistry.JmxTimerMBean metric)
+    {
+        return new Double[]{ Double.valueOf(metric.get50thPercentile()),
+                             Double.valueOf(metric.get75thPercentile()),
+                             Double.valueOf(metric.get95thPercentile()),
+                             Double.valueOf(metric.get98thPercentile()),
+                             Double.valueOf(metric.get99thPercentile()),
+                             Double.valueOf(metric.getMin()),
+                             Double.valueOf(metric.getMax())};
     }
 
     public TabularData getCompactionHistory()
diff --git a/src/java/org/apache/cassandra/tools/nodetool/ProxyHistograms.java 
b/src/java/org/apache/cassandra/tools/nodetool/ProxyHistograms.java
index 620d75a..1bf31d5 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/ProxyHistograms.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/ProxyHistograms.java
@@ -30,12 +30,12 @@ public class ProxyHistograms extends NodeToolCmd
     public void execute(NodeProbe probe)
     {
         String[] percentiles = {"50%", "75%", "95%", "98%", "99%", "Min", 
"Max"};
-        double[] readLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("Read"));
-        double[] writeLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("Write"));
-        double[] rangeLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("RangeSlice"));
-        double[] casReadLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("CASRead"));
-        double[] casWriteLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("CASWrite"));
-        double[] viewWriteLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("ViewWrite"));
+        Double[] readLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("Read"));
+        Double[] writeLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("Write"));
+        Double[] rangeLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("RangeSlice"));
+        Double[] casReadLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("CASRead"));
+        Double[] casWriteLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("CASWrite"));
+        Double[] viewWriteLatency = 
probe.metricPercentilesAsArray(probe.getProxyMetric("ViewWrite"));
 
         System.out.println("proxy histograms");
         System.out.println(format("%-10s%19s%19s%19s%19s%19s%19s",
diff --git a/src/java/org/apache/cassandra/tools/nodetool/TableHistograms.java 
b/src/java/org/apache/cassandra/tools/nodetool/TableHistograms.java
index cb3b946..1c6fec4 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/TableHistograms.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/TableHistograms.java
@@ -145,9 +145,9 @@ public class TableHistograms extends NodeToolCmd
                 }
 
                 String[] percentiles = new String[]{"50%", "75%", "95%", 
"98%", "99%", "Min", "Max"};
-                double[] readLatency = 
probe.metricPercentilesAsArray((CassandraMetricsRegistry.JmxTimerMBean) 
probe.getColumnFamilyMetric(keyspace, table, "ReadLatency"));
-                double[] writeLatency = 
probe.metricPercentilesAsArray((CassandraMetricsRegistry.JmxTimerMBean) 
probe.getColumnFamilyMetric(keyspace, table, "WriteLatency"));
-                double[] sstablesPerRead = 
probe.metricPercentilesAsArray((CassandraMetricsRegistry.JmxHistogramMBean) 
probe.getColumnFamilyMetric(keyspace, table, "SSTablesPerReadHistogram"));
+                Double[] readLatency = 
probe.metricPercentilesAsArray((CassandraMetricsRegistry.JmxTimerMBean) 
probe.getColumnFamilyMetric(keyspace, table, "ReadLatency"));
+                Double[] writeLatency = 
probe.metricPercentilesAsArray((CassandraMetricsRegistry.JmxTimerMBean) 
probe.getColumnFamilyMetric(keyspace, table, "WriteLatency"));
+                Double[] sstablesPerRead = 
probe.metricPercentilesAsArray((CassandraMetricsRegistry.JmxHistogramMBean) 
probe.getColumnFamilyMetric(keyspace, table, "SSTablesPerReadHistogram"));
 
                 System.out.println(format("%s/%s histograms", keyspace, 
table));
                 System.out.println(format("%-10s%18s%18s%18s%18s%18s",
diff --git a/src/java/org/apache/cassandra/tools/nodetool/TpStats.java 
b/src/java/org/apache/cassandra/tools/nodetool/TpStats.java
index 307c78d..d7e8f06 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/TpStats.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/TpStats.java
@@ -17,8 +17,6 @@
  */
 package org.apache.cassandra.tools.nodetool;
 
-import javax.management.MBeanServerConnection;
-
 import io.airlift.airline.Command;
 
 import io.airlift.airline.Option;
diff --git 
a/src/java/org/apache/cassandra/tools/nodetool/stats/TpStatsHolder.java 
b/src/java/org/apache/cassandra/tools/nodetool/stats/TpStatsHolder.java
index f3e91dc..c641691 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/stats/TpStatsHolder.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/TpStatsHolder.java
@@ -22,7 +22,6 @@ import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.cassandra.tools.NodeProbe;
-import org.apache.cassandra.tools.nodetool.stats.StatsHolder;
 
 public class TpStatsHolder implements StatsHolder
 {
@@ -39,7 +38,7 @@ public class TpStatsHolder implements StatsHolder
         HashMap<String, Object> result = new HashMap<>();
         HashMap<String, Map<String, Object>> threadPools = new HashMap<>();
         HashMap<String, Object> droppedMessage = new HashMap<>();
-        HashMap<String, double[]> waitLatencies = new HashMap<>();
+        HashMap<String, Double[]> waitLatencies = new HashMap<>();
 
         for (Map.Entry<String, String> tp : probe.getThreadPools().entries())
         {
diff --git 
a/src/java/org/apache/cassandra/tools/nodetool/stats/TpStatsPrinter.java 
b/src/java/org/apache/cassandra/tools/nodetool/stats/TpStatsPrinter.java
index 86bdf28..617342a 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/stats/TpStatsPrinter.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/TpStatsPrinter.java
@@ -19,8 +19,17 @@
 package org.apache.cassandra.tools.nodetool.stats;
 
 import java.io.PrintStream;
-import java.util.Collections;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Stream;
+
+import com.google.common.collect.Multimap;
+
+import org.apache.cassandra.tools.nodetool.formatter.TableBuilder;
+
+import static java.util.stream.Collectors.toList;
 
 public class TpStatsPrinter
 {
@@ -35,7 +44,6 @@ public class TpStatsPrinter
             default:
                 return new DefaultPrinter();
         }
-
     }
 
     public static class DefaultPrinter implements StatsPrinter<TpStatsHolder>
@@ -43,43 +51,65 @@ public class TpStatsPrinter
         @Override
         public void print(TpStatsHolder data, PrintStream out)
         {
-            Map<String, Object> convertData = data.convert2Map();
+            final TableBuilder poolBuilder = new TableBuilder();
+            poolBuilder.add("Pool Name", "Active", "Pending", "Completed", 
"Blocked", "All time blocked");
 
-            out.printf("%-30s%10s%10s%15s%10s%18s%n", "Pool Name", "Active", 
"Pending", "Completed", "Blocked", "All time blocked");
+            final Multimap<String, String> threadPools = 
data.probe.getThreadPools();
 
-            Map<Object, Object> threadPools = convertData.get("ThreadPools") 
instanceof Map<?, ?> ? (Map)convertData.get("ThreadPools") : 
Collections.emptyMap();
-            for (Map.Entry<Object, Object> entry : threadPools.entrySet())
+            for (final Map.Entry<String, String> tpool : threadPools.entries())
             {
-                Map values = entry.getValue() instanceof Map<?, ?> ? 
(Map)entry.getValue() : Collections.emptyMap();
-                out.printf("%-30s%10s%10s%15s%10s%18s%n",
-                           entry.getKey(),
-                           values.get("ActiveTasks"),
-                           values.get("PendingTasks"),
-                           values.get("CompletedTasks"),
-                           values.get("CurrentlyBlockedTasks"),
-                           values.get("TotalBlockedTasks"));
+                poolBuilder.add(tpool.getValue(),
+                                 
data.probe.getThreadPoolMetric(tpool.getKey(), tpool.getValue(), 
"ActiveTasks").toString(),
+                                 
data.probe.getThreadPoolMetric(tpool.getKey(), tpool.getValue(), 
"PendingTasks").toString(),
+                                 
data.probe.getThreadPoolMetric(tpool.getKey(), tpool.getValue(), 
"CompletedTasks").toString(),
+                                 
data.probe.getThreadPoolMetric(tpool.getKey(), tpool.getValue(), 
"CurrentlyBlockedTasks").toString(),
+                                 
data.probe.getThreadPoolMetric(tpool.getKey(), tpool.getValue(), 
"TotalBlockedTasks").toString());
             }
 
-            out.printf("%n%-20s%10s%18s%18s%18s%18s%n", "Message type", 
"Dropped", "", "Latency waiting in queue (micros)", "", "");
-            out.printf("%-20s%10s%18s%18s%18s%18s%n", "", "", "50%", "95%", 
"99%", "Max");
+            poolBuilder.printTo(System.out);
+
+            System.out.println("\nLatencies waiting in queue (micros) per 
dropped message types");
+
+            final TableBuilder droppedBuilder = new TableBuilder();
+            droppedBuilder.add("Message type", "Dropped    ", "50%     ", "95% 
    ", "99%     ", "Max");
+
+            final HashMap<String, Object> droppedMessage = new HashMap<>();
+            final HashMap<String, Double[]> waitLatencies = new HashMap<>();
+
+            for (final Map.Entry<String, Integer> entry : 
data.probe.getDroppedMessages().entrySet())
+            {
+                droppedMessage.put(entry.getKey(), entry.getValue());
+                try
+                {
+                    waitLatencies.put(entry.getKey(), 
data.probe.metricPercentilesAsArray(data.probe.getMessagingQueueWaitMetrics(entry.getKey())));
+                }
+                catch (RuntimeException e)
+                {
+                    // ignore the exceptions when fetching metrics
+                }
+            }
 
-            Map<Object, Object> droppedMessages = 
convertData.get("DroppedMessage") instanceof Map<?, ?> ? 
(Map)convertData.get("DroppedMessage") : Collections.emptyMap();
-            Map<Object, double[]> waitLatencies = 
convertData.get("WaitLatencies") instanceof Map<?, ?> ? 
(Map)convertData.get("WaitLatencies") : Collections.emptyMap();
-            for (Map.Entry<Object, Object> entry : droppedMessages.entrySet())
+            for (final Map.Entry<String, Object> entry : 
droppedMessage.entrySet())
             {
-                out.printf("%-20s%10s", entry.getKey(), entry.getValue());
+                final List<String> columns = Stream.of(entry.getKey(), 
entry.getValue().toString()).collect(toList());
+
                 if (waitLatencies.containsKey(entry.getKey()))
                 {
-                    double[] latencies = waitLatencies.get(entry.getKey());
-                    out.printf("%18.2f%18.2f%18.2f%18.2f", latencies[0], 
latencies[2], latencies[4], latencies[6]);
+                    final Double[] latencies = 
waitLatencies.get(entry.getKey());
+                    columns.addAll(Arrays.asList(latencies[0].toString(),
+                                                 latencies[2].toString(),
+                                                 latencies[4].toString(),
+                                                 latencies[6].toString()));
                 }
                 else
                 {
-                    out.printf("%18s%18s%18s%18s", "N/A", "N/A", "N/A", "N/A");
+                    columns.addAll(Arrays.asList("N/A", "N/A", "N/A", "N/A"));
                 }
 
-                out.printf("%n");
+                droppedBuilder.add(columns.toArray(new String[0]));
             }
+
+            droppedBuilder.printTo(System.out);
         }
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to