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.0 Commit: a4c767efb58ed057bcbd11dde5140a3537d6c17f Parents: 7e3e119 Author: Joel Knighton <joel.knigh...@datastax.com> Authored: Fri Dec 4 13:07:37 2015 -0500 Committer: Joshua McKenzie <jmcken...@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