From 4b6ff7828bdc1cd73af27a0556d049eaf29f980d Mon Sep 17 00:00:00 2001 From: Kiran Kumar Maturi Date: Thu, 6 Sep 2018 10:14:54 +0530 Subject: [PATCH] HBASE-20857 balancer status tag in jmx metrics Committer: Kiran Kumar Maturi --- .../master/balancer/MetricsBalancerSource.java | 3 + .../master/balancer/MetricsBalancerSourceImpl.java | 7 +- .../hbase/rsgroup/RSGroupBasedLoadBalancer.java | 4 + .../apache/hadoop/hbase/master/LoadBalancer.java | 3 + .../hadoop/hbase/master/MasterRpcServices.java | 1 + .../hbase/master/balancer/BaseLoadBalancer.java | 7 ++ .../hbase/master/balancer/MetricsBalancer.java | 4 + .../master/balancer/MetricsStochasticBalancer.java | 8 ++ .../TestBalancerStatusTagInJMXMetrics.java | 114 +++++++++++++++++++++ 9 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerStatusTagInJMXMetrics.java diff --git a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancerSource.java b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancerSource.java index 1c9a61e..f9cc62b 100644 --- a/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancerSource.java +++ b/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancerSource.java @@ -39,6 +39,7 @@ public interface MetricsBalancerSource extends BaseSource { String BALANCE_CLUSTER = "balancerCluster"; String MISC_INVOATION_COUNT = "miscInvocationCount"; + String BALANCER_STATUS = "isBalancerActive"; /** * Description @@ -48,4 +49,6 @@ public interface MetricsBalancerSource extends BaseSource { void updateBalanceCluster(long time); void incrMiscInvocations(); + + void updateBalancerStatus(boolean status); } diff --git a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancerSourceImpl.java b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancerSourceImpl.java index 0a74630..de904d4 100644 --- a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancerSourceImpl.java +++ b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancerSourceImpl.java @@ -37,6 +37,7 @@ public class MetricsBalancerSourceImpl extends BaseSourceImpl implements Metrics String metricsDescription, String metricsContext, String metricsJmxContext) { super(metricsName, metricsDescription, metricsContext, metricsJmxContext); + updateBalancerStatus(true); } @@ -44,7 +45,6 @@ public class MetricsBalancerSourceImpl extends BaseSourceImpl implements Metrics public void init() { blanceClusterHisto = metricsRegistry.newTimeHistogram(BALANCE_CLUSTER); miscCount = metricsRegistry.newCounter(MISC_INVOATION_COUNT, "", 0L); - } @Override @@ -56,4 +56,9 @@ public class MetricsBalancerSourceImpl extends BaseSourceImpl implements Metrics public void incrMiscInvocations() { miscCount.incr(); } + + @Override + public void updateBalancerStatus(boolean status) { + metricsRegistry.tag(BALANCER_STATUS,"", String.valueOf(status), true); + } } diff --git a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java index 091b02c..5e51128 100644 --- a/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java +++ b/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java @@ -468,4 +468,8 @@ public class RSGroupBasedLoadBalancer implements RSGroupableBalancer, LoadBalanc public void postMasterStartupInitialize() { this.internalBalancer.postMasterStartupInitialize(); } + + public void updateBalancerStatus(boolean status) { + internalBalancer.updateBalancerStatus(status); + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java index 8531ff7..c8121b9 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java @@ -157,4 +157,7 @@ public interface LoadBalancer extends Configurable, Stoppable, ConfigurationObse * If balancer needs to do initialization after Master has started up, lets do that here. */ void postMasterStartupInitialize(); + + /*Updates balancer status tag reported to JMX*/ + void updateBalancerStatus(boolean status); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java index 416983f..7c647f7 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java @@ -282,6 +282,7 @@ public class MasterRpcServices extends RSRpcServices if (master.cpHost != null) { master.cpHost.postBalanceSwitch(oldValue, newValue); } + master.getLoadBalancer().updateBalancerStatus(newValue); } catch (IOException ioe) { LOG.warn("Error flipping balance switch", ioe); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java index 730d867..44c7084 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java @@ -1676,6 +1676,13 @@ public abstract class BaseLoadBalancer implements LoadBalancer { } /** + * Updates the balancer status tag reported to JMX + */ + public void updateBalancerStatus(boolean status) { + metricsBalancer.balancerStatus(status); + } + + /** * Used to assign a single region to a random server. */ private ServerName randomAssignment(Cluster cluster, HRegionInfo regionInfo, diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancer.java index ac2a517..40fb2e0 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancer.java @@ -46,4 +46,8 @@ public class MetricsBalancer { public void incrMiscInvocations() { source.incrMiscInvocations(); } + + public void balancerStatus(boolean status) { + source.updateBalancerStatus(status); + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsStochasticBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsStochasticBalancer.java index 850a9f5..0a1f4ae 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsStochasticBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsStochasticBalancer.java @@ -55,6 +55,14 @@ public class MetricsStochasticBalancer extends MetricsBalancer { } /** + * Updates the balancer status tag reported to JMX + */ + @Override + public void balancerStatus(boolean status) { + stochasticSource.updateBalancerStatus(status); + } + + /** * Updates the number of metrics reported to JMX */ public void updateMetricsSize(int size) { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerStatusTagInJMXMetrics.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerStatusTagInJMXMetrics.java new file mode 100644 index 0000000..c599f88 --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerStatusTagInJMXMetrics.java @@ -0,0 +1,114 @@ +/** + * 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.balancer; + +import static org.junit.Assert.assertEquals; + +import java.util.Random; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.MiniHBaseCluster; +import org.apache.hadoop.hbase.master.HMaster; +import org.apache.hadoop.hbase.testclassification.MediumTests; +import org.apache.hadoop.metrics2.MetricsSource; +import org.apache.hadoop.metrics2.MetricsTag; +import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.experimental.categories.Category; + + +@Category({ MediumTests.class }) +public class TestBalancerStatusTagInJMXMetrics extends BalancerTestBase { + private static final Log LOG = LogFactory.getLog(TestBalancerStatusTagInJMXMetrics.class); + private static HBaseTestingUtility UTIL = new HBaseTestingUtility(); + private static int connectorPort = 61120; + private static HMaster master; + private static MiniHBaseCluster cluster; + private static Configuration conf = null; + + /** + * Setup the environment for the test. + */ + @BeforeClass + public static void setupBeforeClass() throws Exception { + + conf = UTIL.getConfiguration(); + Random rand = new Random(); + for (int i = 0; i < 10; i++) { + do { + int sign = i % 2 == 0 ? 1 : -1; + connectorPort += sign * rand.nextInt(100); + } while (!HBaseTestingUtility.available(connectorPort)); + try { + conf.setInt("regionserver.rmi.registry.port", connectorPort); + cluster = UTIL.startMiniCluster(); + LOG.info("Waiting for active/ready master"); + cluster.waitForActiveAndReadyMaster(); + master = cluster.getMaster(); + break; + } catch (Exception e) { + LOG.debug("Encountered exception when starting mini cluster. Trying port " + connectorPort, + e); + try { + // this is to avoid "IllegalStateException: A mini-cluster is already running" + UTIL.shutdownMiniCluster(); + } catch (Exception ex) { + LOG.debug("Encountered exception shutting down cluster", ex); + } + } + } + } + + @AfterClass + public static void tearDownAfterClass() throws Exception { + UTIL.shutdownMiniCluster(); + } + + /** + * Tests the status change using the Default Metrics System + */ + @Test + public void testJmxMetrics() throws Exception { + + assertEquals(getStatus(), "true"); + master.getLoadBalancer().updateBalancerStatus(false); + assertEquals(getStatus(), "false"); + + } + + /** + * Gets the balancer status tag from the Metrics registry + */ + public String getStatus() throws Exception { + MetricsSource source = DefaultMetricsSystem.instance().getSource(MetricsBalancerSource.METRICS_JMX_CONTEXT); + if(source instanceof MetricsBalancerSourceImpl) { + MetricsTag status = ((MetricsBalancerSourceImpl) source).getMetricsRegistry().getTag(MetricsBalancerSource.BALANCER_STATUS); + return status.value(); + }else { + LOG.warn("Balancer JMX Metrics not registered"); + throw new Exception("MetricsBalancer JMX Context not found"); + } + } + +} -- 2.7.4