/* * Copyright (c) 2019 Matthias Sohn * * This program and the accompanying materials are made available under the * terms of the Eclipse Distribution License v. 1.0 which is available at * https://www.eclipse.org/org/documents/edl-v10.php. * * SPDX-License-Identifier: BSD-3-Clause */ package org.eclipse.jgit.util; import java.io.IOException; import java.lang.management.ManagementFactory; import javax.management.InstanceAlreadyExistsException; import javax.management.InstanceNotFoundException; import javax.management.MBeanRegistrationException; import javax.management.MBeanServer; import javax.management.MalformedObjectNameException; import javax.management.NotCompliantMBeanException; import javax.management.ObjectInstance; import javax.management.ObjectName; import org.eclipse.jgit.annotations.Nullable; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.lib.ConfigConstants; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Enables monitoring JGit via JMX * * @since 5.1.13 */ public class Monitoring { private static final Logger LOG = LoggerFactory.getLogger(Monitoring.class); /** * Register a MBean with the platform MBean server * * @param mbean * the mbean object to register * @param metricName * name of the JGit metric, will be prefixed with * "org.eclipse.jgit/" * @return the registered mbean's object instance */ public static @Nullable ObjectInstance registerMBean(Object mbean, String metricName) { boolean register = false; try { Class[] interfaces = mbean.getClass().getInterfaces(); for (Class i : interfaces) { register = SystemReader.getInstance().getUserConfig() .getBoolean( ConfigConstants.CONFIG_JMX_SECTION, i.getSimpleName(), false); if (register) { break; } } } catch (IOException | ConfigInvalidException e) { LOG.error(e.getMessage(), e); return null; } if (!register) { return null; } MBeanServer server = ManagementFactory.getPlatformMBeanServer(); try { ObjectName mbeanName = objectName(mbean.getClass(), metricName); if (server.isRegistered(mbeanName)) { server.unregisterMBean(mbeanName); } return server.registerMBean(mbean, mbeanName); } catch (MalformedObjectNameException | InstanceAlreadyExistsException | MBeanRegistrationException | NotCompliantMBeanException | InstanceNotFoundException e) { LOG.error(e.getMessage(), e); return null; } } private static ObjectName objectName(Class mbean, String metricName) throws MalformedObjectNameException { return new ObjectName(String.format("org.eclipse.jgit/%s:type=%s", //$NON-NLS-1$ metricName, mbean.getSimpleName())); } }