blob: 500c23673014492e0beef95baa812f16d2cee013 [file] [log] [blame]
/*
* Copyright (c) 2019 Matthias Sohn <matthias.sohn@sap.com>
*
* 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()));
}
}