You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2020/09/02 20:54:58 UTC

[cassandra] branch trunk updated: Fix yaml format and alignment in tpstats

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 <st...@instaclustr.com>
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: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org