diff --git a/appserver/payara-appserver-modules/microprofile/metrics/src/main/java/fish/payara/microprofile/metrics/jmx/MBeanExpression.java b/appserver/payara-appserver-modules/microprofile/metrics/src/main/java/fish/payara/microprofile/metrics/jmx/MBeanExpression.java index 0cb73d99dfb..b5ff8f35132 100644 --- a/appserver/payara-appserver-modules/microprofile/metrics/src/main/java/fish/payara/microprofile/metrics/jmx/MBeanExpression.java +++ b/appserver/payara-appserver-modules/microprofile/metrics/src/main/java/fish/payara/microprofile/metrics/jmx/MBeanExpression.java @@ -43,6 +43,8 @@ import java.lang.management.ManagementFactory; import java.util.Map; import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.ObjectName; @@ -61,6 +63,8 @@ public class MBeanExpression { private final MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); + private static final Logger LOGGER = Logger.getLogger(MBeanExpression.class.getName()); + public MBeanExpression(String expression) { if (expression == null || expression.trim().isEmpty()) { throw new IllegalArgumentException("MBean Expression is null"); @@ -124,7 +128,8 @@ public Number getNumberValue() { throw new IllegalArgumentException(getMbean()); } } catch (Exception ex) { - throw new RuntimeException(ex); + LOGGER.log(Level.WARNING, ex.getMessage()); + throw new IllegalStateException(ex); } } diff --git a/appserver/payara-appserver-modules/microprofile/metrics/src/main/java/fish/payara/microprofile/metrics/jmx/MBeanMetadataHelper.java b/appserver/payara-appserver-modules/microprofile/metrics/src/main/java/fish/payara/microprofile/metrics/jmx/MBeanMetadataHelper.java index 0337a9cf180..7e7933edea6 100644 --- a/appserver/payara-appserver-modules/microprofile/metrics/src/main/java/fish/payara/microprofile/metrics/jmx/MBeanMetadataHelper.java +++ b/appserver/payara-appserver-modules/microprofile/metrics/src/main/java/fish/payara/microprofile/metrics/jmx/MBeanMetadataHelper.java @@ -115,6 +115,10 @@ public void resolveDynamicMetadata(List metadataList) { List resolvedMetadataList = new ArrayList<>(); List removedMetadataList = new ArrayList<>(metadataList.size()); for (MBeanMetadata metadata : metadataList) { + if (!validateMetadata(metadata)) { + removedMetadataList.add(metadata); + continue; + } if (metadata.getName().contains(SPECIFIER)) { MBeanExpression mBeanExpression; try { @@ -126,24 +130,26 @@ public void resolveDynamicMetadata(List metadataList) { } for (ObjectName objName : mBeanObjects) { String dynamicValue = objName.getKeyPropertyList().get(dynamicKey); - + StringBuilder builder = new StringBuilder(); builder.append(objName.getCanonicalName()); builder.append("/"); builder.append(mBeanExpression.getAttributeName()); String subAttrName = mBeanExpression.getSubAttributeName(); - if (subAttrName != null){ + if (subAttrName != null) { builder.append("#"); builder.append(subAttrName); } - - resolvedMetadataList.add(new MBeanMetadata( - builder.toString(), - metadata.getName().replace(SPECIFIER, dynamicValue), - metadata.getDisplayName().replace(SPECIFIER, dynamicValue), - metadata.getDescription().replace(SPECIFIER, dynamicValue), - metadata.getTypeRaw(), - metadata.getUnit()) + + resolvedMetadataList.add( + new MBeanMetadata( + builder.toString(), + metadata.getName().replace(SPECIFIER, dynamicValue), + metadata.getDisplayName().replace(SPECIFIER, dynamicValue), + metadata.getDescription().replace(SPECIFIER, dynamicValue), + metadata.getTypeRaw(), + metadata.getUnit() + ) ); } } catch (IllegalArgumentException ex) { @@ -153,8 +159,40 @@ public void resolveDynamicMetadata(List metadataList) { } } } + metadataList.removeAll(removedMetadataList); metadataList.addAll(resolvedMetadataList); } + + private boolean validateMetadata(MBeanMetadata metadata) { + boolean valid = true; + + if (metadata.getName() == null) { + LOGGER.log(Level.WARNING, "'name' property not defined in {0} mbean metadata", metadata.getMBean()); + valid = false; + } + if (metadata.getMBean() == null) { + LOGGER.log(Level.WARNING, "'mbean' property not defined in {0} metadata", metadata.getName()); + valid = false; + } + if (metadata.getDisplayName() == null) { + LOGGER.log(Level.WARNING, "'displayName' property not defined in {0} metadata", metadata.getName()); + valid = false; + } + if (metadata.getDescription() == null) { + LOGGER.log(Level.WARNING, "'description' property not defined in {0} metadata", metadata.getName()); + valid = false; + } + if (metadata.getType() == null) { + LOGGER.log(Level.WARNING, "'type' property not defined in {0} metadata", metadata.getName()); + valid = false; + } + if (metadata.getUnit() == null) { + LOGGER.log(Level.WARNING, "'unit' property not defined for {0} metadata", metadata.getName()); + valid = false; + } + + return valid; + } }