Repository: hadoop
Updated Branches:
  refs/heads/HDFS-7240 482c09462 -> 4fac755bc


HDFS-12286. Ozone: Extend MBeans utility to add any key value pairs to the 
registered MXBeans. Contributed by Elek, Marton.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/4fac755b
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/4fac755b
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/4fac755b

Branch: refs/heads/HDFS-7240
Commit: 4fac755bc765291197c3ead2846f4f4fd7332100
Parents: 482c094
Author: Anu Engineer <aengin...@apache.org>
Authored: Fri Aug 11 08:32:23 2017 -0700
Committer: Anu Engineer <aengin...@apache.org>
Committed: Fri Aug 11 08:32:23 2017 -0700

----------------------------------------------------------------------
 .../org/apache/hadoop/metrics2/util/MBeans.java |  35 ++++++-
 .../hadoop/metrics2/util/DummyMXBean.java       |  23 +++++
 .../apache/hadoop/metrics2/util/TestMBeans.java | 101 +++++++++++++++++++
 3 files changed, 156 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/4fac755b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java
----------------------------------------------------------------------
diff --git 
a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java
 
b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java
index ded49d6..4c75160 100644
--- 
a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java
+++ 
b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java
@@ -18,13 +18,17 @@
 package org.apache.hadoop.metrics2.util;
 
 import java.lang.management.ManagementFactory;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import javax.management.InstanceAlreadyExistsException;
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
@@ -60,8 +64,25 @@ public class MBeans {
    */
   static public ObjectName register(String serviceName, String nameName,
                                     Object theMbean) {
+    return register(serviceName, nameName, new HashMap<String, String>(), 
theMbean);
+  }
+
+  /**
+   * Register the MBean using our standard MBeanName format
+   * "hadoop:service=<serviceName>,name=<nameName>"
+   * Where the <serviceName> and <nameName> are the supplied parameters
+   *
+   * @param serviceName
+   * @param nameName
+   * @param properties - Key value pairs to define additional JMX ObjectName 
properties.
+   * @param theMbean    - the MBean to register
+   * @return the named used to register the MBean
+   */
+  static public ObjectName register(String serviceName, String nameName,
+                                    Map<String, String> properties,
+                                    Object theMbean) {
     final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
-    ObjectName name = getMBeanName(serviceName, nameName);
+    ObjectName name = getMBeanName(serviceName, nameName, properties);
     if (name != null) {
       try {
         mbs.registerMBean(theMbean, name);
@@ -116,9 +137,17 @@ public class MBeans {
     DefaultMetricsSystem.removeMBeanName(mbeanName);
   }
 
-  static private ObjectName getMBeanName(String serviceName, String nameName) {
+  @VisibleForTesting
+  static ObjectName getMBeanName(String serviceName, String nameName,
+                                         Map<String, String> 
additionalParameters) {
+
+    String additionalKeys = additionalParameters.entrySet()
+        .stream()
+        .map(entry -> entry.getKey() + "=" + entry.getValue())
+        .collect(Collectors.joining(","));
+
     String nameStr = DOMAIN_PREFIX + SERVICE_PREFIX + serviceName + "," +
-        NAME_PREFIX + nameName;
+        NAME_PREFIX + nameName + (additionalKeys.isEmpty() ? "" : "," + 
additionalKeys);
     try {
       return DefaultMetricsSystem.newMBeanName(nameStr);
     } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/4fac755b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/util/DummyMXBean.java
----------------------------------------------------------------------
diff --git 
a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/util/DummyMXBean.java
 
b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/util/DummyMXBean.java
new file mode 100644
index 0000000..4cf14a3
--- /dev/null
+++ 
b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/util/DummyMXBean.java
@@ -0,0 +1,23 @@
+/**
+ * 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.metrics2.util;
+
+public interface DummyMXBean {
+
+  int getCounter();
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/4fac755b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/util/TestMBeans.java
----------------------------------------------------------------------
diff --git 
a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/util/TestMBeans.java
 
b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/util/TestMBeans.java
new file mode 100644
index 0000000..212351b
--- /dev/null
+++ 
b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/metrics2/util/TestMBeans.java
@@ -0,0 +1,101 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.metrics2.util;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import java.lang.management.ManagementFactory;
+import java.util.HashMap;
+import java.util.Map;
+
+public class TestMBeans implements DummyMXBean {
+
+  public int counter = 1;
+
+  @Test
+  public void testRegister() throws Exception {
+    ObjectName objectName = null;
+    try {
+      counter = 23;
+      objectName = MBeans.register("UnitTest",
+          "RegisterTest", this);
+
+      MBeanServer platformMBeanServer =
+          ManagementFactory.getPlatformMBeanServer();
+
+      int jmxCounter = (int) platformMBeanServer
+          .getAttribute(objectName, "Counter");
+      Assert.assertEquals(counter, jmxCounter);
+    } finally {
+      if (objectName != null) {
+        MBeans.unregister(objectName);
+      }
+    }
+  }
+
+
+  @Test
+  public void testRegisterWithAdditionalProperties() throws Exception {
+    ObjectName objectName = null;
+    try {
+      counter = 42;
+
+      Map<String, String> properties = new HashMap<String, String>();
+      properties.put("flavour", "server");
+      objectName = MBeans.register("UnitTest", "RegisterTest", properties, 
this);
+
+      MBeanServer platformMBeanServer = 
ManagementFactory.getPlatformMBeanServer();
+      int jmxCounter = (int) platformMBeanServer.getAttribute(objectName, 
"Counter");
+      Assert.assertEquals(counter, jmxCounter);
+    } finally {
+      if (objectName != null) {
+        MBeans.unregister(objectName);
+      }
+    }
+  }
+
+  @Test
+  public void testGetMbeanNameName() {
+    HashMap<String, String> properties = new HashMap<>();
+
+    ObjectName mBeanName = MBeans.getMBeanName("Service",
+        "Name", properties);
+
+    Assert.assertEquals("Service",
+        MBeans.getMbeanNameService(mBeanName));
+
+    properties.put("key", "value");
+    mBeanName = MBeans.getMBeanName(
+        "Service",
+        "Name",
+        properties);
+
+    Assert.assertEquals("Service",
+        MBeans.getMbeanNameService(mBeanName));
+
+  }
+
+  @Override
+  public int getCounter() {
+    return counter;
+  }
+
+}
\ No newline at end of file


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to