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