You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2015/01/22 16:34:59 UTC
cassandra git commit: Switch from yammer metrics for nodetool
cf/proxy histograms
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 <Ch...@datastax.com>
Authored: Thu Jan 22 18:29:55 2015 +0300
Committer: Aleksey Yeschenko <al...@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",