Repository: cassandra Updated Branches: refs/heads/cassandra-2.1 6bedeff4f -> 136abcc7a
Switch from yammer metrics for nodetool cf/proxy histograms patch by Chris Lohfink; reviewed by Aleksey Yeschenko for CASSANDRA-8662 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/136abcc7 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/136abcc7 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/136abcc7 Branch: refs/heads/cassandra-2.1 Commit: 136abcc7afb101a78b592081ebc29bc30afa5777 Parents: 6bedeff Author: Chris Lohfink <chris.lohf...@datastax.com> Authored: Thu Jan 22 18:29:55 2015 +0300 Committer: Aleksey Yeschenko <alek...@apache.org> Committed: Thu Jan 22 18:34:50 2015 +0300 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../org/apache/cassandra/tools/NodeProbe.java | 60 ++++++++++-------- .../org/apache/cassandra/tools/NodeTool.java | 65 ++++---------------- 3 files changed, 46 insertions(+), 80 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/136abcc7/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index ad9cb94..474bfbe 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.1.3 + * Switch from yammer metrics for nodetool cf/proxy histograms (CASSANDRA-8662) * Make sure we don't add tmplink files to the compaction strategy (CASSANDRA-8580) * (cqlsh) Handle maps with blob keys (CASSANDRA-8372) http://git-wip-us.apache.org/repos/asf/cassandra/blob/136abcc7/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 67cc7f1..155236f 100644 --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@ -19,10 +19,7 @@ package org.apache.cassandra.tools; import java.io.IOException; import java.io.PrintStream; -import java.lang.management.ManagementFactory; -import java.lang.management.MemoryMXBean; -import java.lang.management.MemoryUsage; -import java.lang.management.RuntimeMXBean; +import java.lang.management.*; import java.net.InetAddress; import java.net.UnknownHostException; import java.text.SimpleDateFormat; @@ -30,23 +27,13 @@ import java.util.*; import java.util.Map.Entry; import java.util.concurrent.*; import java.util.concurrent.locks.Condition; + import javax.management.*; -import javax.management.openmbean.CompositeData; -import javax.management.remote.JMXConnectionNotification; -import javax.management.remote.JMXConnector; -import javax.management.remote.JMXConnectorFactory; -import javax.management.remote.JMXServiceURL; import javax.management.openmbean.*; +import javax.management.remote.*; -import com.google.common.base.Function; -import com.google.common.collect.*; -import com.google.common.util.concurrent.Uninterruptibles; - -import com.yammer.metrics.reporting.JmxReporter; import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutorMBean; -import org.apache.cassandra.db.ColumnFamilyStoreMBean; -import org.apache.cassandra.db.HintedHandOffManager; -import org.apache.cassandra.db.HintedHandOffManagerMBean; +import org.apache.cassandra.db.*; import org.apache.cassandra.db.compaction.CompactionManager; import org.apache.cassandra.db.compaction.CompactionManagerMBean; import org.apache.cassandra.gms.FailureDetector; @@ -57,11 +44,17 @@ import org.apache.cassandra.net.MessagingService; import org.apache.cassandra.net.MessagingServiceMBean; import org.apache.cassandra.repair.RepairParallelism; import org.apache.cassandra.service.*; -import org.apache.cassandra.streaming.StreamState; import org.apache.cassandra.streaming.StreamManagerMBean; +import org.apache.cassandra.streaming.StreamState; import org.apache.cassandra.streaming.management.StreamStateCompositeData; -import org.apache.cassandra.utils.concurrent.SimpleCondition; +import org.apache.cassandra.utils.EstimatedHistogram; import org.apache.cassandra.utils.JVMStabilityInspector; +import org.apache.cassandra.utils.concurrent.SimpleCondition; + +import com.google.common.base.Function; +import com.google.common.collect.*; +import com.google.common.util.concurrent.Uninterruptibles; +import com.yammer.metrics.reporting.JmxReporter; /** * JMX client operations for Cassandra. @@ -1157,15 +1150,28 @@ public class NodeProbe implements AutoCloseable } } - public double[] metricPercentilesAsArray(JmxReporter.HistogramMBean metric) + public double[] metricPercentilesAsArray(long[] counts) { - return new double[]{ metric.get50thPercentile(), - metric.get75thPercentile(), - metric.get95thPercentile(), - metric.get98thPercentile(), - metric.get99thPercentile(), - metric.getMin(), - metric.getMax()}; + double[] offsetPercentiles = new double[] { 0.5, 0.75, 0.95, 0.98, 0.99 }; + long[] offsets = new EstimatedHistogram(counts.length).getBucketOffsets(); + EstimatedHistogram metric = new EstimatedHistogram(offsets, counts); + double[] result = new double[7]; + + if (metric.isOverflowed()) + { + System.err.println(String.format("EstimatedHistogram overflowed larger than %s, unable to calculate percentiles", + offsets[offsets.length - 1])); + for (int i = 0; i < result.length; i++) + result[i] = Double.NaN; + } + else + { + for (int i = 0; i < offsetPercentiles.length; i++) + result[i] = metric.percentile(offsetPercentiles[i]); + } + result[5] = metric.min(); + result[6] = metric.max(); + return result; } public TabularData getCompactionHistory() http://git-wip-us.apache.org/repos/asf/cassandra/blob/136abcc7/src/java/org/apache/cassandra/tools/NodeTool.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java index 12496fc..8de4fff 100644 --- a/src/java/org/apache/cassandra/tools/NodeTool.java +++ b/src/java/org/apache/cassandra/tools/NodeTool.java @@ -37,22 +37,20 @@ import com.yammer.metrics.reporting.JmxReporter; import io.airlift.command.*; import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutorMBean; -import org.apache.cassandra.config.Schema; import org.apache.cassandra.db.ColumnFamilyStoreMBean; import org.apache.cassandra.db.Keyspace; import org.apache.cassandra.db.compaction.CompactionManagerMBean; import org.apache.cassandra.db.compaction.OperationType; import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.locator.EndpointSnitchInfoMBean; -import org.apache.cassandra.locator.LocalStrategy; import org.apache.cassandra.metrics.ColumnFamilyMetrics.Sampler; import org.apache.cassandra.net.MessagingServiceMBean; import org.apache.cassandra.repair.RepairParallelism; import org.apache.cassandra.service.CacheServiceMBean; +import org.apache.cassandra.service.StorageProxyMBean; import org.apache.cassandra.streaming.ProgressInfo; import org.apache.cassandra.streaming.SessionInfo; import org.apache.cassandra.streaming.StreamState; -import org.apache.cassandra.utils.EstimatedHistogram; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.JVMStabilityInspector; @@ -1014,55 +1012,15 @@ public class NodeTool String keyspace = args.get(0); String cfname = args.get(1); - // calculate percentile of row size and column count - long[] estimatedRowSize = (long[]) probe.getColumnFamilyMetric(keyspace, cfname, "EstimatedRowSizeHistogram"); - long[] estimatedColumnCount = (long[]) probe.getColumnFamilyMetric(keyspace, cfname, "EstimatedColumnCountHistogram"); - - long[] rowSizeBucketOffsets = new EstimatedHistogram(estimatedRowSize.length).getBucketOffsets(); - long[] columnCountBucketOffsets = new EstimatedHistogram(estimatedColumnCount.length).getBucketOffsets(); - EstimatedHistogram rowSizeHist = new EstimatedHistogram(rowSizeBucketOffsets, estimatedRowSize); - EstimatedHistogram columnCountHist = new EstimatedHistogram(columnCountBucketOffsets, estimatedColumnCount); - - // build arrays to store percentile values - double[] estimatedRowSizePercentiles = new double[7]; - double[] estimatedColumnCountPercentiles = new double[7]; - double[] offsetPercentiles = new double[]{0.5, 0.75, 0.95, 0.98, 0.99}; - - if (rowSizeHist.isOverflowed()) - { - System.err.println(String.format("Row sizes are larger than %s, unable to calculate percentiles", rowSizeBucketOffsets[rowSizeBucketOffsets.length - 1])); - for (int i = 0; i < offsetPercentiles.length; i++) - estimatedRowSizePercentiles[i] = Double.NaN; - } - else - { - for (int i = 0; i < offsetPercentiles.length; i++) - estimatedRowSizePercentiles[i] = rowSizeHist.percentile(offsetPercentiles[i]); - } - - if (columnCountHist.isOverflowed()) - { - System.err.println(String.format("Column counts are larger than %s, unable to calculate percentiles", columnCountBucketOffsets[columnCountBucketOffsets.length - 1])); - for (int i = 0; i < estimatedColumnCountPercentiles.length; i++) - estimatedColumnCountPercentiles[i] = Double.NaN; - } - else - { - for (int i = 0; i < offsetPercentiles.length; i++) - estimatedColumnCountPercentiles[i] = columnCountHist.percentile(offsetPercentiles[i]); - } - - // min value - estimatedRowSizePercentiles[5] = rowSizeHist.min(); - estimatedColumnCountPercentiles[5] = columnCountHist.min(); - // max value - estimatedRowSizePercentiles[6] = rowSizeHist.max(); - estimatedColumnCountPercentiles[6] = columnCountHist.max(); + ColumnFamilyStoreMBean store = probe.getCfsProxy(keyspace, cfname); + // calculate percentile of row size and column count String[] percentiles = new String[]{"50%", "75%", "95%", "98%", "99%", "Min", "Max"}; - double[] readLatency = probe.metricPercentilesAsArray((JmxReporter.HistogramMBean) probe.getColumnFamilyMetric(keyspace, cfname, "ReadLatency")); - double[] writeLatency = probe.metricPercentilesAsArray((JmxReporter.TimerMBean) probe.getColumnFamilyMetric(keyspace, cfname, "WriteLatency")); - double[] sstablesPerRead = probe.metricPercentilesAsArray((JmxReporter.HistogramMBean) probe.getColumnFamilyMetric(keyspace, cfname, "SSTablesPerReadHistogram")); + double[] readLatency = probe.metricPercentilesAsArray(store.getRecentReadLatencyHistogramMicros()); + double[] writeLatency = probe.metricPercentilesAsArray(store.getRecentWriteLatencyHistogramMicros()); + double[] estimatedRowSizePercentiles = probe.metricPercentilesAsArray(store.getEstimatedRowSizeHistogram()); + double[] estimatedColumnCountPercentiles = probe.metricPercentilesAsArray(store.getEstimatedColumnCountHistogram()); + double[] sstablesPerRead = probe.metricPercentilesAsArray(store.getRecentSSTablesPerReadHistogram()); System.out.println(format("%s/%s histograms", keyspace, cfname)); System.out.println(format("%-10s%10s%18s%18s%18s%18s", @@ -1704,10 +1662,11 @@ public class NodeTool @Override public void execute(NodeProbe probe) { + StorageProxyMBean sp = probe.getSpProxy(); String[] percentiles = new String[]{"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[] readLatency = probe.metricPercentilesAsArray(sp.getRecentReadLatencyHistogramMicros()); + double[] writeLatency = probe.metricPercentilesAsArray(sp.getRecentWriteLatencyHistogramMicros()); + double[] rangeLatency = probe.metricPercentilesAsArray(sp.getRecentRangeLatencyHistogramMicros()); System.out.println("proxy histograms"); System.out.println(format("%-10s%18s%18s%18s",