package io.dropwizard.metrics; import java.io.IOException; import javax.management.JMException; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import java.lang.management.ManagementFactory; import java.util.Set; /** * A {@link Gauge} implementation which queries an {@link MBeanServerConnection} for an attribute of an object. */ public class JmxAttributeGauge implements Gauge<Object> { private final MBeanServerConnection mBeanServerConn; private final ObjectName objectName; private final String attributeName; /** * Creates a new JmxAttributeGauge. * * @param objectName the name of the object * @param attributeName the name of the object's attribute */ public JmxAttributeGauge(ObjectName objectName, String attributeName) { this(ManagementFactory.getPlatformMBeanServer(), objectName, attributeName); } /** * Creates a new JmxAttributeGauge. * * @param mBeanServerConn the {@link MBeanServerConnection} * @param objectName the name of the object * @param attributeName the name of the object's attribute */ public JmxAttributeGauge(MBeanServerConnection mBeanServerConn, ObjectName objectName, String attributeName) { this.mBeanServerConn = mBeanServerConn; this.objectName = objectName; this.attributeName = attributeName; } @Override public Object getValue() { try { return mBeanServerConn.getAttribute(getObjectName(), attributeName); } catch (IOException e) { return null; } catch (JMException e) { return null; } } private ObjectName getObjectName() throws IOException { if (objectName.isPattern()) { Set<ObjectName> foundNames = mBeanServerConn.queryNames(objectName, null); if (foundNames.size() == 1) { return foundNames.iterator().next(); } } return objectName; } }