package org.radargun.sysmonitor;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.text.NumberFormat;
import javax.management.AttributeNotFoundException;
import javax.management.MBeanServerConnection;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import org.radargun.logging.Log;
import org.radargun.logging.LogFactory;
import org.radargun.reporting.Timeline;
import org.radargun.traits.JmxConnectionProvider;
/**
* Provides constants for JMX access.
*
* @author Mircea Markus <Mircea.Markus@jboss.com>
*/
public abstract class JmxMonitor implements Monitor {
protected final Log log = LogFactory.getLog(getClass());
static final ObjectName OS_NAME = getOSName();
static final String PROCESSING_CAPACITY_ATTR = "ProcessingCapacity";
static final String PROCESS_UP_TIME = "Uptime";
static final ObjectName RUNTIME_NAME = getRuntimeName();
static final NumberFormat PERCENT_FORMATTER = NumberFormat.getPercentInstance();
protected final Timeline timeline;
protected final JmxConnectionProvider jmxConnectionProvider;
protected MBeanServerConnection connection;
protected JMXConnector connector;
public JmxMonitor(JmxConnectionProvider jmxConnectionProvider, Timeline timeline) {
this.jmxConnectionProvider = jmxConnectionProvider;
this.timeline = timeline;
}
private static ObjectName getRuntimeName() {
try {
return new ObjectName(ManagementFactory.RUNTIME_MXBEAN_NAME);
} catch (MalformedObjectNameException ex) {
throw new RuntimeException(ex);
}
}
private static ObjectName getOSName() {
try {
return new ObjectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME);
} catch (MalformedObjectNameException ex) {
throw new RuntimeException(ex);
}
}
public static long getCpuMultiplier(MBeanServerConnection con) throws Exception {
Number num;
try {
num = (Number) con.getAttribute(OS_NAME, PROCESSING_CAPACITY_ATTR);
} catch (AttributeNotFoundException e) {
num = 1;
}
return num.longValue();
}
@Override
public synchronized void start() {
if (jmxConnectionProvider == null) {
connection = ManagementFactory.getPlatformMBeanServer();
} else {
connector = jmxConnectionProvider.getConnector();
if (connector != null) {
try {
connection = connector.getMBeanServerConnection();
} catch (IOException e) {
log.error("Failed to connect to MBean server", e);
}
}
}
}
@Override
public synchronized void stop() {
if (connector != null) {
try {
connector.close();
} catch (IOException e) {
log.error("Failed to close JMX connection", e);
}
connector = null;
}
}
@Override
public boolean equals(Object o) {
return o != null && o.getClass() == this.getClass();
}
@Override
public int hashCode() {
return super.hashCode();
}
}