HBASE-20857 balancer status tag in jmx metrics Signed-off-by: Andrew Purtell <apurt...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/9d5f4541 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/9d5f4541 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/9d5f4541 Branch: refs/heads/branch-1.4 Commit: 9d5f45411d02a0e8fd12a77acc04d25c865689eb Parents: eeb7dd7 Author: Kiran Kumar Maturi <maturi.ki...@gmail.com> Authored: Tue Sep 18 09:45:26 2018 +0530 Committer: Andrew Purtell <apurt...@apache.org> Committed: Fri Sep 28 16:04:56 2018 -0700 ---------------------------------------------------------------------- .../master/balancer/MetricsBalancerSource.java | 3 + .../balancer/MetricsBalancerSourceImpl.java | 7 +- .../hbase/rsgroup/RSGroupBasedLoadBalancer.java | 4 + .../hadoop/hbase/master/LoadBalancer.java | 3 + .../hadoop/hbase/master/MasterRpcServices.java | 1 + .../hbase/master/balancer/BaseLoadBalancer.java | 7 ++ .../hbase/master/balancer/MetricsBalancer.java | 4 + .../balancer/MetricsStochasticBalancer.java | 8 ++ .../TestBalancerStatusTagInJMXMetrics.java | 108 +++++++++++++++++++ 9 files changed, 144 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/9d5f4541/hbase-hadoop-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancerSource.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); } http://git-wip-us.apache.org/repos/asf/hbase/blob/9d5f4541/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancerSourceImpl.java ---------------------------------------------------------------------- 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); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/9d5f4541/hbase-rsgroup/src/main/java/org/apache/hadoop/hbase/rsgroup/RSGroupBasedLoadBalancer.java ---------------------------------------------------------------------- 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); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/9d5f4541/hbase-server/src/main/java/org/apache/hadoop/hbase/master/LoadBalancer.java ---------------------------------------------------------------------- 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); } http://git-wip-us.apache.org/repos/asf/hbase/blob/9d5f4541/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java ---------------------------------------------------------------------- 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); } http://git-wip-us.apache.org/repos/asf/hbase/blob/9d5f4541/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java ---------------------------------------------------------------------- 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, http://git-wip-us.apache.org/repos/asf/hbase/blob/9d5f4541/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsBalancer.java ---------------------------------------------------------------------- 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); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/9d5f4541/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsStochasticBalancer.java ---------------------------------------------------------------------- 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) { http://git-wip-us.apache.org/repos/asf/hbase/blob/9d5f4541/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerStatusTagInJMXMetrics.java ---------------------------------------------------------------------- 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..03488ea --- /dev/null +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestBalancerStatusTagInJMXMetrics.java @@ -0,0 +1,108 @@ +/** + * 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"); + } + } + +}