You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jm...@apache.org on 2015/12/04 19:11:05 UTC

[04/13] cassandra git commit: Add stats back to nodetool tpstats output

Add stats back to nodetool tpstats output

Patch by jknighton; reviewed by pmotta for CASSANDRA-10018


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

Branch: refs/heads/cassandra-3.1
Commit: a4c767efb58ed057bcbd11dde5140a3537d6c17f
Parents: 7e3e119
Author: Joel Knighton <jo...@datastax.com>
Authored: Fri Dec 4 13:07:37 2015 -0500
Committer: Joshua McKenzie <jm...@apache.org>
Committed: Fri Dec 4 13:07:37 2015 -0500

----------------------------------------------------------------------
 .../cassandra/metrics/ThreadPoolMetrics.java    | 31 +++++++++++++++++++-
 .../org/apache/cassandra/tools/NodeProbe.java   | 15 ++++++++--
 .../cassandra/tools/nodetool/TpStats.java       | 19 +++++++-----
 .../apache/cassandra/utils/StatusLogger.java    | 15 +++++-----
 4 files changed, 61 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/a4c767ef/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java b/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java
index fba92c4..268e878 100644
--- a/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java
@@ -17,6 +17,8 @@
  */
 package org.apache.cassandra.metrics;
 
+import java.io.IOException;
+import java.util.Set;
 import java.util.concurrent.ThreadPoolExecutor;
 
 import com.codahale.metrics.Counter;
@@ -25,8 +27,12 @@ import com.codahale.metrics.JmxReporter;
 
 import javax.management.JMX;
 import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+
 import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics;
 
 
@@ -106,7 +112,6 @@ public class ThreadPoolMetrics
         Metrics.remove(factory.createMetricName("MaxPoolSize"));
     }
 
-
     public static Object getJmxMetric(MBeanServerConnection mbeanServerConn, String jmxPath, String poolName, String metricName)
     {
         String name = String.format("org.apache.cassandra.metrics:type=ThreadPools,path=%s,scope=%s,name=%s", jmxPath, poolName, metricName);
@@ -138,4 +143,28 @@ public class ThreadPoolMetrics
         }
     }
 
+    public static Multimap<String, String> getJmxThreadPools(MBeanServerConnection mbeanServerConn)
+    {
+        try
+        {
+            Multimap<String, String> threadPools = HashMultimap.create();
+            Set<ObjectName> threadPoolObjectNames = mbeanServerConn.queryNames(new ObjectName("org.apache.cassandra.metrics:type=ThreadPools,*"),
+                                                                               null);
+            for (ObjectName oName : threadPoolObjectNames)
+            {
+                threadPools.put(oName.getKeyProperty("path"), oName.getKeyProperty("scope"));
+            }
+
+            return threadPools;
+        }
+        catch (MalformedObjectNameException e)
+        {
+            throw new RuntimeException("Bad query to JMX server: ", e);
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException("Error getting threadpool names from JMX", e);
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a4c767ef/src/java/org/apache/cassandra/tools/NodeProbe.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java
index 691604f..dbc0357 100644
--- a/src/java/org/apache/cassandra/tools/NodeProbe.java
+++ b/src/java/org/apache/cassandra/tools/NodeProbe.java
@@ -53,7 +53,6 @@ import javax.management.remote.JMXConnectorFactory;
 import javax.management.remote.JMXServiceURL;
 import javax.rmi.ssl.SslRMIClientSocketFactory;
 
-import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.db.ColumnFamilyStoreMBean;
 import org.apache.cassandra.db.HintedHandOffManager;
 import org.apache.cassandra.db.HintedHandOffManagerMBean;
@@ -84,6 +83,7 @@ import org.apache.cassandra.streaming.management.StreamStateCompositeData;
 import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Uninterruptibles;
 
@@ -1068,9 +1068,18 @@ public class NodeProbe implements AutoCloseable
         }
     }
 
