Backport proxyhistograms to 1.1, print zero instead of blank values. Patch by Alexey Zotov, reviewed by brandonwilliams for CASSANDRA-4656
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/b43cc362 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/b43cc362 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/b43cc362 Branch: refs/heads/trunk Commit: b43cc362aa568a46bc53e545c68518b0bd350b76 Parents: e6326e9 Author: Brandon Williams <[email protected]> Authored: Wed Sep 19 06:11:22 2012 -0500 Committer: Brandon Williams <[email protected]> Committed: Wed Sep 19 06:11:22 2012 -0500 ---------------------------------------------------------------------- .../org/apache/cassandra/service/StorageProxy.java | 3 +- src/java/org/apache/cassandra/tools/NodeCmd.java | 39 +++++++++++++-- src/java/org/apache/cassandra/tools/NodeProbe.java | 12 +++- 3 files changed, 45 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/b43cc362/src/java/org/apache/cassandra/service/StorageProxy.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java index 23e0de4..bc45e84 100644 --- a/src/java/org/apache/cassandra/service/StorageProxy.java +++ b/src/java/org/apache/cassandra/service/StorageProxy.java @@ -63,6 +63,7 @@ import org.apache.cassandra.utils.*; public class StorageProxy implements StorageProxyMBean { + public static final String MBEAN_NAME = "org.apache.cassandra.db:type=StorageProxy"; private static final Logger logger = LoggerFactory.getLogger(StorageProxy.class); private static final boolean OPTIMIZE_LOCAL_REQUESTS = true; // set to false to test messagingservice path on single node @@ -99,7 +100,7 @@ public class StorageProxy implements StorageProxyMBean MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); try { - mbs.registerMBean(new StorageProxy(), new ObjectName("org.apache.cassandra.db:type=StorageProxy")); + mbs.registerMBean(new StorageProxy(), new ObjectName(MBEAN_NAME)); } catch (Exception e) { http://git-wip-us.apache.org/repos/asf/cassandra/blob/b43cc362/src/java/org/apache/cassandra/tools/NodeCmd.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/NodeCmd.java b/src/java/org/apache/cassandra/tools/NodeCmd.java index d0ec068..4d2790d 100644 --- a/src/java/org/apache/cassandra/tools/NodeCmd.java +++ b/src/java/org/apache/cassandra/tools/NodeCmd.java @@ -33,6 +33,7 @@ import java.util.Map.Entry; import java.util.concurrent.ExecutionException; import org.apache.cassandra.service.CacheServiceMBean; +import org.apache.cassandra.service.StorageProxyMBean; import org.apache.commons.cli.*; import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutorMBean; @@ -107,6 +108,7 @@ public class NodeCmd JOIN, MOVE, NETSTATS, + PROXYHISTOGRAMS, REBUILD, REFRESH, REMOVETOKEN, @@ -145,6 +147,7 @@ public class NodeCmd addCmdHelp(header, "cfstats", "Print statistics on column families"); addCmdHelp(header, "version", "Print cassandra version"); addCmdHelp(header, "tpstats", "Print usage statistics of thread pools"); + addCmdHelp(header, "proxyhistograms", "Print statistic histograms for network operations"); addCmdHelp(header, "drain", "Drain the node (stop accepting writes and flush all column families)"); addCmdHelp(header, "decommission", "Decommission the *node I am connecting to*"); addCmdHelp(header, "compactionstats", "Print statistics on compactions"); @@ -600,14 +603,35 @@ public class NodeCmd { output.println(String.format("%-10d%10s%18s%18s%18s%18s", offsets[i], - (i < sprh.length ? sprh[i] : ""), - (i < rwlh.length ? rwlh[i] : ""), - (i < rrlh.length ? rrlh[i] : ""), - (i < ersh.length ? ersh[i] : ""), - (i < ecch.length ? ecch[i] : ""))); + (i < sprh.length ? sprh[i] : "0"), + (i < rwlh.length ? rwlh[i] : "0"), + (i < rrlh.length ? rrlh[i] : "0"), + (i < ersh.length ? ersh[i] : "0"), + (i < ecch.length ? ecch[i] : "0"))); } } + private void printProxyHistograms(PrintStream output) + { + StorageProxyMBean sp = this.probe.getSpProxy(); + long[] offsets = new EstimatedHistogram().getBucketOffsets(); + long[] rrlh = sp.getRecentReadLatencyHistogramMicros(); + long[] rwlh = sp.getRecentWriteLatencyHistogramMicros(); + long[] rrnglh = sp.getRecentRangeLatencyHistogramMicros(); + + output.println("proxy histograms"); + output.println(String.format("%-10s%10s%18s%18s", + "Offset", "Read Latency", "Write Latency", "Range Latency")); + for (int i = 0; i < offsets.length; i++) + { + output.println(String.format("%-10d%18s%18s%18s", + offsets[i], + (i < rrlh.length ? rrlh[i] : "0"), + (i < rwlh.length ? rwlh[i] : "0"), + (i < rrnglh.length ? rrnglh[i] : "0"))); + } + } + private void printEndPoints(String keySpace, String cf, String key, PrintStream output) { List<InetAddress> endpoints = this.probe.getEndpoints(keySpace, cf, key); @@ -845,6 +869,11 @@ public class NodeCmd nodeCmd.printSSTables(arguments[0], arguments[1], arguments[2], System.out); break; + case PROXYHISTOGRAMS : + if (arguments.length != 0) { badUse("proxyhistograms does not take arguments"); } + nodeCmd.printProxyHistograms(System.out); + break; + case REFRESH: if (arguments.length != 2) { badUse("load_new_sstables requires ks and cf args"); } probe.loadNewSSTables(arguments[0], arguments[1]); http://git-wip-us.apache.org/repos/asf/cassandra/blob/b43cc362/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 c40891c..3ed4524 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -47,9 +47,7 @@ import org.apache.cassandra.gms.FailureDetectorMBean; import org.apache.cassandra.locator.EndpointSnitchInfoMBean; import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.net.MessagingServiceMBean; -import org.apache.cassandra.service.CacheService; -import org.apache.cassandra.service.CacheServiceMBean; -import org.apache.cassandra.service.StorageServiceMBean; +import org.apache.cassandra.service.*; import org.apache.cassandra.streaming.StreamingService; import org.apache.cassandra.streaming.StreamingServiceMBean; import org.apache.cassandra.thrift.InvalidRequestException; @@ -78,6 +76,7 @@ public class NodeProbe public MessagingServiceMBean msProxy; private FailureDetectorMBean fdProxy; private CacheServiceMBean cacheService; + private StorageProxyMBean spProxy; /** * Creates a NodeProbe using the specified JMX host, port, username, and password. @@ -156,6 +155,8 @@ public class NodeProbe fdProxy = JMX.newMBeanProxy(mbeanServerConn, name, FailureDetectorMBean.class); name = new ObjectName(CacheService.MBEAN_NAME); cacheService = JMX.newMBeanProxy(mbeanServerConn, name, CacheServiceMBean.class); + name = new ObjectName(StorageProxy.MBEAN_NAME); + spProxy = JMX.newMBeanProxy(mbeanServerConn, name, StorageProxyMBean.class); } catch (MalformedObjectNameException e) { throw new RuntimeException( @@ -552,6 +553,11 @@ public class NodeProbe return cfsProxy; } + public StorageProxyMBean getSpProxy() + { + return spProxy; + } + public String getEndpoint() { // Try to find the endpoint using the local token, doing so in a crazy manner
