diff -r -u -b -B hbaseserver/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSource.java hbase-14790/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSource.java --- hbaseserver/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSource.java 2018-09-10 15:54:37.000000000 +0800 +++ hbase-14790/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSource.java 2018-09-04 16:24:44.000000000 +0800 @@ -64,4 +64,9 @@ */ void deregister(String table); + void updateGet(String table, long time); + + void updatePut(String table, long time); + + void updateScan(String table, long time); } diff -r -u -b -B hbaseserver/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSource.java hbase-14790/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSource.java --- hbaseserver/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSource.java 2018-09-10 15:02:38.000000000 +0800 +++ hbase-14790/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSource.java 2018-09-05 18:30:29.000000000 +0800 @@ -36,7 +36,13 @@ String STORE_FILE_SIZE = "storeFileSize"; String STORE_FILE_SIZE_DESC = "The size of store files size"; String TABLE_SIZE = "tableSize"; + String TABLE_SIZE_DESC = "Total size of the table in the region server"; + String GET_REQUEST_TIME = "getTime"; + String GET_REQUEST_TIME_DESC = "time of get requests"; + String PUT_REQUEST_TIME = "putTime"; + String PUT_REQUEST_TIME_DESC = "time of write requests"; + String SCAN_REQUEST_TIME = "scanTime"; + String SCAN_REQUEST_TIME_DESC = "time of scan requests"; String getTableName(); /** @@ -49,5 +55,10 @@ */ MetricsTableAggregateSource getAggregateSource(); + void updateGet(long time); + + void updatePut(long time); + + void updateScan(long time); } diff -r -u -b -B hbaseserver/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java hbase-14790/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java --- hbaseserver/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java 2018-09-10 15:08:59.000000000 +0800 +++ hbase-14790/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java 2018-09-05 18:30:08.000000000 +0800 @@ -50,21 +50,42 @@ tableSources.put(table, source); } @Override public void deregister(String table) { try { tableSources.remove(table); MetricsTableSource tableSource = tableSources.remove(table); tableSource.close(); } catch (Exception e) { // Ignored. If this errors out it means that someone is double // closing the region source and the region is already nulled out. LOG.info( "Error trying to remove " + table + " from " + this.getClass().getSimpleName(), e); - // metricsRegistry.snapshot(mrb, all); + } + } + + @Override + public void updateGet(String table, long time) { + MetricsTableSource tableSource = tableSources.get(table); + if (tableSource != null) { + tableSource.updateGet(time); + } + } + + @Override + public void updatePut(String table, long time) { + MetricsTableSource tableSource = tableSources.get(table); + if (tableSource != null) { + tableSource.updatePut(time); + } + } + + @Override + public void updateScan(String table, long time) { + MetricsTableSource tableSource = tableSources.get(table); + if (tableSource != null) { + tableSource.updateScan(time); } } /** diff -r -u -b -B hbaseserver/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java hbase-14790/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java --- hbaseserver/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java 2018-09-10 15:08:58.000000000 +0800 +++ hbase-14790/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java 2018-09-10 09:56:16.000000000 +0800 @@ -41,39 +41,55 @@ private MetricsTableWrapperAggregate tableWrapperAgg; private final MetricsTableAggregateSourceImpl agg; private final DynamicMetricsRegistry registry; private final String tableNamePrefix; private final TableName tableName; private final int hashCode; - public MetricsTableSourceImpl(String tblName, - MetricsTableAggregateSourceImpl aggregate, MetricsTableWrapperAggregate tblWrapperAgg) { + private final MutableHistogram getHis; + private final MutableHistogram putHis; + private final MutableHistogram scanHis; + public MetricsTableSourceImpl(String tblName, MetricsTableAggregateSourceImpl aggregate, + MetricsTableWrapperAggregate tblWrapperAgg) { LOG.debug("Creating new MetricsTableSourceImpl for table "); this.tableName = TableName.valueOf(tblName); this.agg = aggregate; agg.register(tblName, this); this.tableWrapperAgg = tblWrapperAgg; this.registry = agg.getMetricsRegistry(); - this.tableNamePrefix = "Namespace_" + this.tableName.getNamespaceAsString() + - "_table_" + this.tableName.getQualifierAsString() + "_metric_"; + this.tableNamePrefix = "Namespace_" + this.tableName.getNamespaceAsString() + "_table_" + + this.tableName.getQualifierAsString() + "_metric_"; this.hashCode = this.tableName.hashCode(); + getHis = registry.newHistogram("Namespace_default_table_" + tblName + "_metric_" + GET_REQUEST_TIME, + GET_REQUEST_TIME_DESC); + putHis = registry.newHistogram("Namespace_default_table_" + tblName + "_metric_" + PUT_REQUEST_TIME, + PUT_REQUEST_TIME_DESC); + scanHis = registry.newHistogram("Namespace_default_table_" + tblName + "_metric_" + SCAN_REQUEST_TIME, + SCAN_REQUEST_TIME_DESC); + } + + @Override + public void updateGet(long time) { + getHis.add(time); + } + + @Override + public void updatePut(long time) { + putHis.add(time); + } + + @Override + public void updateScan(long time) { + scanHis.add(time); } diff -r -u -b -B hbaseserver/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java hbase-14790/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java --- hbaseserver/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java 2018-09-10 15:54:36.000000000 +0800 +++ hbase-14790/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java 2018-09-06 15:17:25.000000000 +0800 @@ -728,7 +728,7 @@ // TODO: revisit if coprocessors should load in other cases this.coprocessorHost = new RegionCoprocessorHost(this, rsServices, conf); this.metricsRegionWrapper = new MetricsRegionWrapperImpl(this); - this.metricsRegion = new MetricsRegion(this.metricsRegionWrapper); + this.metricsRegion = new MetricsRegion(this.metricsRegionWrapper,this.getTableDesc().getTableName().getNameAsString()); Map recoveringRegions = rsServices.getRecoveringRegions(); String encodedName = getRegionInfo().getEncodedName(); @@ -1155,7 +1155,6 @@ public void updateWriteRequestsCount(long i) { writeRequestsCount.add(i); } @Override public long getMemstoreSize() { return memstoreSize.get(); @@ -2986,6 +2985,7 @@ WALKey walKey = null; long mvccNum = 0; long addedSize = 0; + long putStartTime = System.currentTimeMillis(); try { // ------------------------------------ // STEP 1. Try to acquire as many locks as we can, and ensure @@ -3383,6 +3383,8 @@ } batchOp.nextIndexToProcess = lastIndexExclusive; + long putStopTime = System.currentTimeMillis(); + this.metricsRegion.updatePutTime(putStopTime-putStartTime); } } @@ -6928,6 +6930,7 @@ @Override public List get(Get get, boolean withCoprocessor) throws IOException { + long getStartTime = System.currentTimeMillis(); List results = new ArrayList(); // pre-get CP hook @@ -6963,6 +6965,7 @@ this.metricsRegion.updateGet(totalSize); } + long getStopTime = System.currentTimeMillis(); + this.metricsRegion.updateGetTime(getStopTime-getStartTime); return results; } diff -r -u -b -B hbaseserver/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java hbase-14790/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java --- hbaseserver/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java 2018-09-10 15:08:21.000000000 +0800 +++ hbase-14790/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegion.java 2018-09-04 16:36:02.000000000 +0800 @@ -34,7 +34,7 @@ private String tableName; private final MetricsTableAggregateSource tableSourceAgg; - public MetricsRegion(final MetricsRegionWrapper wrapper) { + public MetricsRegion(final MetricsRegionWrapper wrapper,final String tableName) { source = CompatibilitySingletonFactory.getInstance(MetricsRegionServerSourceFactory.class) .createRegion(wrapper); @@ -60,6 +60,18 @@ source.updateGet(getSize); } + public void updateGetTime(final long time) { + tableSourceAgg.updateGet(tableName, time); + } + + public void updatePutTime(final long time) { + tableSourceAgg.updatePut(tableName, time); + } + + public void updateScanTime(final long time) { + tableSourceAgg.updateScan(tableName, time); + } + public void updateScanNext(final long scanSize) { source.updateScan(scanSize); } diff -r -u -b -B hbaseserver/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java hbase-14790/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java --- hbaseserver/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java 2018-08-30 12:29:59.000000000 +0800 +++ hbase-14790/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RSRpcServices.java 2018-09-05 17:45:01.000000000 +0800 @@ -201,7 +201,8 @@ AdminService.BlockingInterface, ClientService.BlockingInterface, PriorityFunction, ConfigurationObserver { protected static final Log LOG = LogFactory.getLog(RSRpcServices.class); + private static long scanStartTime = 0; + private static long scanStopTime = 0; /** RPC scheduler to use for the region server. */ public static final String REGION_SERVER_RPC_SCHEDULER_FACTORY_CLASS = "hbase.region.server.rpc.scheduler.factory.class"; @@ -2498,6 +2499,7 @@ // arbitrary 32. TODO: keep record of general size of results being returned. List values = new ArrayList(32); region.startRegionOperation(Operation.SCAN); + scanStartTime = System.currentTimeMillis(); try { int i = 0; synchronized(scanner) { @@ -2640,13 +2642,14 @@ builder.setScanMetrics(metricBuilder.build()); } } region.updateReadRequestsCount(i); long responseCellSize = context != null ? context.getResponseCellSize() : 0; region.getMetrics().updateScanNext(responseCellSize); if (regionServer.metricsRegionServer != null) { regionServer.metricsRegionServer.updateScannerNext(responseCellSize); } + scanStopTime = System.currentTimeMillis(); + region.getMetrics().updateScanTime(scanStopTime-scanStartTime); } finally { region.closeRegionOperation(); }