Repository: hbase
Updated Branches:
  refs/heads/branch-1 c5cf80dc8 -> 121fad31c
  refs/heads/branch-1.4 eeb7dd7cf -> 9d5f45411
  refs/heads/branch-2 40c1f072b -> f9e18cf31
  refs/heads/branch-2.1 209d0a8a1 -> b7c2b953b
  refs/heads/master 801fc05e9 -> aa9e1d051


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/121fad31
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/121fad31
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/121fad31

Branch: refs/heads/branch-1
Commit: 121fad31ce08561d71638397ed63b42d6756b7b1
Parents: c5cf80d
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:49 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/121fad31/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/121fad31/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/121fad31/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/121fad31/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/121fad31/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 c238746..6b67473 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
@@ -301,6 +301,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/121fad31/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/121fad31/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/121fad31/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/121fad31/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");
+    }
+  }
+
+}

Reply via email to