From 4ee77c3231998fc9d5545009cfab0530c02a32f7 Mon Sep 17 00:00:00 2001 From: Sanjeet Nishad Date: Sat, 2 May 2020 13:00:50 +0530 Subject: [PATCH] HBASE-23996 Many split related metrics were present RS side but after split is moved to Master, these metrics are lost. --- .../hbase/master/MetricsMasterProcSource.java | 15 ++ .../master/MetricsMasterProcSourceImpl.java | 17 +- .../hbase/master/MetricsMasterWrapper.java | 22 ++ .../master/MetricsMasterWrapperStub.java | 200 ++++++++++++++++++ .../TestMetricsMasterProcSourceImpl.java | 30 +++ .../master/MetricsMasterWrapperImpl.java | 28 +++ 6 files changed, 310 insertions(+), 2 deletions(-) create mode 100644 hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperStub.java diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSource.java index db4f25ec03..6bf6ed7d88 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSource.java @@ -52,4 +52,19 @@ public interface MetricsMasterProcSource extends BaseSource { String NUM_MASTER_WALS_DESC = "Number of master WAL files"; + String NUM_SPLIT_PROCEDURE_REQUEST_NAME = "splitProcedure_RequestCount"; + + String NUM_SPLIT_PROCEDURE_REQUEST_DESC = "Number of split requests"; + + String NUM_SPLIT_PROCEDURE_FAILED_NAME = "splitProcedure_FailedCount"; + + String NUM_SPLIT_PROCEDURE_FAILED_DESC = "Number of split requests which failed"; + + String NUM_SPLIT_PROCEDURE_SUCCESS_NAME = "splitProcedure_SuccessCount"; + + String NUM_SPLIT_PROCEDURE_SUCCESS_DESC = "Number of split requests which were successful"; + + String SPLIT_PROCEDURE_TIME_HISTO_NAME = "splitProcedureTime"; + + String SPLIT_PROCEDURE_TIME_HISTO_DESC = "Split procedure time histogram"; } diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSourceImpl.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSourceImpl.java index c51cd10d95..8c7a010272 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSourceImpl.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSourceImpl.java @@ -22,6 +22,7 @@ import org.apache.hadoop.hbase.metrics.BaseSourceImpl; import org.apache.hadoop.hbase.metrics.Interns; import org.apache.hadoop.metrics2.MetricsCollector; import org.apache.hadoop.metrics2.MetricsRecordBuilder; +import org.apache.hadoop.metrics2.lib.MutableHistogram; import org.apache.yetus.audience.InterfaceAudience; /** @@ -65,8 +66,20 @@ public class MetricsMasterProcSourceImpl // masterWrapper can be null because this function is called inside of init. if (masterWrapper != null) { metricsRecordBuilder - .addGauge(Interns.info(NUM_MASTER_WALS_NAME, NUM_MASTER_WALS_DESC), - masterWrapper.getNumWALFiles()); + .addGauge(Interns.info(NUM_MASTER_WALS_NAME, NUM_MASTER_WALS_DESC), + masterWrapper.getNumWALFiles()); + metricsRecordBuilder + .addGauge(Interns.info(NUM_SPLIT_PROCEDURE_REQUEST_NAME, NUM_SPLIT_PROCEDURE_REQUEST_DESC), + masterWrapper.getSplitProcedureRequestCount()); + metricsRecordBuilder + .addGauge(Interns.info(NUM_SPLIT_PROCEDURE_FAILED_NAME, NUM_SPLIT_PROCEDURE_FAILED_DESC), + masterWrapper.getSplitProcedureFailureCount()); + metricsRecordBuilder + .addGauge(Interns.info(NUM_SPLIT_PROCEDURE_SUCCESS_NAME, NUM_SPLIT_PROCEDURE_SUCCESS_DESC), + masterWrapper.getSplitProcedureSuccessCount()); + + MutableHistogram.snapshot(SPLIT_PROCEDURE_TIME_HISTO_NAME, SPLIT_PROCEDURE_TIME_HISTO_DESC, + masterWrapper.getSplitProcedureTimeHisto(), metricsRecordBuilder, all); } metricsRegistry.snapshot(metricsRecordBuilder, all); diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java index 77b357f315..4e7c653b77 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapper.java @@ -20,6 +20,8 @@ package org.apache.hadoop.hbase.master; import java.util.Map; import java.util.Map.Entry; + +import org.apache.hadoop.hbase.metrics.Histogram; import org.apache.hadoop.hbase.util.PairOfSameType; import org.apache.yetus.audience.InterfaceAudience; @@ -154,4 +156,24 @@ public interface MetricsMasterWrapper { * @return pair of count for online regions and offline regions */ PairOfSameType getRegionCounts(); + + /** + * Get the number of split procedure requests coming to master. + */ + long getSplitProcedureRequestCount(); + + /** + * Get the number of split procedure requests which failed during procedure execution. + */ + long getSplitProcedureFailureCount(); + + /** + * Get the number of split procedure requests which were successful. + */ + long getSplitProcedureSuccessCount(); + + /** + * Get the split Procedure Time Histogram. + */ + Histogram getSplitProcedureTimeHisto(); } diff --git a/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperStub.java b/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperStub.java new file mode 100644 index 0000000000..7d777071e2 --- /dev/null +++ b/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperStub.java @@ -0,0 +1,200 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.hbase.master; + +import org.apache.hadoop.hbase.metrics.Histogram; +import org.apache.hadoop.hbase.metrics.Snapshot; +import org.apache.hadoop.hbase.util.PairOfSameType; + +import java.util.Map; + +public class MetricsMasterWrapperStub implements MetricsMasterWrapper { + + @Override public boolean isRunning() { + return false; + } + + @Override public String getServerName() { + return null; + } + + @Override public double getAverageLoad() { + return 0; + } + + @Override public String getClusterId() { + return null; + } + + @Override public String getZookeeperQuorum() { + return null; + } + + @Override public String[] getCoprocessors() { + return new String[0]; + } + + @Override public long getStartTime() { + return 0; + } + + @Override public long getActiveTime() { + return 0; + } + + @Override public boolean getIsActiveMaster() { + return false; + } + + @Override public String getRegionServers() { + return null; + } + + @Override public int getNumRegionServers() { + return 0; + } + + @Override public String getDeadRegionServers() { + return null; + } + + @Override public int getNumDeadRegionServers() { + return 0; + } + + @Override public long getNumWALFiles() { + return 0; + } + + @Override public long getSplitPlanCount() { + return 0; + } + + @Override public long getMergePlanCount() { + return 0; + } + + @Override public Map> getTableSpaceUtilization() { + return null; + } + + @Override public Map> getNamespaceSpaceUtilization() { + return null; + } + + @Override public long getMasterInitializationTime() { + return 0; + } + + @Override public PairOfSameType getRegionCounts() { + return null; + } + + @Override public long getSplitProcedureRequestCount() { + return 32; + } + + @Override public long getSplitProcedureFailureCount() { + return 8; + } + + @Override public long getSplitProcedureSuccessCount() { + return 24; + } + + @Override public Histogram getSplitProcedureTimeHisto() { + return new Histogram() { + @Override public void update(int value) { + + } + + @Override public void update(long value) { + + } + + @Override public long getCount() { + return 24; + } + + @Override public Snapshot snapshot() { + return new Snapshot() { + @Override public long[] getQuantiles(double[] quantiles) { + return new long[0]; + } + + @Override public long[] getQuantiles() { + return new long[0]; + } + + @Override public long getCount() { + return 0; + } + + @Override public long getCountAtOrBelow(long val) { + return 0; + } + + @Override public long get25thPercentile() { + return 2082; + } + + @Override public long get75thPercentile() { + return 2082; + } + + @Override public long get90thPercentile() { + return 2082; + } + + @Override public long get95thPercentile() { + return 2082; + } + + @Override public long get98thPercentile() { + return 2082; + } + + @Override public long get99thPercentile() { + return 2082; + } + + @Override public long get999thPercentile() { + return 2082; + } + + @Override public long getMedian() { + return 2082; + } + + @Override public long getMax() { + return 2082; + } + + @Override public long getMean() { + return 2082; + } + + @Override public long getMin() { + return 2082; + } + }; + } + }; + } +} diff --git a/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/master/TestMetricsMasterProcSourceImpl.java b/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/master/TestMetricsMasterProcSourceImpl.java index d95c282ecf..c8c74080ac 100644 --- a/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/master/TestMetricsMasterProcSourceImpl.java +++ b/hbase-hadoop-compat/src/test/java/org/apache/hadoop/hbase/master/TestMetricsMasterProcSourceImpl.java @@ -17,13 +17,18 @@ */ package org.apache.hadoop.hbase.master; +import static org.apache.hadoop.hbase.master.MetricsMasterProcSource.*; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; +import org.apache.hadoop.hbase.CompatibilityFactory; import org.apache.hadoop.hbase.CompatibilitySingletonFactory; import org.apache.hadoop.hbase.HBaseClassTestRule; +import org.apache.hadoop.hbase.test.MetricsAssertHelper; import org.apache.hadoop.hbase.testclassification.MetricsTests; import org.apache.hadoop.hbase.testclassification.SmallTests; +import org.junit.Before; +import org.junit.BeforeClass; import org.junit.ClassRule; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -38,6 +43,23 @@ public class TestMetricsMasterProcSourceImpl { public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule.forClass(TestMetricsMasterProcSourceImpl.class); + public static MetricsAssertHelper HELPER = + CompatibilityFactory.getInstance(MetricsAssertHelper.class); + + private MetricsMasterWrapperStub wrapper; + private MetricsMasterProcSourceImpl masterProcSource; + + @BeforeClass + public static void classSetup() { + HELPER.init(); + } + + @Before + public void setUp() { + wrapper = new MetricsMasterWrapperStub(); + masterProcSource = new MetricsMasterProcSourceImpl(wrapper); + } + @Test public void testGetInstance() throws Exception { MetricsMasterProcSourceFactory metricsMasterProcSourceFactory = CompatibilitySingletonFactory @@ -48,4 +70,12 @@ public class TestMetricsMasterProcSourceImpl { CompatibilitySingletonFactory.getInstance(MetricsMasterProcSourceFactory.class)); } + @Test + public void testSplitProcedureMetrics() { + HELPER.assertGauge(NUM_SPLIT_PROCEDURE_REQUEST_NAME, 32, masterProcSource); + HELPER.assertGauge(NUM_SPLIT_PROCEDURE_FAILED_NAME, 8, masterProcSource); + HELPER.assertGauge(NUM_SPLIT_PROCEDURE_SUCCESS_NAME, 24, masterProcSource); + HELPER.assertGauge("SplitProcedureTime_max", 2082, masterProcSource); + HELPER.assertGauge("SplitProcedureTime_min", 2082, masterProcSource); + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java index caf43247e5..75a494a5fc 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java @@ -30,6 +30,8 @@ import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.TableDescriptor; +import org.apache.hadoop.hbase.metrics.Histogram; +import org.apache.hadoop.hbase.procedure2.ProcedureMetrics; import org.apache.yetus.audience.InterfaceAudience; import org.apache.hadoop.hbase.quotas.QuotaObserverChore; import org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot; @@ -214,4 +216,30 @@ public class MetricsMasterWrapperImpl implements MetricsMasterWrapper { return new PairOfSameType<>(0, 0); } } + + @Override + public long getSplitProcedureRequestCount() { + return master.getAssignmentManager().getAssignmentManagerMetrics().getSplitProcMetrics() + .getSubmittedCounter().getCount(); + } + + @Override + public long getSplitProcedureFailureCount() { + return master.getAssignmentManager().getAssignmentManagerMetrics().getSplitProcMetrics() + .getFailedCounter().getCount(); + } + + @Override + public long getSplitProcedureSuccessCount() { + ProcedureMetrics splitProcMetrics = + master.getAssignmentManager().getAssignmentManagerMetrics().getSplitProcMetrics(); + return splitProcMetrics.getSubmittedCounter().getCount() - splitProcMetrics.getFailedCounter() + .getCount(); + } + + @Override + public Histogram getSplitProcedureTimeHisto() { + return master.getAssignmentManager().getAssignmentManagerMetrics().getSplitProcMetrics() + .getTimeHisto(); + } } -- 2.21.0.windows.1