{"record":{"id":"4f6f944efe875066","repo":"apache/hadoop","slug":"objectname-is-not-a-valid-hadoop-mbean","errorCode":null,"errorMessage":"${objectName} is not a valid Hadoop mbean","messagePattern":"(.+?) is not a valid Hadoop mbean","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"warning","filePath":"hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java","lineNumber":121,"sourceCode":"        if (LOG.isTraceEnabled()) {\n          LOG.trace(\"Failed to register MBean \\\"\" + name + \"\\\"\", iaee);\n        } else {\n          LOG.warn(\"Failed to register MBean \\\"\" + name\n              + \"\\\": Instance already exists.\");\n        }\n      } catch (Exception e) {\n        LOG.warn(\"Failed to register MBean \\\"\" + name + \"\\\"\", e);\n      }\n    }\n    return null;\n  }\n\n  public static String getMbeanNameService(final ObjectName objectName) {\n    Matcher matcher = MBEAN_NAME_PATTERN.matcher(objectName.toString());\n    if (matcher.matches()) {\n      return matcher.group(1);\n    } else {\n      throw new IllegalArgumentException(\n          objectName + \" is not a valid Hadoop mbean\");\n    }\n  }\n\n  public static String getMbeanNameName(final ObjectName objectName) {\n    Matcher matcher = MBEAN_NAME_PATTERN.matcher(objectName.toString());\n    if (matcher.matches()) {\n      return matcher.group(2);\n    } else {\n      throw new IllegalArgumentException(\n          objectName + \" is not a valid Hadoop mbean\");\n    }\n  }\n\n  static public void unregister(ObjectName mbeanName) {\n    LOG.debug(\"Unregistering \"+ mbeanName);\n    final MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();\n    if (mbeanName == null) {","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/metrics2/util/MBeans.java#L103-L139","documentation":"IllegalArgumentException from MBeans.getMbeanNameService(ObjectName) when the given JMX ObjectName does not match Hadoop's MBean naming pattern '^Hadoop:service=<SERVICE>,name=<NAME>' (MBEAN_NAME_PATTERN). Hadoop registers all its MBeans under the 'Hadoop:' domain with exactly a 'service=' key and a 'name=' key; these helper methods decompose such names and reject anything else. The message prints the offending ObjectName so the mismatch is obvious.","triggerScenarios":"Calling getMbeanNameService() with an ObjectName from a non-Hadoop bean (e.g., 'java.lang:type=Memory'), or a Hadoop bean whose name was created with extra keys, missing keys, or a different domain (e.g., 'Hadoop:service=NameNode,name=NameNodeInfo,extra=1').","commonSituations":"Monitoring/tooling code that iterates all platform MBeans and blindly passes each name to these helpers; refactoring that renames MBeans away from the standard pattern; third-party code registering beans into the Hadoop domain with nonstandard keys.","solutions":["Only call getMbeanNameService/getMbeanNameName on ObjectNames you obtained via MBeans.register() or that you have verified start with 'Hadoop:service=...,name=...'","Pre-filter ObjectNames with your own regex or startsWith(\"Hadoop:service=\") check before calling the helper","If you register custom beans, use the standard form new ObjectName(\"Hadoop:service=<svc>,name=<name>\") so decomposition works"],"exampleFix":"// before\nString svc = MBeans.getMbeanNameService(objectName); // objectName = 'java.lang:type=Memory' -> IllegalArgumentException\n\n// after\nif (objectName.getDomain().equals(\"Hadoop\")\n    && objectName.getKeyPropertyList().size() == 2\n    && objectName.getKeyProperty(\"service\") != null\n    && objectName.getKeyProperty(\"name\") != null) {\n  String svc = MBeans.getMbeanNameService(objectName);\n}","handlingStrategy":"validation","validationCode":"private static final Pattern HADOOP_MBEAN =\n    Pattern.compile(\"^Hadoop:service=([^,]+),name=(.+)$\");\nboolean isHadoopMbean(ObjectName n) { return HADOOP_MBEAN.matcher(n.toString()).matches(); }","typeGuard":"static boolean isHadoopMbeanName(ObjectName n) {\n  return \"Hadoop\".equals(n.getDomain())\n      && n.getKeyProperty(\"service\") != null\n      && n.getKeyProperty(\"name\") != null\n      && n.getKeyPropertyList().size() == 2;\n}","tryCatchPattern":null,"preventionTips":["When iterating the platform MBeanServer, filter names with the pattern before calling these helpers","Register custom beans via MBeans.register so names always match the convention","Unit-test name helpers against representative ObjectNames"],"tags":["jmx","mbean","metrics2","hadoop-common","validation"],"backgroundTag":"jmx-mbean-name-invalid","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-23T01:17:44.959Z"}