-    public Object getThreadPoolMetric(Stage stage, String metricName)
+    public Object getThreadPoolMetric(String pathName, String poolName, String metricName)
     {
-        return ThreadPoolMetrics.getJmxMetric(mbeanServerConn, stage.getJmxType(), stage.getJmxName(), metricName);
+        return ThreadPoolMetrics.getJmxMetric(mbeanServerConn, pathName, poolName, metricName);
+    }
+
+    /**
+     * Retrieve threadpool paths and names for threadpools with metrics.
+     * @return Multimap from path (internal, request, etc.) to name
+     */
+    public Multimap<String, String> getThreadPools()
+    {
+        return ThreadPoolMetrics.getJmxThreadPools(mbeanServerConn);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a4c767ef/src/java/org/apache/cassandra/tools/nodetool/TpStats.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/tools/nodetool/TpStats.java b/src/java/org/apache/cassandra/tools/nodetool/TpStats.java
index 4a17c4c..f3448ab 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/TpStats.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/TpStats.java
@@ -21,7 +21,8 @@ import io.airlift.command.Command;
 
 import java.util.Map;
 
-import org.apache.cassandra.concurrent.Stage;
+import com.google.common.collect.Multimap;
+
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
 
@@ -33,15 +34,17 @@ public class TpStats extends NodeToolCmd
     {
         System.out.printf("%-25s%10s%10s%15s%10s%18s%n", "Pool Name", "Active", "Pending", "Completed", "Blocked", "All time blocked");
 
-        for (Stage stage : Stage.jmxEnabledStages())
+        Multimap<String, String> threadPools = probe.getThreadPools();
+
+        for (Map.Entry<String, String> tpool : threadPools.entries())
         {
             System.out.printf("%-25s%10s%10s%15s%10s%18s%n",
-                              stage.getJmxName(),
-                              probe.getThreadPoolMetric(stage, "ActiveTasks"),
-                              probe.getThreadPoolMetric(stage, "PendingTasks"),
-                              probe.getThreadPoolMetric(stage, "CompletedTasks"),
-                              probe.getThreadPoolMetric(stage, "CurrentlyBlockedTasks"),
-                              probe.getThreadPoolMetric(stage, "TotalBlockedTasks"));
+                              tpool.getValue(),
+                              probe.getThreadPoolMetric(tpool.getKey(), tpool.getValue(), "ActiveTasks"),
+                              probe.getThreadPoolMetric(tpool.getKey(), tpool.getValue(), "PendingTasks"),
+                              probe.getThreadPoolMetric(tpool.getKey(), tpool.getValue(), "CompletedTasks"),
+                              probe.getThreadPoolMetric(tpool.getKey(), tpool.getValue(), "CurrentlyBlockedTasks"),
+                              probe.getThreadPoolMetric(tpool.getKey(), tpool.getValue(), "TotalBlockedTasks"));
         }
 
         System.out.printf("%n%-20s%10s%n", "Message type", "Dropped");

http://git-wip-us.apache.org/repos/asf/cassandra/blob/a4c767ef/src/java/org/apache/cassandra/utils/StatusLogger.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/StatusLogger.java b/src/java/org/apache/cassandra/utils/StatusLogger.java
index 5f4eaf2..712e8f7 100644
--- a/src/java/org/apache/cassandra/utils/StatusLogger.java
+++ b/src/java/org/apache/cassandra/utils/StatusLogger.java
@@ -18,6 +18,7 @@
 package org.apache.cassandra.utils;
 
 import java.lang.management.ManagementFactory;
+import java.util.Map;
 import java.util.Set;
 import javax.management.*;
 
@@ -50,15 +51,15 @@ public class StatusLogger
         // everything from o.a.c.concurrent
         logger.info(String.format("%-25s%10s%10s%15s%10s%18s", "Pool Name", "Active", "Pending", "Completed", "Blocked", "All Time Blocked"));
 
-        for (Stage stage : Stage.jmxEnabledStages())
+        for (Map.Entry<String, String> tpool : ThreadPoolMetrics.getJmxThreadPools(server).entries())
         {
             logger.info(String.format("%-25s%10s%10s%15s%10s%18s%n",
-                              stage.getJmxName(),
-                              ThreadPoolMetrics.getJmxMetric(server, stage.getJmxType(), stage.getJmxName(), "ActiveTasks"),
-                              ThreadPoolMetrics.getJmxMetric(server, stage.getJmxType(), stage.getJmxName(), "PendingTasks"),
-                              ThreadPoolMetrics.getJmxMetric(server, stage.getJmxType(), stage.getJmxName(), "CompletedTasks"),
-                              ThreadPoolMetrics.getJmxMetric(server, stage.getJmxType(), stage.getJmxName(), "CurrentlyBlockedTasks"),
-                              ThreadPoolMetrics.getJmxMetric(server, stage.getJmxType(), stage.getJmxName(), "TotalBlockedTasks")));
+                                      tpool.getValue(),
+                                      ThreadPoolMetrics.getJmxMetric(server, tpool.getKey(), tpool.getValue(), "ActiveTasks"),
+                                      ThreadPoolMetrics.getJmxMetric(server, tpool.getKey(), tpool.getValue(), "PendingTasks"),
+                                      ThreadPoolMetrics.getJmxMetric(server, tpool.getKey(), tpool.getValue(), "CompletedTasks"),
+                                      ThreadPoolMetrics.getJmxMetric(server, tpool.getKey(), tpool.getValue(), "CurrentlyBlockedTasks"),
+                                      ThreadPoolMetrics.getJmxMetric(server, tpool.getKey(), tpool.getValue(), "TotalBlockedTasks")));
         }
 
         // one offs