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