added AbstractMBean (base class for all Sigar MBeans)
added MBean impls for Cpu, CpuPerc, CpuInfo and Mem added SigarRegistry MBean (auto-registers a default set of MBeans when registered to/created by an MBeanServer)
This commit is contained in:
parent
a8f28f2ee0
commit
36434a0a23
|
@ -8,5 +8,6 @@
|
||||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
|
||||||
<classpathentry kind="lib" path="/Developer/Java/Ant/lib/ant.jar"/>
|
<classpathentry kind="lib" path="/Developer/Java/Ant/lib/ant.jar"/>
|
||||||
<classpathentry kind="lib" path="lib/log4j.jar"/>
|
<classpathentry kind="lib" path="lib/log4j.jar"/>
|
||||||
|
<classpathentry kind="lib" path="lib/mx4j-jmx.jar"/>
|
||||||
<classpathentry kind="output" path="build/classes"/>
|
<classpathentry kind="output" path="build/classes"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,272 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
|
||||||
|
* This file is part of SIGAR.
|
||||||
|
*
|
||||||
|
* SIGAR is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms version 2 of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation. This program is distributed
|
||||||
|
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
|
||||||
|
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||||
|
* USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.hyperic.sigar.jmx;
|
||||||
|
|
||||||
|
import javax.management.Attribute;
|
||||||
|
import javax.management.AttributeList;
|
||||||
|
import javax.management.AttributeNotFoundException;
|
||||||
|
import javax.management.DynamicMBean;
|
||||||
|
import javax.management.InvalidAttributeValueException;
|
||||||
|
import javax.management.MBeanException;
|
||||||
|
import javax.management.MBeanRegistration;
|
||||||
|
import javax.management.MBeanServer;
|
||||||
|
import javax.management.ObjectName;
|
||||||
|
import javax.management.ReflectionException;
|
||||||
|
|
||||||
|
import org.hyperic.sigar.Sigar;
|
||||||
|
import org.hyperic.sigar.SigarException;
|
||||||
|
import org.hyperic.sigar.SigarProxy;
|
||||||
|
import org.hyperic.sigar.SigarProxyCache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for all Sigar JMX MBeans. Provides a skeleton which handles
|
||||||
|
* creation of the Sigar proxy instance and provides some convenience methods.
|
||||||
|
* It also enforces usage of the {@link DynamicMBean} inferface while
|
||||||
|
* implementing part of it, and it adds empty implementations for all methods of
|
||||||
|
* the {@link MBeanRegistration} interface, allowing subclasses to only
|
||||||
|
* implement subset of them.
|
||||||
|
*
|
||||||
|
* @author Bjoern Martin
|
||||||
|
* @since 1.4 (2007-04)
|
||||||
|
*/
|
||||||
|
public abstract class AbstractMBean implements DynamicMBean, MBeanRegistration {
|
||||||
|
|
||||||
|
protected static final String MBEAN_ATTR_TYPE = "type";
|
||||||
|
|
||||||
|
protected static final short CACHED_30SEC = 0;
|
||||||
|
|
||||||
|
protected static final short CACHED_5SEC = 1;
|
||||||
|
|
||||||
|
protected static final short CACHED_500MS = 2;
|
||||||
|
|
||||||
|
protected static final short CACHELESS = 3;
|
||||||
|
|
||||||
|
protected static final short DEFAULT = CACHED_30SEC;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Sigar implementation to be used to fetch information from the system.
|
||||||
|
*/
|
||||||
|
protected final Sigar sigarImpl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The Sigar proxy cache to be used in case the data does not have to be
|
||||||
|
* fetched during each call. The cache timeout is decided during
|
||||||
|
* construction. See {@link AbstractMBean#AbstractMBean(Sigar, short)} for
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* @see AbstractMBean#AbstractMBean(Sigar, short)
|
||||||
|
*/
|
||||||
|
protected final SigarProxy sigar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The MBean server this MBean is registered to. Set during the MBean's
|
||||||
|
* registration to the MBean server and unset to <code>null</code> when
|
||||||
|
* the deregistration finished.
|
||||||
|
*
|
||||||
|
* @see #preRegister(MBeanServer, ObjectName)
|
||||||
|
* @see #postDeregister()
|
||||||
|
*/
|
||||||
|
protected MBeanServer mbeanServer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Creates a new instance of this class. The Sigar instance is stored (and
|
||||||
|
* accessible) via the {@link #sigarImpl} member. A second instance is
|
||||||
|
* stored within the {@link #sigar} member which is either {@link #sigarImpl}
|
||||||
|
* or an instance of {@link SigarProxyCache} with the expiration time set to
|
||||||
|
* whatever the <code>cacheMode</code> parameter specifies.</p>
|
||||||
|
*
|
||||||
|
* <p>The following cache modes exist:</p>
|
||||||
|
*
|
||||||
|
* <table border = "1">
|
||||||
|
* <tr><td><b>Constant</b></td><td><b>Description</b></td></tr>
|
||||||
|
* <tr><td>{@link #CACHELESS}</td><td>No cached instance, {@link #sigar}
|
||||||
|
* <code>==</code> {@link #sigarImpl}.</td></tr>
|
||||||
|
* <tr><td>{@link #CACHED_500MS}</td><td>500 millisecond cache, for high
|
||||||
|
* frequency queries on raw data such as reading out CPU timers each
|
||||||
|
* second. Avoids reading out multiple data sets when all attributes of
|
||||||
|
* an MBean are queried in short sequence.</td></tr>
|
||||||
|
* <tr><td>{@link #CACHED_5SEC}</td><td>5 second cache, for high frequency
|
||||||
|
* queries on calculated data such as CPU percentages.</td></tr>
|
||||||
|
* <tr><td>{@link #CACHED_30SEC}</td><td>30 second cache, for normal queries
|
||||||
|
* or data readouts such as CPU model / vendor. This is the default if
|
||||||
|
* nothing (<code>0</code>) is specified.</td></tr>
|
||||||
|
* <tr><td>{@link #DEFAULT}</td><td>Same as {@link #CACHED_30SEC}.</td></tr>
|
||||||
|
* </table>
|
||||||
|
*
|
||||||
|
* <p><b>Note:</b> Only make use of the cacheless or half second mode if you
|
||||||
|
* know what you are doing. They may have impact on system performance if
|
||||||
|
* used excessively.</p>
|
||||||
|
*
|
||||||
|
* @param sigar The Sigar impl to use. Must not be <code>null</code>
|
||||||
|
* @param cacheMode The cache mode to use for {@link #sigar} or {@link #CACHELESS}
|
||||||
|
* if no separate, cached instance is to be maintained.
|
||||||
|
*/
|
||||||
|
protected AbstractMBean(Sigar sigar, short cacheMode) {
|
||||||
|
// store Sigar
|
||||||
|
this.sigarImpl = sigar;
|
||||||
|
|
||||||
|
// create a cached instance as well
|
||||||
|
if (cacheMode == CACHELESS) {
|
||||||
|
// no cached version
|
||||||
|
this.sigar = this.sigarImpl;
|
||||||
|
|
||||||
|
} else if (cacheMode == CACHED_500MS) {
|
||||||
|
// 500ms cached version (for 1/sec queries)
|
||||||
|
this.sigar = SigarProxyCache.newInstance(this.sigarImpl,
|
||||||
|
500);
|
||||||
|
|
||||||
|
} else if (cacheMode == CACHED_5SEC) {
|
||||||
|
// 5sec cached version (for avg'd queries)
|
||||||
|
this.sigar = SigarProxyCache.newInstance(this.sigarImpl,
|
||||||
|
5000);
|
||||||
|
|
||||||
|
} else /* if (cacheMode == CACHED_30SEC) */ {
|
||||||
|
// 30sec (default) cached version (for info and long term queries)
|
||||||
|
this.sigar = SigarProxyCache.newInstance(this.sigarImpl,
|
||||||
|
30000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the object name the MBean is registered with within the
|
||||||
|
* MBeanServer. May be <code>null</code> in case the instance is not
|
||||||
|
* registered to an MBeanServer, but used standalone.
|
||||||
|
*
|
||||||
|
* @return The object name or <code>null</code> if not registered to an
|
||||||
|
* MBeanServer
|
||||||
|
*/
|
||||||
|
public abstract String getObjectName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a runtime exception for the type and SigarException specified.
|
||||||
|
*
|
||||||
|
* @param type
|
||||||
|
* The type that was called
|
||||||
|
* @param e
|
||||||
|
* The exception that was raised
|
||||||
|
* @return A runtime exception encapsulating the information specified
|
||||||
|
*/
|
||||||
|
protected RuntimeException unexpectedError(String type, SigarException e) {
|
||||||
|
String msg = "Unexected error in Sigar.get" + type + ": "
|
||||||
|
+ e.getMessage();
|
||||||
|
return new IllegalArgumentException(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loops over all attributes and calls
|
||||||
|
* {@link DynamicMBean#getAttribute(java.lang.String)} method for each
|
||||||
|
* attribute sequentially. Any exception thrown by those methods are ignored
|
||||||
|
* and simply cause the attribute not being added to the result.
|
||||||
|
*/
|
||||||
|
public AttributeList getAttributes(String[] attrs) {
|
||||||
|
final AttributeList result = new AttributeList();
|
||||||
|
for (int i = 0; i < attrs.length; i++) {
|
||||||
|
try {
|
||||||
|
result.add(new Attribute(attrs[i], getAttribute(attrs[i])));
|
||||||
|
} catch (AttributeNotFoundException e) {
|
||||||
|
// ignore, as we cannot throw this exception
|
||||||
|
} catch (MBeanException e) {
|
||||||
|
// ignore, as we cannot throw this exception
|
||||||
|
} catch (ReflectionException e) {
|
||||||
|
// ignore, as we cannot throw this exception
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loops over all attributes and calls
|
||||||
|
* {@link DynamicMBean#setAttribute(Attribute)} for each attribute
|
||||||
|
* sequentially. Any exception thrown by those methods are ignored and
|
||||||
|
* simply cause the attribute not being added to the result.
|
||||||
|
*/
|
||||||
|
public AttributeList setAttributes(AttributeList attrs) {
|
||||||
|
final AttributeList result = new AttributeList();
|
||||||
|
for (int i = 0; i < attrs.size(); i++) {
|
||||||
|
try {
|
||||||
|
final Attribute next = (Attribute) attrs.get(i);
|
||||||
|
setAttribute(next);
|
||||||
|
result.add(next);
|
||||||
|
} catch (AttributeNotFoundException e) {
|
||||||
|
// ignore, as we cannot throw this exception
|
||||||
|
} catch (InvalidAttributeValueException e) {
|
||||||
|
// ignore, as we cannot throw this exception
|
||||||
|
} catch (MBeanException e) {
|
||||||
|
// ignore, as we cannot throw this exception
|
||||||
|
} catch (ReflectionException e) {
|
||||||
|
// ignore, as we cannot throw this exception
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------
|
||||||
|
// Implementation of the MBeanRegistration interface
|
||||||
|
// -------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Returns <code>new ObjectName(this.getObjectName())</code> to guarantee
|
||||||
|
* a reliable and reproducable object name.</p>
|
||||||
|
*
|
||||||
|
* <p><b>Note:</b> Make sure any subclass does a super call to this method,
|
||||||
|
* otherwise the implementation might be broken.</p>
|
||||||
|
*
|
||||||
|
* @see MBeanRegistration#preRegister(MBeanServer, ObjectName)
|
||||||
|
*/
|
||||||
|
public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception {
|
||||||
|
this.mbeanServer = server;
|
||||||
|
return new ObjectName(getObjectName());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty implementation, allowing aubclasses to ignore the interface.
|
||||||
|
*
|
||||||
|
* <p><b>Note:</b> Make sure any subclass does a super call to this method,
|
||||||
|
* otherwise the implementation might be broken.</p>
|
||||||
|
*
|
||||||
|
* @see MBeanRegistration#postRegister(Boolean)
|
||||||
|
*/
|
||||||
|
public void postRegister(Boolean success) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty implementation, allowing aubclasses to ignore the interface.
|
||||||
|
*
|
||||||
|
* <p><b>Note:</b> Make sure any subclass does a super call to this method,
|
||||||
|
* otherwise the implementation might be broken.</p>
|
||||||
|
*
|
||||||
|
* @see MBeanRegistration#preDeregister()
|
||||||
|
*/
|
||||||
|
public void preDeregister() throws Exception {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty implementation, allowing aubclasses to ignore the interface.
|
||||||
|
*
|
||||||
|
* <p><b>Note:</b> Make sure any subclass does a super call to this method,
|
||||||
|
* otherwise the implementation might be broken.</p>
|
||||||
|
*
|
||||||
|
* @see MBeanRegistration#postDeregister()
|
||||||
|
*/
|
||||||
|
public void postDeregister() {
|
||||||
|
this.mbeanServer = null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,343 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
|
||||||
|
* This file is part of SIGAR.
|
||||||
|
*
|
||||||
|
* SIGAR is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms version 2 of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation. This program is distributed
|
||||||
|
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
|
||||||
|
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||||
|
* USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.hyperic.sigar.jmx;
|
||||||
|
|
||||||
|
import javax.management.Attribute;
|
||||||
|
import javax.management.AttributeNotFoundException;
|
||||||
|
import javax.management.MBeanAttributeInfo;
|
||||||
|
import javax.management.MBeanConstructorInfo;
|
||||||
|
import javax.management.MBeanInfo;
|
||||||
|
import javax.management.MBeanParameterInfo;
|
||||||
|
import javax.management.ReflectionException;
|
||||||
|
|
||||||
|
import org.hyperic.sigar.Sigar;
|
||||||
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sigar JMX MBean implementation for the <code>Cpu</code> information package.
|
||||||
|
* Provides an OpenMBean conform implementation.
|
||||||
|
*
|
||||||
|
* @author Bjoern Martin
|
||||||
|
* @since 1.4 (2007-04)
|
||||||
|
*/
|
||||||
|
public class SigarCpu extends AbstractMBean {
|
||||||
|
|
||||||
|
private static final String MBEAN_TYPE = "CpuList";
|
||||||
|
|
||||||
|
private static final MBeanInfo MBEAN_INFO;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_IDLE;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_NICE;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_SYS;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_USER;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_WAIT;
|
||||||
|
|
||||||
|
private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX;
|
||||||
|
|
||||||
|
private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR;
|
||||||
|
|
||||||
|
private static MBeanParameterInfo MBEAN_PARAM_CPUINDEX;
|
||||||
|
|
||||||
|
private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
|
||||||
|
|
||||||
|
static {
|
||||||
|
MBEAN_ATTR_CPUINDEX = new MBeanAttributeInfo(
|
||||||
|
"CpuIndex", "int",
|
||||||
|
"The index of the CPU, typically starting at 0",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_IDLE = new MBeanAttributeInfo(
|
||||||
|
"Idle", "long",
|
||||||
|
"The idle time of the CPU, in [ms]",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_NICE = new MBeanAttributeInfo(
|
||||||
|
"Nice", "long",
|
||||||
|
"The time of the CPU spent on nice priority, in [ms]",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_SYS = new MBeanAttributeInfo(
|
||||||
|
"Sys", "long",
|
||||||
|
"The time of the CPU used by the system, in [ms]",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_TOTAL = new MBeanAttributeInfo(
|
||||||
|
"Total", "long",
|
||||||
|
"The total time of the CPU, in [ms]",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_USER = new MBeanAttributeInfo(
|
||||||
|
"User", "long",
|
||||||
|
"The time of the CPU used by user processes, in [ms]",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_WAIT = new MBeanAttributeInfo(
|
||||||
|
"Wait", "long",
|
||||||
|
"The time the CPU had to wait for data to be loaded, in [ms]",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_PARAM_CPUINDEX = new MBeanParameterInfo(
|
||||||
|
"cpuIndex", "int",
|
||||||
|
"The index of the CPU to read data for. Must be >= 0 " +
|
||||||
|
"and not exceed the CPU count of the system");
|
||||||
|
MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
|
||||||
|
"sigar", Sigar.class.getName(),
|
||||||
|
"The Sigar instance to use to fetch data from");
|
||||||
|
MBEAN_CONSTR_CPUINDEX = new MBeanConstructorInfo(
|
||||||
|
SigarCpu.class.getName(),
|
||||||
|
"Creates a new instance for the CPU index specified, " +
|
||||||
|
"using a new Sigar instance to fetch the data. " +
|
||||||
|
"Fails if the CPU index is out of range.",
|
||||||
|
new MBeanParameterInfo[]{
|
||||||
|
MBEAN_PARAM_CPUINDEX});
|
||||||
|
MBEAN_CONSTR_CPUINDEX_SIGAR = new MBeanConstructorInfo(
|
||||||
|
SigarCpu.class.getName(),
|
||||||
|
"Creates a new instance for the CPU index specified, " +
|
||||||
|
"using the Sigar instance specified to fetch the data. " +
|
||||||
|
"Fails if the CPU index is out of range.",
|
||||||
|
new MBeanParameterInfo[]{
|
||||||
|
MBEAN_PARAM_SIGAR,
|
||||||
|
MBEAN_PARAM_CPUINDEX});
|
||||||
|
MBEAN_INFO = new MBeanInfo(
|
||||||
|
SigarCpu.class.getName(),
|
||||||
|
"Sigar CPU MBean. Provides raw timing data for a single " +
|
||||||
|
"CPU. The data is cached for 500ms, meaning each request " +
|
||||||
|
"(and as a result each block request to all parameters) " +
|
||||||
|
"within half a second is satisfied from the same dataset.",
|
||||||
|
new MBeanAttributeInfo[]{
|
||||||
|
MBEAN_ATTR_CPUINDEX,
|
||||||
|
MBEAN_ATTR_IDLE,
|
||||||
|
MBEAN_ATTR_NICE,
|
||||||
|
MBEAN_ATTR_SYS,
|
||||||
|
MBEAN_ATTR_TOTAL,
|
||||||
|
MBEAN_ATTR_USER,
|
||||||
|
MBEAN_ATTR_WAIT},
|
||||||
|
new MBeanConstructorInfo[]{
|
||||||
|
MBEAN_CONSTR_CPUINDEX,
|
||||||
|
MBEAN_CONSTR_CPUINDEX_SIGAR},
|
||||||
|
null, null);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Index of the CPU processed by the instance.
|
||||||
|
*/
|
||||||
|
private final int cpuIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object name this instance will give itself when being registered to an
|
||||||
|
* MBeanServer.
|
||||||
|
*/
|
||||||
|
private final String objectName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance for the CPU index specified, using a new Sigar
|
||||||
|
* instance to fetch the data. Fails if the CPU index is out of range.
|
||||||
|
*
|
||||||
|
* @param cpuIndex The index of the CPU to read data for. Must be
|
||||||
|
* <code>>= 0</code> and not exceed the CPU count of the system.
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException If the CPU index is out of range or
|
||||||
|
* an unexpected Sigar error occurs
|
||||||
|
*/
|
||||||
|
public SigarCpu(int cpuIndex) throws IllegalArgumentException {
|
||||||
|
this(new Sigar(), cpuIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance for the CPU index specified, using the Sigar
|
||||||
|
* instance specified to fetch the data. Fails if the CPU index is out
|
||||||
|
* of range.
|
||||||
|
*
|
||||||
|
* @param sigar The Sigar instance to use to fetch data from
|
||||||
|
* @param cpuIndex The index of the CPU to read data for. Must be
|
||||||
|
* <code>>= 0</code> and not exceed the CPU count of the system.
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException If the CPU index is out of range or
|
||||||
|
* an unexpected Sigar error occurs
|
||||||
|
*/
|
||||||
|
public SigarCpu(Sigar sigar, int cpuIndex) throws IllegalArgumentException {
|
||||||
|
super(sigar, CACHED_500MS);
|
||||||
|
|
||||||
|
// check index
|
||||||
|
if (cpuIndex < 0)
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"CPU index has to be non-negative: " + cpuIndex);
|
||||||
|
try {
|
||||||
|
int cpuCount;
|
||||||
|
if ((cpuCount = sigar.getCpuList().length) < cpuIndex)
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"CPU index out of range (found " + cpuCount + " CPU(s)): " + cpuIndex);
|
||||||
|
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// all fine
|
||||||
|
this.cpuIndex = cpuIndex;
|
||||||
|
this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":"
|
||||||
|
+ MBEAN_ATTR_TYPE + "=Cpu,"
|
||||||
|
+ MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase()
|
||||||
|
+ MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object name this instance will give itself when being registered to an
|
||||||
|
* MBeanServer.
|
||||||
|
*/
|
||||||
|
public String getObjectName() {
|
||||||
|
return this.objectName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The index of the CPU, typically starting at 0
|
||||||
|
*/
|
||||||
|
public int getCpuIndex() {
|
||||||
|
return this.cpuIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The idle time of the CPU, in [ms]
|
||||||
|
*/
|
||||||
|
public long getIdle() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuList()[this.cpuIndex].getIdle();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The time of the CPU spent on nice priority, in [ms]
|
||||||
|
*/
|
||||||
|
public long getNice() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuList()[this.cpuIndex].getNice();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The time of the CPU used by the system, in [ms]
|
||||||
|
*/
|
||||||
|
public long getSys() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuList()[this.cpuIndex].getSys();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The total time of the CPU, in [ms]
|
||||||
|
*/
|
||||||
|
public long getTotal() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuList()[this.cpuIndex].getTotal();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The time of the CPU used by user processes, in [ms]
|
||||||
|
*/
|
||||||
|
public long getUser() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuList()[this.cpuIndex].getUser();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The time the CPU had to wait for data to be loaded, in [ms]
|
||||||
|
*/
|
||||||
|
public long getWait() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuList()[this.cpuIndex].getWait();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------
|
||||||
|
// Implementation of the DynamicMBean interface
|
||||||
|
// -------
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#getAttribute(String)
|
||||||
|
*/
|
||||||
|
public Object getAttribute(String attr) throws AttributeNotFoundException {
|
||||||
|
|
||||||
|
if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
|
||||||
|
return new Integer(getCpuIndex());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_IDLE.getName().equals(attr)) {
|
||||||
|
return new Long(getIdle());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_NICE.getName().equals(attr)) {
|
||||||
|
return new Long(getNice());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_SYS.getName().equals(attr)) {
|
||||||
|
return new Long(getSys());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) {
|
||||||
|
return new Long(getTotal());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_USER.getName().equals(attr)) {
|
||||||
|
return new Long(getUser());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_WAIT.getName().equals(attr)) {
|
||||||
|
return new Long(getWait());
|
||||||
|
|
||||||
|
} else {
|
||||||
|
throw new AttributeNotFoundException(attr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#setAttribute(Attribute)
|
||||||
|
*/
|
||||||
|
public void setAttribute(Attribute attr) throws AttributeNotFoundException {
|
||||||
|
throw new AttributeNotFoundException(attr.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#invoke(String, Object[], String[])
|
||||||
|
*/
|
||||||
|
public Object invoke(String actionName, Object[] params, String[] signature) throws ReflectionException {
|
||||||
|
throw new ReflectionException(new NoSuchMethodException(actionName), actionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#getMBeanInfo()
|
||||||
|
*/
|
||||||
|
public MBeanInfo getMBeanInfo() {
|
||||||
|
return MBEAN_INFO;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,302 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
|
||||||
|
* This file is part of SIGAR.
|
||||||
|
*
|
||||||
|
* SIGAR is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms version 2 of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation. This program is distributed
|
||||||
|
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
|
||||||
|
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||||
|
* USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.hyperic.sigar.jmx;
|
||||||
|
|
||||||
|
import javax.management.Attribute;
|
||||||
|
import javax.management.AttributeNotFoundException;
|
||||||
|
import javax.management.MBeanAttributeInfo;
|
||||||
|
import javax.management.MBeanConstructorInfo;
|
||||||
|
import javax.management.MBeanInfo;
|
||||||
|
import javax.management.MBeanParameterInfo;
|
||||||
|
import javax.management.ReflectionException;
|
||||||
|
|
||||||
|
import org.hyperic.sigar.Sigar;
|
||||||
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sigar JMX MBean implementation for the <code>CpuInfo</code> information
|
||||||
|
* package. Provides an OpenMBean conform implementation.
|
||||||
|
*
|
||||||
|
* @author Bjoern Martin
|
||||||
|
* @since 1.4 (2007-04)
|
||||||
|
*/
|
||||||
|
public class SigarCpuInfo extends AbstractMBean {
|
||||||
|
|
||||||
|
private static final String MBEAN_TYPE = "CpuInfoList";
|
||||||
|
|
||||||
|
private static final MBeanInfo MBEAN_INFO;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_CACHESIZE;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_MHZ;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_MODEL;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_VENDOR;
|
||||||
|
|
||||||
|
private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX;
|
||||||
|
|
||||||
|
private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR;
|
||||||
|
|
||||||
|
private static final MBeanParameterInfo MBEAN_PARAM_CPUINDEX;
|
||||||
|
|
||||||
|
private static final MBeanParameterInfo MBEAN_PARAM_SIGAR;
|
||||||
|
|
||||||
|
static {
|
||||||
|
MBEAN_ATTR_CPUINDEX = new MBeanAttributeInfo(
|
||||||
|
"CpuIndex", "int",
|
||||||
|
"The index of the CPU, typically starting at 0",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_CACHESIZE = new MBeanAttributeInfo(
|
||||||
|
"CacheSize", "long",
|
||||||
|
"The cache size of the CPU, in [byte]",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_MHZ = new MBeanAttributeInfo(
|
||||||
|
"Mhz", "int",
|
||||||
|
"The clock speed of the CPU, in [MHz]",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_MODEL = new MBeanAttributeInfo(
|
||||||
|
"Model", "java.lang.String",
|
||||||
|
"The CPU model reported",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_VENDOR = new MBeanAttributeInfo(
|
||||||
|
"Vendor", "java.lang.String",
|
||||||
|
"The CPU vendor reported",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_PARAM_CPUINDEX = new MBeanParameterInfo(
|
||||||
|
"cpuIndex", "int",
|
||||||
|
"The index of the CPU to read data for. Must be >= 0 " +
|
||||||
|
"and not exceed the CPU count of the system");
|
||||||
|
MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
|
||||||
|
"sigar", Sigar.class.getName(),
|
||||||
|
"The Sigar instance to use to fetch data from");
|
||||||
|
MBEAN_CONSTR_CPUINDEX = new MBeanConstructorInfo(
|
||||||
|
SigarCpu.class.getName(),
|
||||||
|
"Creates a new instance for the CPU index specified, " +
|
||||||
|
"using a new Sigar instance to fetch the data. " +
|
||||||
|
"Fails if the CPU index is out of range.",
|
||||||
|
new MBeanParameterInfo[]{
|
||||||
|
MBEAN_PARAM_CPUINDEX});
|
||||||
|
MBEAN_CONSTR_CPUINDEX_SIGAR = new MBeanConstructorInfo(
|
||||||
|
SigarCpu.class.getName(),
|
||||||
|
"Creates a new instance for the CPU index specified, " +
|
||||||
|
"using the Sigar instance specified to fetch the data. " +
|
||||||
|
"Fails if the CPU index is out of range.",
|
||||||
|
new MBeanParameterInfo[]{
|
||||||
|
MBEAN_PARAM_SIGAR,
|
||||||
|
MBEAN_PARAM_CPUINDEX});
|
||||||
|
MBEAN_INFO = new MBeanInfo(
|
||||||
|
SigarCpu.class.getName(),
|
||||||
|
"Sigar CPU Info MBean, provides overall information for a " +
|
||||||
|
"single CPU. This information only changes if, for example, " +
|
||||||
|
"a CPU is reducing its clock frequency or shutting down " +
|
||||||
|
"part of its cache. Subsequent requests are satisfied from " +
|
||||||
|
"within a cache that invalidates after 30 seconds.",
|
||||||
|
new MBeanAttributeInfo[]{
|
||||||
|
MBEAN_ATTR_CPUINDEX,
|
||||||
|
MBEAN_ATTR_CACHESIZE,
|
||||||
|
MBEAN_ATTR_MHZ,
|
||||||
|
MBEAN_ATTR_MODEL,
|
||||||
|
MBEAN_ATTR_VENDOR},
|
||||||
|
new MBeanConstructorInfo[]{
|
||||||
|
MBEAN_CONSTR_CPUINDEX,
|
||||||
|
MBEAN_CONSTR_CPUINDEX_SIGAR},
|
||||||
|
null, null);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Index of the CPU processed by the instance.
|
||||||
|
*/
|
||||||
|
private int cpuIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object name this instance will give itself when being registered to an
|
||||||
|
* MBeanServer.
|
||||||
|
*/
|
||||||
|
private String objectName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance for the CPU index specified, using a new Sigar
|
||||||
|
* instance to fetch the data. Fails if the CPU index is out of range.
|
||||||
|
*
|
||||||
|
* @param cpuIndex The index of the CPU to read data for. Must be
|
||||||
|
* <code>>= 0</code> and not exceed the CPU count of the system.
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException If the CPU index is out of range or
|
||||||
|
* an unexpected Sigar error occurs
|
||||||
|
*/
|
||||||
|
public SigarCpuInfo(int index) throws IllegalArgumentException {
|
||||||
|
this(new Sigar(), index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance for the CPU index specified, using the Sigar
|
||||||
|
* instance specified to fetch the data. Fails if the CPU index is out
|
||||||
|
* of range.
|
||||||
|
*
|
||||||
|
* @param sigar The Sigar instance to use to fetch data from
|
||||||
|
* @param cpuIndex The index of the CPU to read data for. Must be
|
||||||
|
* <code>>= 0</code> and not exceed the CPU count of the system.
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException If the CPU index is out of range or
|
||||||
|
* an unexpected Sigar error occurs
|
||||||
|
*/
|
||||||
|
public SigarCpuInfo(Sigar sigar, int index) {
|
||||||
|
super(sigar, DEFAULT);
|
||||||
|
|
||||||
|
// check index
|
||||||
|
if (index < 0)
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"CPU index has to be non-negative: " + index);
|
||||||
|
try {
|
||||||
|
int cpuCount;
|
||||||
|
if ((cpuCount = sigar.getCpuInfoList().length) < index)
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"CPU index out of range (found " + cpuCount + " CPU(s)): " + index);
|
||||||
|
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// all fine
|
||||||
|
this.cpuIndex = index;
|
||||||
|
this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":"
|
||||||
|
+ MBEAN_ATTR_TYPE + "=CpuInfo,"
|
||||||
|
+ MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase()
|
||||||
|
+ MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object name this instance will give itself when being registered to an
|
||||||
|
* MBeanServer.
|
||||||
|
*/
|
||||||
|
public String getObjectName() {
|
||||||
|
return this.objectName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The index of the CPU, typically starting at 0
|
||||||
|
*/
|
||||||
|
public int getCpuIndex() {
|
||||||
|
return this.cpuIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The cache size of the CPU, in [byte]
|
||||||
|
*/
|
||||||
|
public long getCacheSize() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuInfoList()[this.cpuIndex].getCacheSize();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The clock speed of the CPU, in [MHz]
|
||||||
|
*/
|
||||||
|
public int getMhz() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuInfoList()[this.cpuIndex].getMhz();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The CPU model reported
|
||||||
|
*/
|
||||||
|
public String getModel() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuInfoList()[this.cpuIndex].getModel();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The CPU vendor reported
|
||||||
|
*/
|
||||||
|
public String getVendor() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuInfoList()[this.cpuIndex].getVendor();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------
|
||||||
|
// Implementation of the DynamicMBean interface
|
||||||
|
// -------
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#getAttribute(String)
|
||||||
|
*/
|
||||||
|
public Object getAttribute(String attr) throws AttributeNotFoundException {
|
||||||
|
|
||||||
|
if (MBEAN_ATTR_CACHESIZE.getName().equals(attr)) {
|
||||||
|
return new Long(getCacheSize());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
|
||||||
|
return new Integer(getCpuIndex());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_MHZ.getName().equals(attr)) {
|
||||||
|
return new Integer(getMhz());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_MODEL.getName().equals(attr)) {
|
||||||
|
return getModel();
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_VENDOR.getName().equals(attr)) {
|
||||||
|
return getVendor();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
throw new AttributeNotFoundException(attr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#setAttribute(Attribute)
|
||||||
|
*/
|
||||||
|
public void setAttribute(Attribute attr) throws AttributeNotFoundException {
|
||||||
|
throw new AttributeNotFoundException(attr.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#invoke(String, Object[], String[])
|
||||||
|
*/
|
||||||
|
public Object invoke(String actionName, Object[] params, String[] signature) throws ReflectionException {
|
||||||
|
throw new ReflectionException(new NoSuchMethodException(actionName), actionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#getMBeanInfo()
|
||||||
|
*/
|
||||||
|
public MBeanInfo getMBeanInfo() {
|
||||||
|
return MBEAN_INFO;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,345 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
|
||||||
|
* This file is part of SIGAR.
|
||||||
|
*
|
||||||
|
* SIGAR is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms version 2 of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation. This program is distributed
|
||||||
|
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
|
||||||
|
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||||
|
* USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.hyperic.sigar.jmx;
|
||||||
|
|
||||||
|
import javax.management.Attribute;
|
||||||
|
import javax.management.AttributeNotFoundException;
|
||||||
|
import javax.management.MBeanAttributeInfo;
|
||||||
|
import javax.management.MBeanConstructorInfo;
|
||||||
|
import javax.management.MBeanInfo;
|
||||||
|
import javax.management.MBeanParameterInfo;
|
||||||
|
import javax.management.ReflectionException;
|
||||||
|
|
||||||
|
import org.hyperic.sigar.Sigar;
|
||||||
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Sigar JMX MBean implementation for the <code>CpuPerc</code> information
|
||||||
|
* package. Provides an OpenMBean conform implementation.</p>
|
||||||
|
*
|
||||||
|
* @author Bjoern Martin
|
||||||
|
* @since 1.4 (2007-04)
|
||||||
|
*/
|
||||||
|
public class SigarCpuPerc extends AbstractMBean {
|
||||||
|
|
||||||
|
private static final String MBEAN_TYPE = "CpuPercList";
|
||||||
|
|
||||||
|
private static final MBeanInfo MBEAN_INFO;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_CPUINDEX;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_COMBINED;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_IDLE;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_NICE;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_SYS;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_USER;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_WAIT;
|
||||||
|
|
||||||
|
private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX;
|
||||||
|
|
||||||
|
private static final MBeanConstructorInfo MBEAN_CONSTR_CPUINDEX_SIGAR;
|
||||||
|
|
||||||
|
private static MBeanParameterInfo MBEAN_PARAM_CPUINDEX;
|
||||||
|
|
||||||
|
private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
|
||||||
|
|
||||||
|
static {
|
||||||
|
MBEAN_ATTR_CPUINDEX = new MBeanAttributeInfo(
|
||||||
|
"CpuIndex", "int",
|
||||||
|
"The index of the CPU, typically starting at 0",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_COMBINED = new MBeanAttributeInfo(
|
||||||
|
"Combined", "double",
|
||||||
|
"The total time of the CPU, as a fraction of 1",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_IDLE = new MBeanAttributeInfo(
|
||||||
|
"Idle", "double",
|
||||||
|
"The idle time of the CPU, as a fraction of 1",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_NICE = new MBeanAttributeInfo(
|
||||||
|
"Nice", "double",
|
||||||
|
"The time of the CPU spent on nice priority, as a fraction of 1",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_SYS = new MBeanAttributeInfo(
|
||||||
|
"Sys", "double",
|
||||||
|
"The time of the CPU used by the system, as a fraction of 1",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_USER = new MBeanAttributeInfo(
|
||||||
|
"User", "double",
|
||||||
|
"The time of the CPU used by user processes, as a fraction of 1",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_WAIT = new MBeanAttributeInfo(
|
||||||
|
"Wait", "double",
|
||||||
|
"The time the CPU had to wait for data to be loaded, as a fraction of 1",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_PARAM_CPUINDEX = new MBeanParameterInfo(
|
||||||
|
"cpuIndex", "int",
|
||||||
|
"The index of the CPU to read data for. Must be >= 0 " +
|
||||||
|
"and not exceed the CPU count of the system");
|
||||||
|
MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
|
||||||
|
"sigar", Sigar.class.getName(),
|
||||||
|
"The Sigar instance to use to fetch data from");
|
||||||
|
MBEAN_CONSTR_CPUINDEX = new MBeanConstructorInfo(
|
||||||
|
SigarCpu.class.getName(),
|
||||||
|
"Creates a new instance for the CPU index specified, " +
|
||||||
|
"using a new Sigar instance to fetch the data. " +
|
||||||
|
"Fails if the CPU index is out of range.",
|
||||||
|
new MBeanParameterInfo[]{
|
||||||
|
MBEAN_PARAM_CPUINDEX});
|
||||||
|
MBEAN_CONSTR_CPUINDEX_SIGAR = new MBeanConstructorInfo(
|
||||||
|
SigarCpu.class.getName(),
|
||||||
|
"Creates a new instance for the CPU index specified, " +
|
||||||
|
"using the Sigar instance specified to fetch the data. " +
|
||||||
|
"Fails if the CPU index is out of range.",
|
||||||
|
new MBeanParameterInfo[]{
|
||||||
|
MBEAN_PARAM_SIGAR,
|
||||||
|
MBEAN_PARAM_CPUINDEX});
|
||||||
|
MBEAN_INFO = new MBeanInfo(
|
||||||
|
SigarCpu.class.getName(),
|
||||||
|
"Sigar CPU MBean. Provides percentage data for a single " +
|
||||||
|
"CPU, averaged over the timeframe between the last and " +
|
||||||
|
"the current measurement point. Two measurement points " +
|
||||||
|
"can be as close as 5 seconds, meaning subsequent requests " +
|
||||||
|
"for data within 5 seconds after the last executed call " +
|
||||||
|
"will be satisfied from cached data.",
|
||||||
|
new MBeanAttributeInfo[]{
|
||||||
|
MBEAN_ATTR_CPUINDEX,
|
||||||
|
MBEAN_ATTR_COMBINED,
|
||||||
|
MBEAN_ATTR_IDLE,
|
||||||
|
MBEAN_ATTR_NICE,
|
||||||
|
MBEAN_ATTR_SYS,
|
||||||
|
MBEAN_ATTR_USER,
|
||||||
|
MBEAN_ATTR_WAIT},
|
||||||
|
new MBeanConstructorInfo[]{
|
||||||
|
MBEAN_CONSTR_CPUINDEX,
|
||||||
|
MBEAN_CONSTR_CPUINDEX_SIGAR},
|
||||||
|
null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Index of the CPU processed by the instance.
|
||||||
|
*/
|
||||||
|
private int cpuIndex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object name this instance will give itself when being registered to an
|
||||||
|
* MBeanServer.
|
||||||
|
*/
|
||||||
|
private String objectName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance for the CPU index specified, using a new Sigar
|
||||||
|
* instance to fetch the data. Fails if the CPU index is out of range.
|
||||||
|
*
|
||||||
|
* @param cpuIndex The index of the CPU to read data for. Must be
|
||||||
|
* <code>>= 0</code> and not exceed the CPU count of the system.
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException If the CPU index is out of range or
|
||||||
|
* an unexpected Sigar error occurs
|
||||||
|
*/
|
||||||
|
public SigarCpuPerc(int index) {
|
||||||
|
this(new Sigar(), index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance for the CPU index specified, using the Sigar
|
||||||
|
* instance specified to fetch the data. Fails if the CPU index is out
|
||||||
|
* of range.
|
||||||
|
*
|
||||||
|
* @param sigar The Sigar instance to use to fetch data from
|
||||||
|
* @param cpuIndex The index of the CPU to read data for. Must be
|
||||||
|
* <code>>= 0</code> and not exceed the CPU count of the system.
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException If the CPU index is out of range or
|
||||||
|
* an unexpected Sigar error occurs
|
||||||
|
*/
|
||||||
|
public SigarCpuPerc(Sigar sigar, int index) {
|
||||||
|
super(sigar, CACHED_5SEC);
|
||||||
|
|
||||||
|
// check index
|
||||||
|
if (index < 0)
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"CPU index has to be non-negative: " + index);
|
||||||
|
try {
|
||||||
|
int cpuCount;
|
||||||
|
if ((cpuCount = sigar.getCpuPercList().length) < index)
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"CPU index out of range (found " + cpuCount
|
||||||
|
+ " CPU(s)): " + index);
|
||||||
|
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
// all fine
|
||||||
|
this.cpuIndex = index;
|
||||||
|
this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":"
|
||||||
|
+ MBEAN_ATTR_TYPE + "=CpuPerc,"
|
||||||
|
+ MBEAN_ATTR_CPUINDEX.getName().substring(0, 1).toLowerCase()
|
||||||
|
+ MBEAN_ATTR_CPUINDEX.getName().substring(1) + "=" + cpuIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object name this instance will give itself when being registered to an
|
||||||
|
* MBeanServer.
|
||||||
|
*/
|
||||||
|
public String getObjectName() {
|
||||||
|
return this.objectName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The index of the CPU, typically starting at 0
|
||||||
|
*/
|
||||||
|
public int getCpuIndex() {
|
||||||
|
return this.cpuIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The total time of the CPU, as a fraction of 1
|
||||||
|
*/
|
||||||
|
public double getCombined() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuPercList()[this.cpuIndex].getCombined();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The idle time of the CPU, as a fraction of 1
|
||||||
|
*/
|
||||||
|
public double getIdle() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuPercList()[this.cpuIndex].getIdle();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The time of the CPU spent on nice priority, as a fraction of 1
|
||||||
|
*/
|
||||||
|
public double getNice() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuPercList()[this.cpuIndex].getNice();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The time of the CPU used by the system, as a fraction of 1
|
||||||
|
*/
|
||||||
|
public double getSys() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuPercList()[this.cpuIndex].getSys();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The time of the CPU used by user processes, as a fraction of 1
|
||||||
|
*/
|
||||||
|
public double getUser() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuPercList()[this.cpuIndex].getUser();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The time the CPU had to wait for data to be loaded, as a fraction of 1
|
||||||
|
*/
|
||||||
|
public double getWait() {
|
||||||
|
try {
|
||||||
|
return sigar.getCpuPercList()[this.cpuIndex].getWait();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------
|
||||||
|
// Implementation of the DynamicMBean interface
|
||||||
|
// -------
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#getAttribute(String)
|
||||||
|
*/
|
||||||
|
public Object getAttribute(String attr) throws AttributeNotFoundException {
|
||||||
|
|
||||||
|
if (MBEAN_ATTR_COMBINED.getName().equals(attr)) {
|
||||||
|
return new Double(getCombined());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_CPUINDEX.getName().equals(attr)) {
|
||||||
|
return new Integer(getCpuIndex());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_IDLE.getName().equals(attr)) {
|
||||||
|
return new Double(getIdle());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_NICE.getName().equals(attr)) {
|
||||||
|
return new Double(getNice());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_SYS.getName().equals(attr)) {
|
||||||
|
return new Double(getSys());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_USER.getName().equals(attr)) {
|
||||||
|
return new Double(getUser());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_WAIT.getName().equals(attr)) {
|
||||||
|
return new Double(getWait());
|
||||||
|
|
||||||
|
} else {
|
||||||
|
throw new AttributeNotFoundException(attr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#setAttribute(Attribute)
|
||||||
|
*/
|
||||||
|
public void setAttribute(Attribute attr) throws AttributeNotFoundException {
|
||||||
|
throw new AttributeNotFoundException(attr.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#invoke(String, Object[], String[])
|
||||||
|
*/
|
||||||
|
public Object invoke(String actionName, Object[] params, String[] signature) throws ReflectionException {
|
||||||
|
throw new ReflectionException(new NoSuchMethodException(actionName), actionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see DynamicMBean#getMBeanInfo()
|
||||||
|
*/
|
||||||
|
public MBeanInfo getMBeanInfo() {
|
||||||
|
return MBEAN_INFO;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,272 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
|
||||||
|
* This file is part of SIGAR.
|
||||||
|
*
|
||||||
|
* SIGAR is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms version 2 of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation. This program is distributed
|
||||||
|
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
|
||||||
|
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||||
|
* USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.hyperic.sigar.jmx;
|
||||||
|
|
||||||
|
import javax.management.Attribute;
|
||||||
|
import javax.management.AttributeNotFoundException;
|
||||||
|
import javax.management.MBeanAttributeInfo;
|
||||||
|
import javax.management.MBeanConstructorInfo;
|
||||||
|
import javax.management.MBeanException;
|
||||||
|
import javax.management.MBeanInfo;
|
||||||
|
import javax.management.MBeanParameterInfo;
|
||||||
|
import javax.management.ReflectionException;
|
||||||
|
|
||||||
|
import org.hyperic.sigar.Sigar;
|
||||||
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sigar JMX MBean implementation for the <code>Mem</code> information
|
||||||
|
* package. Provides an OpenMBean conform implementation.
|
||||||
|
*
|
||||||
|
* @author Bjoern Martin
|
||||||
|
* @since 1.4 (2007-04)
|
||||||
|
*/
|
||||||
|
public class SigarMem extends AbstractMBean {
|
||||||
|
|
||||||
|
private static final String MBEAN_TYPE = "Mem";
|
||||||
|
|
||||||
|
private static final MBeanInfo MBEAN_INFO;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_FREE;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_ACTUAL_USED;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_FREE;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_RAM;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_TOTAL;
|
||||||
|
|
||||||
|
private static final MBeanAttributeInfo MBEAN_ATTR_USED;
|
||||||
|
|
||||||
|
private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR;
|
||||||
|
|
||||||
|
private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
|
||||||
|
|
||||||
|
static {
|
||||||
|
MBEAN_ATTR_ACTUAL_FREE = new MBeanAttributeInfo(
|
||||||
|
"ActualFree", "long",
|
||||||
|
"TODO add proper description here",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_ACTUAL_USED = new MBeanAttributeInfo(
|
||||||
|
"ActualUsed", "long",
|
||||||
|
"TODO add proper description here",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_FREE = new MBeanAttributeInfo(
|
||||||
|
"Free", "long",
|
||||||
|
"TODO add proper description here",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_RAM = new MBeanAttributeInfo(
|
||||||
|
"Ram", "long",
|
||||||
|
"TODO add proper description here",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_TOTAL = new MBeanAttributeInfo(
|
||||||
|
"Total", "long",
|
||||||
|
"TODO add proper description here",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_ATTR_USED = new MBeanAttributeInfo(
|
||||||
|
"Used", "long",
|
||||||
|
"TODO add proper description here",
|
||||||
|
true, false, false);
|
||||||
|
MBEAN_PARAM_SIGAR = new MBeanParameterInfo(
|
||||||
|
"sigar", Sigar.class.getName(),
|
||||||
|
"The Sigar instance to use to fetch data from");
|
||||||
|
MBEAN_CONSTR_SIGAR = new MBeanConstructorInfo(
|
||||||
|
SigarCpu.class.getName(),
|
||||||
|
"Creates a new instance, using the Sigar instance " +
|
||||||
|
"specified to fetch the data.",
|
||||||
|
new MBeanParameterInfo[]{
|
||||||
|
MBEAN_PARAM_SIGAR});
|
||||||
|
MBEAN_INFO = new MBeanInfo(
|
||||||
|
SigarCpu.class.getName(),
|
||||||
|
"Sigar Memory MBean, provides raw data for the physical " +
|
||||||
|
"memory installed on the system. Uses an internal cache " +
|
||||||
|
"that invalidates within 500ms, allowing for bulk request " +
|
||||||
|
"being satisfied with a single dataset fetch.",
|
||||||
|
new MBeanAttributeInfo[]{
|
||||||
|
MBEAN_ATTR_ACTUAL_FREE,
|
||||||
|
MBEAN_ATTR_ACTUAL_USED,
|
||||||
|
MBEAN_ATTR_FREE,
|
||||||
|
MBEAN_ATTR_RAM,
|
||||||
|
MBEAN_ATTR_TOTAL,
|
||||||
|
MBEAN_ATTR_USED},
|
||||||
|
new MBeanConstructorInfo[]{
|
||||||
|
MBEAN_CONSTR_SIGAR},
|
||||||
|
null, null);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object name this instance will give itself when being registered to an
|
||||||
|
* MBeanServer.
|
||||||
|
*/
|
||||||
|
private final String objectName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance, using the Sigar instance specified to fetch the
|
||||||
|
* data.
|
||||||
|
*
|
||||||
|
* @param sigar
|
||||||
|
* The Sigar instance to use to fetch data from
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException
|
||||||
|
* If an unexpected Sigar error occurs
|
||||||
|
*/
|
||||||
|
public SigarMem(Sigar sigar) throws IllegalArgumentException {
|
||||||
|
super(sigar, CACHED_500MS);
|
||||||
|
|
||||||
|
this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":" + MBEAN_ATTR_TYPE
|
||||||
|
+ "=Memory";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object name this instance will give itself when being registered to an
|
||||||
|
* MBeanServer.
|
||||||
|
*/
|
||||||
|
public String getObjectName() {
|
||||||
|
return this.objectName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The actual amount of free physical memory, in [bytes]
|
||||||
|
*/
|
||||||
|
public long getActualFree() {
|
||||||
|
try {
|
||||||
|
return sigar.getMem().getActualFree();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The actual amount of physical memory used, in [bytes]
|
||||||
|
*/
|
||||||
|
public long getActualUsed() {
|
||||||
|
try {
|
||||||
|
return sigar.getMem().getActualUsed();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The amount of free physical memory, in [bytes]
|
||||||
|
*/
|
||||||
|
public long getFree() {
|
||||||
|
try {
|
||||||
|
return sigar.getMem().getFree();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The amount of physical memory, in [bytes]
|
||||||
|
*/
|
||||||
|
public long getRam() {
|
||||||
|
try {
|
||||||
|
return sigar.getMem().getRam();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The total amount of physical memory, in [bytes]
|
||||||
|
*/
|
||||||
|
public long getTotal() {
|
||||||
|
try {
|
||||||
|
return sigar.getMem().getTotal();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The amount of physical memory in use, in [bytes]
|
||||||
|
*/
|
||||||
|
public long getUsed() {
|
||||||
|
try {
|
||||||
|
return sigar.getMem().getUsed();
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError(MBEAN_TYPE, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------
|
||||||
|
// Implementation of the DynamicMBean interface
|
||||||
|
// -------
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
*
|
||||||
|
* @see javax.management.DynamicMBean#getAttribute(java.lang.String)
|
||||||
|
*/
|
||||||
|
public Object getAttribute(String attr) throws AttributeNotFoundException,
|
||||||
|
MBeanException, ReflectionException {
|
||||||
|
if (MBEAN_ATTR_ACTUAL_FREE.getName().equals(attr)) {
|
||||||
|
return new Long(getActualFree());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_ACTUAL_USED.getName().equals(attr)) {
|
||||||
|
return new Long(getActualUsed());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_FREE.getName().equals(attr)) {
|
||||||
|
return new Long(getFree());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_RAM.getName().equals(attr)) {
|
||||||
|
return new Long(getRam());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_TOTAL.getName().equals(attr)) {
|
||||||
|
return new Long(getTotal());
|
||||||
|
|
||||||
|
} else if (MBEAN_ATTR_USED.getName().equals(attr)) {
|
||||||
|
return new Long(getUsed());
|
||||||
|
|
||||||
|
} else {
|
||||||
|
throw new AttributeNotFoundException(attr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
|
||||||
|
*/
|
||||||
|
public void setAttribute(Attribute attr) throws AttributeNotFoundException {
|
||||||
|
throw new AttributeNotFoundException(attr.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see javax.management.DynamicMBean#invoke(java.lang.String,
|
||||||
|
* java.lang.Object[], java.lang.String[])
|
||||||
|
*/
|
||||||
|
public Object invoke(String actionName, Object[] params, String[] signature)
|
||||||
|
throws ReflectionException {
|
||||||
|
throw new ReflectionException(new NoSuchMethodException(actionName),
|
||||||
|
actionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (non-Javadoc)
|
||||||
|
* @see javax.management.DynamicMBean#getMBeanInfo()
|
||||||
|
*/
|
||||||
|
public MBeanInfo getMBeanInfo() {
|
||||||
|
return MBEAN_INFO;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,250 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
|
||||||
|
* This file is part of SIGAR.
|
||||||
|
*
|
||||||
|
* SIGAR is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms version 2 of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation. This program is distributed
|
||||||
|
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
|
||||||
|
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||||
|
* USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.hyperic.sigar.jmx;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
import javax.management.Attribute;
|
||||||
|
import javax.management.AttributeNotFoundException;
|
||||||
|
import javax.management.MBeanConstructorInfo;
|
||||||
|
import javax.management.MBeanException;
|
||||||
|
import javax.management.MBeanInfo;
|
||||||
|
import javax.management.MBeanParameterInfo;
|
||||||
|
import javax.management.MBeanServer;
|
||||||
|
import javax.management.ObjectInstance;
|
||||||
|
import javax.management.ObjectName;
|
||||||
|
import javax.management.ReflectionException;
|
||||||
|
|
||||||
|
import org.hyperic.sigar.Sigar;
|
||||||
|
import org.hyperic.sigar.SigarException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Registry of all Sigar MBeans. Can be used as a convenient way to invoke
|
||||||
|
* Sigar MBeans at a central point. This brings a bunch of advantages with
|
||||||
|
* it:</p>
|
||||||
|
*
|
||||||
|
* <ul>
|
||||||
|
* <li>This class can be instantiated and registered to the MBean server by
|
||||||
|
* simply calling {@link MBeanServer#createMBean(String, ObjectName)},
|
||||||
|
* resulting in the automatic creation of all known default Sigar MBeans such
|
||||||
|
* as CPU and memory monitoring beans.</li>
|
||||||
|
* <li>Any Sigar MBean spawned by an instance of this class will use the same
|
||||||
|
* {@link org.hyperic.sigar.Sigar} instance, saving resources in the
|
||||||
|
* process.</li>
|
||||||
|
* <li>When this instance is deregistered from the MBean server, it will
|
||||||
|
* automatically deregister all instances it created, cleaning up behind
|
||||||
|
* itself.</li>
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* <p>So using this class to manage the Sigar MBeans requires one line of code
|
||||||
|
* for creation, registration and MBean spawning, and one line of code to shut
|
||||||
|
* it all down again.</p>
|
||||||
|
*
|
||||||
|
* @author Bjoern Martin
|
||||||
|
* @since 1.4 (2007-04)
|
||||||
|
*/
|
||||||
|
public class SigarRegistry extends AbstractMBean {
|
||||||
|
|
||||||
|
private static final String MBEAN_TYPE = "SigarRegistry";
|
||||||
|
|
||||||
|
private static final MBeanInfo MBEAN_INFO;
|
||||||
|
private static final MBeanConstructorInfo MBEAN_CONSTR_DEFAULT;
|
||||||
|
|
||||||
|
static {
|
||||||
|
MBEAN_CONSTR_DEFAULT = new MBeanConstructorInfo(
|
||||||
|
SigarRegistry.class.getName(),
|
||||||
|
"Creates a new instance of this class. Will create the Sigar " +
|
||||||
|
"instance this class uses when constructing other MBeans",
|
||||||
|
new MBeanParameterInfo[0]);
|
||||||
|
|
||||||
|
MBEAN_INFO = new MBeanInfo(
|
||||||
|
SigarRegistry.class.getName(),
|
||||||
|
"Sigar MBean registry. Provides a central point for creation " +
|
||||||
|
"and destruction of Sigar MBeans. Any Sigar MBean created via " +
|
||||||
|
"this instance will automatically be cleaned up when this " +
|
||||||
|
"instance is deregistered from the MBean server.",
|
||||||
|
null /*new MBeanAttributeInfo[0]*/,
|
||||||
|
new MBeanConstructorInfo[]{
|
||||||
|
MBEAN_CONSTR_DEFAULT},
|
||||||
|
null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String objectName;
|
||||||
|
|
||||||
|
private final ArrayList managedBeans;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new instance of this class. Will create the Sigar instance this
|
||||||
|
* class uses when constructing other MBeans.
|
||||||
|
*/
|
||||||
|
public SigarRegistry () {
|
||||||
|
super(new Sigar(), CACHELESS);
|
||||||
|
this.objectName = SigarInvokerJMX.DOMAIN_NAME + ":"
|
||||||
|
+ MBEAN_ATTR_TYPE + "=" + MBEAN_TYPE;
|
||||||
|
this.managedBeans = new ArrayList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @see AbstractMBean#getObjectName()
|
||||||
|
*/
|
||||||
|
public String getObjectName() {
|
||||||
|
return this.objectName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see javax.management.DynamicMBean#getMBeanInfo()
|
||||||
|
*/
|
||||||
|
public MBeanInfo getMBeanInfo() {
|
||||||
|
return MBEAN_INFO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see javax.management.DynamicMBean#getAttribute(java.lang.String)
|
||||||
|
*/
|
||||||
|
public Object getAttribute(String attr) throws AttributeNotFoundException {
|
||||||
|
throw new AttributeNotFoundException(attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see javax.management.DynamicMBean#setAttribute(javax.management.Attribute)
|
||||||
|
*/
|
||||||
|
public void setAttribute(Attribute attr) throws AttributeNotFoundException {
|
||||||
|
throw new AttributeNotFoundException(attr.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
/* (non-Javadoc)
|
||||||
|
* @see javax.management.DynamicMBean#invoke(java.lang.String, java.lang.Object[], java.lang.String[])
|
||||||
|
*/
|
||||||
|
public Object invoke(String action, Object[] params, String[] signatures)
|
||||||
|
throws MBeanException, ReflectionException {
|
||||||
|
throw new ReflectionException(new NoSuchMethodException(action), action);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------
|
||||||
|
// Implementation of the MBeanRegistration interface
|
||||||
|
// -------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers the default set of Sigar MBeans. Before doing so, a super call
|
||||||
|
* is made to satisfy {@link AbstractMBean}.
|
||||||
|
*
|
||||||
|
* @see AbstractMBean#postRegister(Boolean)
|
||||||
|
*/
|
||||||
|
public void postRegister(Boolean success) {
|
||||||
|
|
||||||
|
super.postRegister(success);
|
||||||
|
|
||||||
|
if (!success.booleanValue())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// get CPUs
|
||||||
|
registerCpuBeans();
|
||||||
|
|
||||||
|
// get memory
|
||||||
|
registerMemoryBeans();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers MBeans for the Sigar types <code>Cpu</code>, <code>CpuPerc</code>
|
||||||
|
* and <code>CpuInfo</code>. One instance will be registered for each CPU
|
||||||
|
* (core?) found.
|
||||||
|
*/
|
||||||
|
private void registerCpuBeans() {
|
||||||
|
ObjectInstance nextRegistered = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
final int cpuCount = sigar.getCpuInfoList().length;
|
||||||
|
for (int i = 0; i < cpuCount; i++) {
|
||||||
|
SigarCpu nextCpu = new SigarCpu(sigarImpl, i);
|
||||||
|
SigarCpuPerc nextCpuPerc = new SigarCpuPerc(sigarImpl, i);
|
||||||
|
SigarCpuInfo nextCpuInfo = new SigarCpuInfo(sigarImpl, i);
|
||||||
|
try {
|
||||||
|
if (!mbeanServer.isRegistered(new ObjectName(nextCpu.getObjectName())))
|
||||||
|
nextRegistered = mbeanServer.registerMBean(nextCpu, null);
|
||||||
|
} catch (Exception e) { // ignore
|
||||||
|
}
|
||||||
|
// add MBean to set of managed beans
|
||||||
|
managedBeans.add(nextRegistered.getObjectName());
|
||||||
|
try {
|
||||||
|
if (!mbeanServer.isRegistered(new ObjectName(nextCpuPerc.getObjectName())))
|
||||||
|
nextRegistered = mbeanServer.registerMBean(nextCpuPerc, null);
|
||||||
|
} catch (Exception e) { // ignore
|
||||||
|
}
|
||||||
|
// add MBean to set of managed beans
|
||||||
|
managedBeans.add(nextRegistered.getObjectName());
|
||||||
|
try {
|
||||||
|
if (!mbeanServer.isRegistered(new ObjectName(nextCpuInfo.getObjectName())))
|
||||||
|
nextRegistered = mbeanServer.registerMBean(nextCpuInfo, null);
|
||||||
|
} catch (Exception e) { // ignore
|
||||||
|
}
|
||||||
|
// add MBean to set of managed beans
|
||||||
|
managedBeans.add(nextRegistered.getObjectName());
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (SigarException e) {
|
||||||
|
throw unexpectedError("CpuInfoList", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers MBeans for the Sigar types <code>Mem</code> and <code>Swap</code>.
|
||||||
|
*/
|
||||||
|
private void registerMemoryBeans() {
|
||||||
|
|
||||||
|
ObjectInstance nextRegistered = null;
|
||||||
|
|
||||||
|
SigarMem mem = new SigarMem(sigarImpl);
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (!mbeanServer.isRegistered(new ObjectName(mem.getObjectName())))
|
||||||
|
nextRegistered = mbeanServer.registerMBean(mem, null);
|
||||||
|
} catch (Exception e) { // ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
// add MBean to set of managed beans
|
||||||
|
managedBeans.add(nextRegistered.getObjectName());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deregisters all Sigar MBeans that were created and registered using this
|
||||||
|
* instance. After doing so, a super call is made to satisfy {@link AbstractMBean}.
|
||||||
|
* @throws Exception
|
||||||
|
*
|
||||||
|
* @see AbstractMBean#preDeregister()
|
||||||
|
*/
|
||||||
|
public void preDeregister() throws Exception {
|
||||||
|
|
||||||
|
// count backwards to remove ONs immediately
|
||||||
|
for (int i = managedBeans.size() - 1; i >= 0; i--) {
|
||||||
|
ObjectName next = (ObjectName) managedBeans.remove(i);
|
||||||
|
if (mbeanServer.isRegistered(next)) {
|
||||||
|
try {
|
||||||
|
mbeanServer.unregisterMBean(next);
|
||||||
|
} catch (Exception e) { // ignore
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// do the super call
|
||||||
|
super.preDeregister();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue