From 795d5324348661bdc1db0b42df1855978059c20d Mon Sep 17 00:00:00 2001 From: 01371143 Date: Wed, 11 Oct 2017 20:59:57 +0800 Subject: [PATCH] HBASE-18869 Table rpc metric --- .../hbase/regionserver/MetricsTableSource.java | 2 + .../regionserver/MetricsTableWrapperAggregate.java | 5 ++ .../hbase/regionserver/MetricsTableSourceImpl.java | 3 + .../regionserver/TestMetricsTableSourceImpl.java | 5 ++ .../apache/hadoop/hbase/regionserver/HRegion.java | 13 ++++ .../MetricsTableWrapperAggregateImpl.java | 83 ++++++++++++++++++++++ .../hadoop/hbase/regionserver/RSRpcServices.java | 2 + .../apache/hadoop/hbase/regionserver/Region.java | 11 +++ .../regionserver/MetricsTableWrapperStub.java | 5 ++ .../regionserver/TestMetricsTableAggregate.java | 1 + 10 files changed, 130 insertions(+) diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSource.java index 7d1f5d0..ec54486 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSource.java @@ -24,6 +24,8 @@ package org.apache.hadoop.hbase.regionserver; */ public interface MetricsTableSource extends Comparable { + String REQUESTS_PER_SECOND = "requestsPerSecond"; + String REQUESTS_PER_SECOND_DESC = "Requests per second"; String READ_REQUEST_COUNT = "readRequestCount"; String READ_REQUEST_COUNT_DESC = "Number fo read requests"; String WRITE_REQUEST_COUNT = "writeRequestCount"; diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.java index 85ea4f6..a99a8c4 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregate.java @@ -26,6 +26,11 @@ package org.apache.hadoop.hbase.regionserver; public interface MetricsTableWrapperAggregate { /** + * Get the number of requests per second that have been issued against this table + */ + double getRequestsPerSecond(String table); + + /** * Get the number of read requests that have been issued against this table */ long getReadRequestsCount(String table); diff --git a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java index 5d1dd79..7be961c 100644 --- a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java +++ b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java @@ -140,6 +140,9 @@ public class MetricsTableSourceImpl implements MetricsTableSource { mrb.addGauge(Interns.info(tableNamePrefix + MetricsTableSource.TABLE_SIZE, MetricsTableSource.TABLE_SIZE_DESC), tableWrapperAgg.getTableSize(tableName.getNameAsString())); + mrb.addGauge(Interns.info(tableNamePrefix + MetricsTableSource.REQUESTS_PER_SECOND, + MetricsTableSource.REQUESTS_PER_SECOND_DESC), + tableWrapperAgg.getRequestsPerSecond(tableName.getNameAsString())); } } } diff --git a/hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableSourceImpl.java b/hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableSourceImpl.java index 2717817..024844f 100644 --- a/hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableSourceImpl.java +++ b/hbase-hadoop2-compat/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableSourceImpl.java @@ -77,6 +77,11 @@ public class TestMetricsTableSourceImpl { } @Override + public double getRequestsPerSecond(String table) { + return 0.0; + } + + @Override public long getReadRequestsCount(String table) { return 10; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 29773c3..d233160 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -273,6 +273,9 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi final LongAdder filteredReadRequestsCount = new LongAdder(); final LongAdder writeRequestsCount = new LongAdder(); + // Number of read rpc request count + final LongAdder rpcReadRequestsCount = new LongAdder(); + // Number of requests blocked by memstore size. private final LongAdder blockedRequestsCount = new LongAdder(); @@ -1264,6 +1267,16 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi } @Override + public void updateRpcReadRequestsCount(long i) { + rpcReadRequestsCount.add(i); + } + + @Override + public long getRpcReadRequestsCount() { + return rpcReadRequestsCount.sum(); + } + + @Override public long getMemstoreSize() { return memstoreDataSize.get(); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java index c5f0f7b..ea4521c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperAggregateImpl.java @@ -32,6 +32,7 @@ import org.apache.hadoop.hbase.CompatibilitySingletonFactory; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.classification.InterfaceAudience; +import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; import org.apache.hadoop.metrics2.MetricsExecutor; import com.google.common.collect.Sets; @@ -57,6 +58,9 @@ public class MetricsTableWrapperAggregateImpl implements MetricsTableWrapperAggr public class TableMetricsWrapperRunnable implements Runnable { + private long lastRan = 0; + private ConcurrentHashMap lastRequestMap = new ConcurrentHashMap(); + @Override public void run() { Map localMetricsTableMap = new HashMap<>(); @@ -78,8 +82,42 @@ public class MetricsTableWrapperAggregateImpl implements MetricsTableWrapperAggr metricsTable.setReadRequestsCount(metricsTable.getReadRequestsCount() + r.getReadRequestsCount()); metricsTable.setWriteRequestsCount(metricsTable.getWriteRequestsCount() + r.getWriteRequestsCount()); metricsTable.setTotalRequestsCount(metricsTable.getReadRequestsCount() + metricsTable.getWriteRequestsCount()); + metricsTable.setRpcReadRequestsCount(metricsTable.getRpcReadRequestsCount() + r.getRpcReadRequestsCount()); } + // Compute table number of requests per second + long currentTime = EnvironmentEdgeManager.currentTime(); + // assume that it took PERIOD seconds to start the executor. + // this is a guess but it's a pretty good one. + if (lastRan == 0) { + lastRan = currentTime - period; + } + // If we've time traveled keep the last requests per second. + if ((currentTime - lastRan) > 0) { + for (Map.Entry entry : localMetricsTableMap.entrySet()) { + TableName tbl = entry.getKey(); + MetricsTableValues metricsTable = localMetricsTableMap.get(tbl); + long currentRequestCount = metricsTable.getWriteRequestsCount() + metricsTable.getRpcReadRequestsCount(); + Long tempLastRequest = lastRequestMap.get(tbl.getNameAsString()); + if (tempLastRequest == null) { + lastRequestMap.put(tbl.getNameAsString(), 0L); + } + long lastRequestCount = lastRequestMap.get(tbl.getNameAsString()); + double requestsPerSecond = + (currentRequestCount - lastRequestCount) / ((currentTime - lastRan) / 1000.0); + lastRequestCount = currentRequestCount; + lastRequestMap.put(tbl.getNameAsString(), lastRequestCount); + + if (metricsTable == null) { + metricsTable = new MetricsTableValues(); + localMetricsTableMap.put(tbl, metricsTable); + } + + metricsTable.setRequestsPerSecond(requestsPerSecond); + } + } + lastRan = currentTime; + for(Map.Entry entry : localMetricsTableMap.entrySet()) { TableName tbl = entry.getKey(); if (metricsTableMap.get(tbl) == null) { @@ -106,6 +144,15 @@ public class MetricsTableWrapperAggregateImpl implements MetricsTableWrapperAggr } @Override + public double getRequestsPerSecond(String table) { + MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table)); + if (metricsTable == null) { + return 0.0; + } + return metricsTable.getRequestsPerSecond(); + } + + @Override public long getReadRequestsCount(String table) { MetricsTableValues metricsTable = metricsTableMap.get(TableName.valueOf(table)); if (metricsTable == null) @@ -166,6 +213,10 @@ public class MetricsTableWrapperAggregateImpl implements MetricsTableWrapperAggr private static class MetricsTableValues { + private double requestsPerSecond; + private double readPerSecond; + private double writePerSecond; + private long rpcReadRequestsCount; private long totalRequestsCount; private long readRequestsCount; private long writeRequestsCount; @@ -173,6 +224,38 @@ public class MetricsTableWrapperAggregateImpl implements MetricsTableWrapperAggr private long storeFilesSize; private long tableSize; + public double getRequestsPerSecond() { + return requestsPerSecond; + } + + public void setRequestsPerSecond(double requestsPerSecond) { + this.requestsPerSecond = requestsPerSecond; + } + + public double getReadPerSecond() { + return readPerSecond; + } + + public void setReadPerSecond(double readPerSecond) { + this.readPerSecond = readPerSecond; + } + + public double getWritePerSecond() { + return writePerSecond; + } + + public void setWritePerSecond(double writePerSecond) { + this.writePerSecond = writePerSecond; + } + + public long getRpcReadRequestsCount() { + return rpcReadRequestsCount; + } + + public void setRpcReadRequestsCount(long rpcReadRequestsCount) { + this.rpcReadRequestsCount = rpcReadRequestsCount; + } + public long getTotalRequestsCount() { return totalRequestsCount; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java index 7312852..9646003 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java @@ -2250,6 +2250,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, requestCount.increment(); rpcGetRequestCount.increment(); Region region = getRegion(request.getRegion()); + region.updateRpcReadRequestsCount(1L); GetResponse.Builder builder = GetResponse.newBuilder(); ClientProtos.Get get = request.getGet(); @@ -2976,6 +2977,7 @@ public class RSRpcServices implements HBaseRPCErrorHandler, throw new ServiceException(e); } Region region = rsh.r; + region.updateRpcReadRequestsCount(1L); String scannerName = rsh.scannerName; Leases.Lease lease; try { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Region.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Region.java index 295b825..f90918c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Region.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Region.java @@ -197,6 +197,17 @@ public interface Region extends ConfigurationObserver { void updateWriteRequestsCount(long i); /** + * Update the rpc request count for this region + * @param i + */ + void updateRpcReadRequestsCount(long i); + + /** + * @return read rpc request count + */ + long getRpcReadRequestsCount(); + + /** * @return memstore size for this region, in bytes. It just accounts data size of cells added to * the memstores of this Region. Means size in bytes for key, value and tags within Cells. * It wont consider any java heap overhead for the cell objects or any other. diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperStub.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperStub.java index 6fd8dd7..ef455f5 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperStub.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/MetricsTableWrapperStub.java @@ -27,6 +27,11 @@ public class MetricsTableWrapperStub implements MetricsTableWrapperAggregate { } @Override + public double getRequestsPerSecond(String table) { + return 0.0; + } + + @Override public long getReadRequestsCount(String table) { return 10; } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableAggregate.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableAggregate.java index c114298..4787e1f 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableAggregate.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMetricsTableAggregate.java @@ -48,5 +48,6 @@ public class TestMetricsTableAggregate { HELPER.assertGauge("Namespace_default_table_testTableMetrics_metric_memstoreSize", 1000, agg); HELPER.assertGauge("Namespace_default_table_testTableMetrics_metric_storeFileSize", 2000, agg); HELPER.assertGauge("Namespace_default_table_testTableMetrics_metric_tableSize", 3000, agg); + HELPER.assertGauge("Namespace_default_table_testTableMetrics_metric_requestsPerSecond", 0.0, agg); } } \ No newline at end of file -- 2.10.1.windows.1