This commit is contained in:
Doug MacEachern 2009-02-09 14:12:02 -08:00
parent e1f64cfe2d
commit 168c14e0ff
3 changed files with 870 additions and 870 deletions

View File

@ -1,273 +1,273 @@
/* /*
* Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc. * Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
* This file is part of SIGAR. * This file is part of SIGAR.
* *
* SIGAR is free software; you can redistribute it and/or modify * SIGAR is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as * it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. This program is distributed * published by the Free Software Foundation. This program is distributed
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more * PARTICULAR PURPOSE. See the GNU General Public License for more
* details. * details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA. * USA.
*/ */
package org.hyperic.sigar.jmx; package org.hyperic.sigar.jmx;
import javax.management.Attribute; import javax.management.Attribute;
import javax.management.AttributeList; import javax.management.AttributeList;
import javax.management.AttributeNotFoundException; import javax.management.AttributeNotFoundException;
import javax.management.DynamicMBean; import javax.management.DynamicMBean;
import javax.management.MBeanException; import javax.management.MBeanException;
import javax.management.MBeanRegistration; import javax.management.MBeanRegistration;
import javax.management.MBeanServer; import javax.management.MBeanServer;
import javax.management.ObjectName; import javax.management.ObjectName;
import javax.management.ReflectionException; import javax.management.ReflectionException;
import org.hyperic.sigar.Sigar; import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException; import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.SigarProxy; import org.hyperic.sigar.SigarProxy;
import org.hyperic.sigar.SigarProxyCache; import org.hyperic.sigar.SigarProxyCache;
/** /**
* Base class for all Sigar JMX MBeans. Provides a skeleton which handles * Base class for all Sigar JMX MBeans. Provides a skeleton which handles
* creation of the Sigar proxy instance and provides some convenience methods. * creation of the Sigar proxy instance and provides some convenience methods.
* It also enforces usage of the {@link DynamicMBean} inferface while * It also enforces usage of the {@link DynamicMBean} inferface while
* implementing part of it, and it adds empty implementations for all methods of * implementing part of it, and it adds empty implementations for all methods of
* the {@link MBeanRegistration} interface, allowing subclasses to only * the {@link MBeanRegistration} interface, allowing subclasses to only
* implement subset of them. * implement subset of them.
* *
* @author Bjoern Martin * @author Bjoern Martin
* @since 1.5 * @since 1.5
*/ */
public abstract class AbstractMBean implements DynamicMBean, MBeanRegistration { public abstract class AbstractMBean implements DynamicMBean, MBeanRegistration {
public static final String MBEAN_DOMAIN = SigarInvokerJMX.DOMAIN_NAME; public static final String MBEAN_DOMAIN = SigarInvokerJMX.DOMAIN_NAME;
public static final String MBEAN_ATTR_TYPE = SigarInvokerJMX.PROP_TYPE; public static final String MBEAN_ATTR_TYPE = SigarInvokerJMX.PROP_TYPE;
protected static final short CACHED_30SEC = 0; protected static final short CACHED_30SEC = 0;
protected static final short CACHED_5SEC = 1; protected static final short CACHED_5SEC = 1;
protected static final short CACHED_500MS = 2; protected static final short CACHED_500MS = 2;
protected static final short CACHELESS = 3; protected static final short CACHELESS = 3;
protected static final short DEFAULT = CACHED_30SEC; protected static final short DEFAULT = CACHED_30SEC;
/** /**
* The Sigar implementation to be used to fetch information from the system. * The Sigar implementation to be used to fetch information from the system.
*/ */
protected final Sigar sigarImpl; protected final Sigar sigarImpl;
/** /**
* The Sigar proxy cache to be used in case the data does not have to be * 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 * fetched during each call. The cache timeout is decided during
* construction. See {@link AbstractMBean#AbstractMBean(Sigar, short)} for * construction. See {@link AbstractMBean#AbstractMBean(Sigar, short)} for
* details. * details.
* *
* @see AbstractMBean#AbstractMBean(Sigar, short) * @see AbstractMBean#AbstractMBean(Sigar, short)
*/ */
protected final SigarProxy sigar; protected final SigarProxy sigar;
/** /**
* The MBean server this MBean is registered to. Set during the MBean's * 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 * registration to the MBean server and unset to <code>null</code> when
* the deregistration finished. * the deregistration finished.
* *
* @see #preRegister(MBeanServer, ObjectName) * @see #preRegister(MBeanServer, ObjectName)
* @see #postDeregister() * @see #postDeregister()
*/ */
protected MBeanServer mbeanServer; protected MBeanServer mbeanServer;
/** /**
* <p>Creates a new instance of this class. The Sigar instance is stored (and * <p>Creates a new instance of this class. The Sigar instance is stored (and
* accessible) via the {@link #sigarImpl} member. A second instance is * accessible) via the {@link #sigarImpl} member. A second instance is
* stored within the {@link #sigar} member which is either {@link #sigarImpl} * stored within the {@link #sigar} member which is either {@link #sigarImpl}
* or an instance of {@link SigarProxyCache} with the expiration time set to * or an instance of {@link SigarProxyCache} with the expiration time set to
* whatever the <code>cacheMode</code> parameter specifies.</p> * whatever the <code>cacheMode</code> parameter specifies.</p>
* *
* <p>The following cache modes exist:</p> * <p>The following cache modes exist:</p>
* *
* <table border = "1"> * <table border = "1">
* <tr><td><b>Constant</b></td><td><b>Description</b></td></tr> * <tr><td><b>Constant</b></td><td><b>Description</b></td></tr>
* <tr><td>{@link #CACHELESS}</td><td>No cached instance, {@link #sigar} * <tr><td>{@link #CACHELESS}</td><td>No cached instance, {@link #sigar}
* <code>==</code> {@link #sigarImpl}.</td></tr> * <code>==</code> {@link #sigarImpl}.</td></tr>
* <tr><td>{@link #CACHED_500MS}</td><td>500 millisecond cache, for high * <tr><td>{@link #CACHED_500MS}</td><td>500 millisecond cache, for high
* frequency queries on raw data such as reading out CPU timers each * frequency queries on raw data such as reading out CPU timers each
* second. Avoids reading out multiple data sets when all attributes of * second. Avoids reading out multiple data sets when all attributes of
* an MBean are queried in short sequence.</td></tr> * an MBean are queried in short sequence.</td></tr>
* <tr><td>{@link #CACHED_5SEC}</td><td>5 second cache, for high frequency * <tr><td>{@link #CACHED_5SEC}</td><td>5 second cache, for high frequency
* queries on calculated data such as CPU percentages.</td></tr> * queries on calculated data such as CPU percentages.</td></tr>
* <tr><td>{@link #CACHED_30SEC}</td><td>30 second cache, for normal queries * <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 * or data readouts such as CPU model / vendor. This is the default if
* nothing (<code>0</code>) is specified.</td></tr> * nothing (<code>0</code>) is specified.</td></tr>
* <tr><td>{@link #DEFAULT}</td><td>Same as {@link #CACHED_30SEC}.</td></tr> * <tr><td>{@link #DEFAULT}</td><td>Same as {@link #CACHED_30SEC}.</td></tr>
* </table> * </table>
* *
* <p><b>Note:</b> Only make use of the cacheless or half second mode if you * <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 * know what you are doing. They may have impact on system performance if
* used excessively.</p> * used excessively.</p>
* *
* @param sigar The Sigar impl to use. Must not be <code>null</code> * @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} * @param cacheMode The cache mode to use for {@link #sigar} or {@link #CACHELESS}
* if no separate, cached instance is to be maintained. * if no separate, cached instance is to be maintained.
*/ */
protected AbstractMBean(Sigar sigar, short cacheMode) { protected AbstractMBean(Sigar sigar, short cacheMode) {
// store Sigar // store Sigar
this.sigarImpl = sigar; this.sigarImpl = sigar;
// create a cached instance as well // create a cached instance as well
if (cacheMode == CACHELESS) { if (cacheMode == CACHELESS) {
// no cached version // no cached version
this.sigar = this.sigarImpl; this.sigar = this.sigarImpl;
} else if (cacheMode == CACHED_500MS) { } else if (cacheMode == CACHED_500MS) {
// 500ms cached version (for 1/sec queries) // 500ms cached version (for 1/sec queries)
this.sigar = SigarProxyCache.newInstance(this.sigarImpl, 500); this.sigar = SigarProxyCache.newInstance(this.sigarImpl, 500);
} else if (cacheMode == CACHED_5SEC) { } else if (cacheMode == CACHED_5SEC) {
// 5sec cached version (for avg'd queries) // 5sec cached version (for avg'd queries)
this.sigar = SigarProxyCache.newInstance(this.sigarImpl, 5000); this.sigar = SigarProxyCache.newInstance(this.sigarImpl, 5000);
} else /* if (cacheMode == CACHED_30SEC) */{ } else /* if (cacheMode == CACHED_30SEC) */{
// 30sec (default) cached version (for info and long term queries) // 30sec (default) cached version (for info and long term queries)
this.sigar = SigarProxyCache.newInstance(this.sigarImpl, 30000); this.sigar = SigarProxyCache.newInstance(this.sigarImpl, 30000);
} }
} }
/** /**
* Returns the object name the MBean is registered with within the * Returns the object name the MBean is registered with within the
* MBeanServer. May be <code>null</code> in case the instance is not * MBeanServer. May be <code>null</code> in case the instance is not
* registered to an MBeanServer, but used standalone. * registered to an MBeanServer, but used standalone.
* *
* @return The object name or <code>null</code> if not registered to an * @return The object name or <code>null</code> if not registered to an
* MBeanServer * MBeanServer
*/ */
public abstract String getObjectName(); public abstract String getObjectName();
/** /**
* Returns a runtime exception for the type and SigarException specified. * Returns a runtime exception for the type and SigarException specified.
* *
* @param type * @param type
* The type that was called * The type that was called
* @param e * @param e
* The exception that was raised * The exception that was raised
* @return A runtime exception encapsulating the information specified * @return A runtime exception encapsulating the information specified
*/ */
protected RuntimeException unexpectedError(String type, SigarException e) { protected RuntimeException unexpectedError(String type, SigarException e) {
String msg = "Unexected error in Sigar.get" + type + ": " String msg = "Unexected error in Sigar.get" + type + ": "
+ e.getMessage(); + e.getMessage();
return new IllegalArgumentException(msg); return new IllegalArgumentException(msg);
} }
/** /**
* Loops over all attributes and calls * Loops over all attributes and calls
* {@link DynamicMBean#getAttribute(java.lang.String)} method for each * {@link DynamicMBean#getAttribute(java.lang.String)} method for each
* attribute sequentially. Any exception thrown by those methods are ignored * attribute sequentially. Any exception thrown by those methods are ignored
* and simply cause the attribute not being added to the result. * and simply cause the attribute not being added to the result.
*/ */
public AttributeList getAttributes(String[] attrs) { public AttributeList getAttributes(String[] attrs) {
final AttributeList result = new AttributeList(); final AttributeList result = new AttributeList();
for (int i = 0; i < attrs.length; i++) { for (int i = 0; i < attrs.length; i++) {
try { try {
result.add(new Attribute(attrs[i], getAttribute(attrs[i]))); result.add(new Attribute(attrs[i], getAttribute(attrs[i])));
} catch (AttributeNotFoundException e) { } catch (AttributeNotFoundException e) {
// ignore, as we cannot throw this exception // ignore, as we cannot throw this exception
} catch (MBeanException e) { } catch (MBeanException e) {
// ignore, as we cannot throw this exception // ignore, as we cannot throw this exception
} catch (ReflectionException e) { } catch (ReflectionException e) {
// ignore, as we cannot throw this exception // ignore, as we cannot throw this exception
} }
} }
return result; return result;
} }
/** /**
* Loops over all attributes and calls * Loops over all attributes and calls
* {@link DynamicMBean#setAttribute(Attribute)} for each attribute * {@link DynamicMBean#setAttribute(Attribute)} for each attribute
* sequentially. Any exception thrown by those methods are ignored and * sequentially. Any exception thrown by those methods are ignored and
* simply cause the attribute not being added to the result. * simply cause the attribute not being added to the result.
*/ */
public AttributeList setAttributes(AttributeList attrs) { public AttributeList setAttributes(AttributeList attrs) {
final AttributeList result = new AttributeList(); final AttributeList result = new AttributeList();
for (int i = 0; i < attrs.size(); i++) { for (int i = 0; i < attrs.size(); i++) {
try { try {
final Attribute next = (Attribute) attrs.get(i); final Attribute next = (Attribute) attrs.get(i);
setAttribute(next); setAttribute(next);
result.add(next); result.add(next);
} catch (AttributeNotFoundException e) { } catch (AttributeNotFoundException e) {
// ignore, as we cannot throw this exception // ignore, as we cannot throw this exception
} }
} }
return result; return result;
} }
// ------- // -------
// Implementation of the MBeanRegistration interface // Implementation of the MBeanRegistration interface
// ------- // -------
/** /**
* <p>Returns <code>new ObjectName(this.getObjectName())</code> to guarantee * <p>Returns <code>new ObjectName(this.getObjectName())</code> to guarantee
* a reliable and reproducable object name.</p> * a reliable and reproducable object name.</p>
* *
* <p><b>Note:</b> Make sure any subclass does a super call to this method, * <p><b>Note:</b> Make sure any subclass does a super call to this method,
* otherwise the implementation might be broken.</p> * otherwise the implementation might be broken.</p>
* *
* @see MBeanRegistration#preRegister(MBeanServer, ObjectName) * @see MBeanRegistration#preRegister(MBeanServer, ObjectName)
*/ */
public ObjectName preRegister(MBeanServer server, ObjectName name) public ObjectName preRegister(MBeanServer server, ObjectName name)
throws Exception { throws Exception {
this.mbeanServer = server; this.mbeanServer = server;
return new ObjectName(getObjectName()); return new ObjectName(getObjectName());
} }
/** /**
* Empty implementation, allowing subclasses to ignore the interface. * Empty implementation, allowing subclasses to ignore the interface.
* *
* <p><b>Note:</b> Make sure any subclass does a super call to this method, * <p><b>Note:</b> Make sure any subclass does a super call to this method,
* otherwise the implementation might be broken.</p> * otherwise the implementation might be broken.</p>
* *
* @see MBeanRegistration#postRegister(Boolean) * @see MBeanRegistration#postRegister(Boolean)
*/ */
public void postRegister(Boolean success) { public void postRegister(Boolean success) {
} }
/** /**
* Empty implementation, allowing subclasses to ignore the interface. * Empty implementation, allowing subclasses to ignore the interface.
* *
* <p><b>Note:</b> Make sure any subclass does a super call to this method, * <p><b>Note:</b> Make sure any subclass does a super call to this method,
* otherwise the implementation might be broken.</p> * otherwise the implementation might be broken.</p>
* *
* @see MBeanRegistration#preDeregister() * @see MBeanRegistration#preDeregister()
*/ */
public void preDeregister() throws Exception { public void preDeregister() throws Exception {
} }
/** /**
* Empty implementation, allowing subclasses to ignore the interface. * Empty implementation, allowing subclasses to ignore the interface.
* *
* <p><b>Note:</b> Make sure any subclass does a super call to this method, * <p><b>Note:</b> Make sure any subclass does a super call to this method,
* otherwise the implementation might be broken.</p> * otherwise the implementation might be broken.</p>
* *
* @see MBeanRegistration#postDeregister() * @see MBeanRegistration#postDeregister()
*/ */
public void postDeregister() { public void postDeregister() {
this.mbeanServer = null; this.mbeanServer = null;
} }
public void setAttribute(Attribute attr) throws AttributeNotFoundException { public void setAttribute(Attribute attr) throws AttributeNotFoundException {
throw new AttributeNotFoundException(attr.getName()); throw new AttributeNotFoundException(attr.getName());
} }
public Object invoke(String name, Object[] params, String[] signature) public Object invoke(String name, Object[] params, String[] signature)
throws ReflectionException { throws ReflectionException {
throw new ReflectionException(new NoSuchMethodException(name), throw new ReflectionException(new NoSuchMethodException(name),
name); name);
} }
} }

View File

@ -1,263 +1,263 @@
/* /*
* Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc. * Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
* This file is part of SIGAR. * This file is part of SIGAR.
* *
* SIGAR is free software; you can redistribute it and/or modify * SIGAR is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as * it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. This program is distributed * published by the Free Software Foundation. This program is distributed
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more * PARTICULAR PURPOSE. See the GNU General Public License for more
* details. * details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA. * USA.
*/ */
package org.hyperic.sigar.jmx; package org.hyperic.sigar.jmx;
import javax.management.Attribute; import javax.management.Attribute;
import javax.management.AttributeNotFoundException; import javax.management.AttributeNotFoundException;
import javax.management.MBeanAttributeInfo; import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo; import javax.management.MBeanConstructorInfo;
import javax.management.MBeanInfo; import javax.management.MBeanInfo;
import javax.management.MBeanParameterInfo; import javax.management.MBeanParameterInfo;
import javax.management.ReflectionException; import javax.management.ReflectionException;
import org.hyperic.sigar.Sigar; import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException; import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.SigarNotImplementedException; import org.hyperic.sigar.SigarNotImplementedException;
/** /**
* Sigar JMX MBean implementation for the <code>LoadAverage</code> information * Sigar JMX MBean implementation for the <code>LoadAverage</code> information
* package. Provides an OpenMBean conform implementation. * package. Provides an OpenMBean conform implementation.
* *
* @author Bjoern Martin * @author Bjoern Martin
* @since 1.5 * @since 1.5
*/ */
public class SigarLoadAverage extends AbstractMBean { public class SigarLoadAverage extends AbstractMBean {
private static final String MBEAN_TYPE = "LoadAverage"; private static final String MBEAN_TYPE = "LoadAverage";
/** /**
* Returned if {@link Sigar#getLoadAverage()}} is detected to be not * Returned if {@link Sigar#getLoadAverage()}} is detected to be not
* implemented on the platform. * implemented on the platform.
* *
* @see #notImplemented * @see #notImplemented
*/ */
private static final double NOT_IMPLEMENTED_LOAD_VALUE = -1.0d; private static final double NOT_IMPLEMENTED_LOAD_VALUE = -1.0d;
private static final MBeanInfo MBEAN_INFO; private static final MBeanInfo MBEAN_INFO;
private static final MBeanAttributeInfo MBEAN_ATTR_LAST1MIN; private static final MBeanAttributeInfo MBEAN_ATTR_LAST1MIN;
private static final MBeanAttributeInfo MBEAN_ATTR_LAST5MIN; private static final MBeanAttributeInfo MBEAN_ATTR_LAST5MIN;
private static final MBeanAttributeInfo MBEAN_ATTR_LAST15MIN; private static final MBeanAttributeInfo MBEAN_ATTR_LAST15MIN;
private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR; private static final MBeanConstructorInfo MBEAN_CONSTR_SIGAR;
private static MBeanParameterInfo MBEAN_PARAM_SIGAR; private static MBeanParameterInfo MBEAN_PARAM_SIGAR;
static { static {
MBEAN_ATTR_LAST1MIN = new MBeanAttributeInfo( MBEAN_ATTR_LAST1MIN = new MBeanAttributeInfo(
"LastMinute", "LastMinute",
"double", "double",
"The load average in the last minute, as a fraction of 1, or " "The load average in the last minute, as a fraction of 1, or "
+ "-1.0 if the load cannot be determined on this platform", + "-1.0 if the load cannot be determined on this platform",
true, false, false); true, false, false);
MBEAN_ATTR_LAST5MIN = new MBeanAttributeInfo( MBEAN_ATTR_LAST5MIN = new MBeanAttributeInfo(
"LastFiveMinutes", "LastFiveMinutes",
"double", "double",
"The load average over the last five minutes, as a fraction " "The load average over the last five minutes, as a fraction "
+ "of 1, or -1.0 if the load cannot be determined on this platform", + "of 1, or -1.0 if the load cannot be determined on this platform",
true, false, false); true, false, false);
MBEAN_ATTR_LAST15MIN = new MBeanAttributeInfo( MBEAN_ATTR_LAST15MIN = new MBeanAttributeInfo(
"Last15Minutes", "Last15Minutes",
"double", "double",
"The load average over the last 15 minutes, as a fraction of " "The load average over the last 15 minutes, as a fraction of "
+ "1, or -1.0 if the load cannot be determined on this platform", + "1, or -1.0 if the load cannot be determined on this platform",
true, false, false); true, false, false);
MBEAN_PARAM_SIGAR = new MBeanParameterInfo("sigar", Sigar.class MBEAN_PARAM_SIGAR = new MBeanParameterInfo("sigar", Sigar.class
.getName(), "The Sigar instance to use to fetch data from"); .getName(), "The Sigar instance to use to fetch data from");
MBEAN_CONSTR_SIGAR = new MBeanConstructorInfo( MBEAN_CONSTR_SIGAR = new MBeanConstructorInfo(
SigarLoadAverage.class.getName(), SigarLoadAverage.class.getName(),
"Creates a new instance, using the Sigar instance specified " "Creates a new instance, using the Sigar instance specified "
+ "to fetch the data. Fails if the CPU index is out of range.", + "to fetch the data. Fails if the CPU index is out of range.",
new MBeanParameterInfo[] { MBEAN_PARAM_SIGAR }); new MBeanParameterInfo[] { MBEAN_PARAM_SIGAR });
MBEAN_INFO = new MBeanInfo( MBEAN_INFO = new MBeanInfo(
SigarLoadAverage.class.getName(), SigarLoadAverage.class.getName(),
"Sigar load average MBean. Provides load averages of the " "Sigar load average MBean. Provides load averages of the "
+ "system over the last one, five and 15 minutes. Due to the " + "system over the last one, five and 15 minutes. Due to the "
+ "long term character of that information, the fetch is done " + "long term character of that information, the fetch is done "
+ "using a Sigar proxy cache with a timeout of 30 seconds.", + "using a Sigar proxy cache with a timeout of 30 seconds.",
new MBeanAttributeInfo[] { MBEAN_ATTR_LAST1MIN, new MBeanAttributeInfo[] { MBEAN_ATTR_LAST1MIN,
MBEAN_ATTR_LAST5MIN, MBEAN_ATTR_LAST15MIN }, MBEAN_ATTR_LAST5MIN, MBEAN_ATTR_LAST15MIN },
new MBeanConstructorInfo[] { MBEAN_CONSTR_SIGAR }, null, null); new MBeanConstructorInfo[] { MBEAN_CONSTR_SIGAR }, null, null);
} }
/** /**
* Object name this instance will give itself when being registered to an * Object name this instance will give itself when being registered to an
* MBeanServer. * MBeanServer.
*/ */
private final String objectName; private final String objectName;
/** /**
* <p>Set <code>true</code> when the load average fetch failed with a * <p>Set <code>true</code> when the load average fetch failed with a
* <code>SigarException</code> that indicates the method is not implemented. * <code>SigarException</code> that indicates the method is not implemented.
* Any subsequent call to this instance will then be answered with * Any subsequent call to this instance will then be answered with
* {@link #NOT_IMPLEMENTED_LOAD_VALUE}. * {@link #NOT_IMPLEMENTED_LOAD_VALUE}.
* </p> * </p>
* *
* <p><b>FIXME</b> : This is a workaround and should be replaced by something * <p><b>FIXME</b> : This is a workaround and should be replaced by something
* more stable, as the code setting this member <code>true</code> relies on * more stable, as the code setting this member <code>true</code> relies on
* a substring being present within the exception. A proposal was made at * a substring being present within the exception. A proposal was made at
* <a href="http://jira.hyperic.com/browse/SIGAR-52">issue SIGAR-52</a>. * <a href="http://jira.hyperic.com/browse/SIGAR-52">issue SIGAR-52</a>.
* </p> * </p>
*/ */
private boolean notImplemented; private boolean notImplemented;
/** /**
* Creates a new instance, using a new Sigar instance to fetch the data. * Creates a new instance, using a new Sigar instance to fetch the data.
* *
* @throws IllegalArgumentException * @throws IllegalArgumentException
* If an unexpected Sigar error occurs. * If an unexpected Sigar error occurs.
*/ */
public SigarLoadAverage() throws IllegalArgumentException { public SigarLoadAverage() throws IllegalArgumentException {
this(new Sigar()); this(new Sigar());
} }
/** /**
* Creates a new instance, using the Sigar instance specified to fetch the * Creates a new instance, using the Sigar instance specified to fetch the
* data. * data.
* *
* @param sigar * @param sigar
* The Sigar instance to use to fetch data from * The Sigar instance to use to fetch data from
* *
* @throws IllegalArgumentException * @throws IllegalArgumentException
* If an unexpected Sigar error occurs * If an unexpected Sigar error occurs
*/ */
public SigarLoadAverage(Sigar sigar) throws IllegalArgumentException { public SigarLoadAverage(Sigar sigar) throws IllegalArgumentException {
super(sigar, CACHED_30SEC); super(sigar, CACHED_30SEC);
// all fine // all fine
this.objectName = MBEAN_DOMAIN + ":" + MBEAN_ATTR_TYPE this.objectName = MBEAN_DOMAIN + ":" + MBEAN_ATTR_TYPE
+ "=" + MBEAN_TYPE; + "=" + MBEAN_TYPE;
} }
/** /**
* Object name this instance will give itself when being registered to an * Object name this instance will give itself when being registered to an
* MBeanServer. * MBeanServer.
*/ */
public String getObjectName() { public String getObjectName() {
return this.objectName; return this.objectName;
} }
/** /**
* @return The load average in the last minute, as a fraction of 1, or * @return The load average in the last minute, as a fraction of 1, or
* <code>-1.0d</code> if the load cannot be determined on this platform * <code>-1.0d</code> if the load cannot be determined on this platform
*/ */
public double getLastMinute() { public double getLastMinute() {
try { try {
return sigarImpl.getLoadAverage()[0]; return sigarImpl.getLoadAverage()[0];
} catch (SigarNotImplementedException e) { } catch (SigarNotImplementedException e) {
return NOT_IMPLEMENTED_LOAD_VALUE; return NOT_IMPLEMENTED_LOAD_VALUE;
} catch (SigarException e) { } catch (SigarException e) {
throw unexpectedError(MBEAN_TYPE, e); throw unexpectedError(MBEAN_TYPE, e);
} }
} }
/** /**
* @return The load average over the last five minutes, as a fraction of 1, * @return The load average over the last five minutes, as a fraction of 1,
* or <code>-1.0d</code> if the load cannot be determined on this * or <code>-1.0d</code> if the load cannot be determined on this
* platform * platform
*/ */
public double getLastFiveMinutes() { public double getLastFiveMinutes() {
try { try {
return sigarImpl.getLoadAverage()[1]; return sigarImpl.getLoadAverage()[1];
} catch (SigarNotImplementedException e) { } catch (SigarNotImplementedException e) {
return NOT_IMPLEMENTED_LOAD_VALUE; return NOT_IMPLEMENTED_LOAD_VALUE;
} catch (SigarException e) { } catch (SigarException e) {
throw unexpectedError(MBEAN_TYPE, e); throw unexpectedError(MBEAN_TYPE, e);
} }
} }
/** /**
* @return The load average over the last 15 minutes, as a fraction of 1, or * @return The load average over the last 15 minutes, as a fraction of 1, or
* <code>-1.0d</code> if the load cannot be determined on this platform * <code>-1.0d</code> if the load cannot be determined on this platform
*/ */
public double getLast15Minutes() { public double getLast15Minutes() {
try { try {
return sigarImpl.getLoadAverage()[2]; return sigarImpl.getLoadAverage()[2];
} catch (SigarNotImplementedException e) { } catch (SigarNotImplementedException e) {
return NOT_IMPLEMENTED_LOAD_VALUE; return NOT_IMPLEMENTED_LOAD_VALUE;
} catch (SigarException e) { } catch (SigarException e) {
throw unexpectedError(MBEAN_TYPE, e); throw unexpectedError(MBEAN_TYPE, e);
} }
} }
// ------- // -------
// Implementation of the DynamicMBean interface // Implementation of the DynamicMBean interface
// ------- // -------
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see DynamicMBean#getAttribute(String) * @see DynamicMBean#getAttribute(String)
*/ */
public Object getAttribute(String attr) throws AttributeNotFoundException { public Object getAttribute(String attr) throws AttributeNotFoundException {
if (MBEAN_ATTR_LAST1MIN.getName().equals(attr)) { if (MBEAN_ATTR_LAST1MIN.getName().equals(attr)) {
return new Double(getLastMinute()); return new Double(getLastMinute());
} else if (MBEAN_ATTR_LAST5MIN.getName().equals(attr)) { } else if (MBEAN_ATTR_LAST5MIN.getName().equals(attr)) {
return new Double(getLastFiveMinutes()); return new Double(getLastFiveMinutes());
} else if (MBEAN_ATTR_LAST15MIN.getName().equals(attr)) { } else if (MBEAN_ATTR_LAST15MIN.getName().equals(attr)) {
return new Double(getLast15Minutes()); return new Double(getLast15Minutes());
} else { } else {
throw new AttributeNotFoundException(attr); throw new AttributeNotFoundException(attr);
} }
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see DynamicMBean#setAttribute(Attribute) * @see DynamicMBean#setAttribute(Attribute)
*/ */
public void setAttribute(Attribute attr) throws AttributeNotFoundException { public void setAttribute(Attribute attr) throws AttributeNotFoundException {
throw new AttributeNotFoundException(attr.getName()); throw new AttributeNotFoundException(attr.getName());
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see DynamicMBean#invoke(String, Object[], String[]) * @see DynamicMBean#invoke(String, Object[], String[])
*/ */
public Object invoke(String actionName, Object[] params, String[] signature) public Object invoke(String actionName, Object[] params, String[] signature)
throws ReflectionException { throws ReflectionException {
throw new ReflectionException(new NoSuchMethodException(actionName), throw new ReflectionException(new NoSuchMethodException(actionName),
actionName); actionName);
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* *
* @see DynamicMBean#getMBeanInfo() * @see DynamicMBean#getMBeanInfo()
*/ */
public MBeanInfo getMBeanInfo() { public MBeanInfo getMBeanInfo() {
return MBEAN_INFO; return MBEAN_INFO;
} }
} }

View File

@ -1,334 +1,334 @@
/* /*
* Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc. * Copyright (C) [2004, 2005, 2006, 2007], Hyperic, Inc.
* This file is part of SIGAR. * This file is part of SIGAR.
* *
* SIGAR is free software; you can redistribute it and/or modify * SIGAR is free software; you can redistribute it and/or modify
* it under the terms version 2 of the GNU General Public License as * it under the terms version 2 of the GNU General Public License as
* published by the Free Software Foundation. This program is distributed * published by the Free Software Foundation. This program is distributed
* in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A * even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more * PARTICULAR PURPOSE. See the GNU General Public License for more
* details. * details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA. * USA.
*/ */
package org.hyperic.sigar.jmx; package org.hyperic.sigar.jmx;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
import javax.management.AttributeNotFoundException; import javax.management.AttributeNotFoundException;
import javax.management.MBeanAttributeInfo; import javax.management.MBeanAttributeInfo;
import javax.management.MBeanConstructorInfo; import javax.management.MBeanConstructorInfo;
import javax.management.MBeanInfo; import javax.management.MBeanInfo;
import javax.management.MBeanParameterInfo; import javax.management.MBeanParameterInfo;
import javax.management.MBeanServer; import javax.management.MBeanServer;
import javax.management.ObjectInstance; import javax.management.ObjectInstance;
import javax.management.ObjectName; import javax.management.ObjectName;
import org.hyperic.sigar.CpuInfo; import org.hyperic.sigar.CpuInfo;
import org.hyperic.sigar.FileSystem; import org.hyperic.sigar.FileSystem;
import org.hyperic.sigar.NetInterfaceConfig; import org.hyperic.sigar.NetInterfaceConfig;
import org.hyperic.sigar.Sigar; import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException; import org.hyperic.sigar.SigarException;
import org.hyperic.sigar.SigarLoader; import org.hyperic.sigar.SigarLoader;
/** /**
* <p>Registry of all Sigar MBeans. Can be used as a convenient way to invoke * <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 * Sigar MBeans at a central point. This brings a bunch of advantages with
* it:</p> * it:</p>
* *
* <ul> * <ul>
* <li>This class can be instantiated and registered to the MBean server by * <li>This class can be instantiated and registered to the MBean server by
* simply calling {@link MBeanServer#createMBean(String, ObjectName)}, * simply calling {@link MBeanServer#createMBean(String, ObjectName)},
* resulting in the automatic creation of all known default Sigar MBeans such * resulting in the automatic creation of all known default Sigar MBeans such
* as CPU and memory monitoring beans.</li> * as CPU and memory monitoring beans.</li>
* <li>Any Sigar MBean spawned by an instance of this class will use the same * <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 * {@link org.hyperic.sigar.Sigar} instance, saving resources in the
* process.</li> * process.</li>
* <li>When this instance is deregistered from the MBean server, it will * <li>When this instance is deregistered from the MBean server, it will
* automatically deregister all instances it created, cleaning up behind * automatically deregister all instances it created, cleaning up behind
* itself.</li> * itself.</li>
* </ul> * </ul>
* *
* <p>So using this class to manage the Sigar MBeans requires one line of code * <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 * for creation, registration and MBean spawning, and one line of code to shut
* it all down again.</p> * it all down again.</p>
* *
* @author Bjoern Martin * @author Bjoern Martin
* @since 1.5 * @since 1.5
*/ */
public class SigarRegistry extends AbstractMBean { public class SigarRegistry extends AbstractMBean {
private static final String MBEAN_TYPE = "SigarRegistry"; private static final String MBEAN_TYPE = "SigarRegistry";
private static final Map VERSION_ATTRS = new LinkedHashMap(); private static final Map VERSION_ATTRS = new LinkedHashMap();
private static final MBeanInfo MBEAN_INFO; private static final MBeanInfo MBEAN_INFO;
private static final MBeanConstructorInfo MBEAN_CONSTR_DEFAULT; private static final MBeanConstructorInfo MBEAN_CONSTR_DEFAULT;
// private static final MBeanOperationInfo MBEAN_OPER_LISTPROCESSES; // private static final MBeanOperationInfo MBEAN_OPER_LISTPROCESSES;
static { static {
MBEAN_CONSTR_DEFAULT = new MBeanConstructorInfo( MBEAN_CONSTR_DEFAULT = new MBeanConstructorInfo(
SigarRegistry.class.getName(), SigarRegistry.class.getName(),
"Creates a new instance of this class. Will create the Sigar " "Creates a new instance of this class. Will create the Sigar "
+ "instance this class uses when constructing other MBeans", + "instance this class uses when constructing other MBeans",
new MBeanParameterInfo[0]); new MBeanParameterInfo[0]);
// MBEAN_OPER_LISTPROCESSES = new MBeanOperationInfo("listProcesses", // MBEAN_OPER_LISTPROCESSES = new MBeanOperationInfo("listProcesses",
// "Executes a query returning the process IDs of all processes " + // "Executes a query returning the process IDs of all processes " +
// "found on the system.", // "found on the system.",
// null /* new MBeanParameterInfo[0] */, // null /* new MBeanParameterInfo[0] */,
// String.class.getName(), MBeanOperationInfo.INFO); // String.class.getName(), MBeanOperationInfo.INFO);
MBEAN_INFO = new MBeanInfo( MBEAN_INFO = new MBeanInfo(
SigarRegistry.class.getName(), SigarRegistry.class.getName(),
"Sigar MBean registry. Provides a central point for creation " "Sigar MBean registry. Provides a central point for creation "
+ "and destruction of Sigar MBeans. Any Sigar MBean created via " + "and destruction of Sigar MBeans. Any Sigar MBean created via "
+ "this instance will automatically be cleaned up when this " + "this instance will automatically be cleaned up when this "
+ "instance is deregistered from the MBean server.", + "instance is deregistered from the MBean server.",
getAttributeInfo(), getAttributeInfo(),
new MBeanConstructorInfo[] { MBEAN_CONSTR_DEFAULT }, new MBeanConstructorInfo[] { MBEAN_CONSTR_DEFAULT },
null /*new MBeanOperationInfo[0] */, null /*new MBeanOperationInfo[0] */,
null /*new MBeanNotificationInfo[0]*/); null /*new MBeanNotificationInfo[0]*/);
} }
private final String objectName; private final String objectName;
private final ArrayList managedBeans; private final ArrayList managedBeans;
private static MBeanAttributeInfo[] getAttributeInfo() { private static MBeanAttributeInfo[] getAttributeInfo() {
VERSION_ATTRS.put("JarVersion", Sigar.VERSION_STRING); VERSION_ATTRS.put("JarVersion", Sigar.VERSION_STRING);
VERSION_ATTRS.put("NativeVersion", Sigar.NATIVE_VERSION_STRING); VERSION_ATTRS.put("NativeVersion", Sigar.NATIVE_VERSION_STRING);
VERSION_ATTRS.put("JarBuildDate", Sigar.BUILD_DATE); VERSION_ATTRS.put("JarBuildDate", Sigar.BUILD_DATE);
VERSION_ATTRS.put("NativeBuildDate", Sigar.NATIVE_BUILD_DATE); VERSION_ATTRS.put("NativeBuildDate", Sigar.NATIVE_BUILD_DATE);
VERSION_ATTRS.put("JarSourceRevision", Sigar.SCM_REVISION); VERSION_ATTRS.put("JarSourceRevision", Sigar.SCM_REVISION);
VERSION_ATTRS.put("NativeSourceRevision", Sigar.NATIVE_SCM_REVISION); VERSION_ATTRS.put("NativeSourceRevision", Sigar.NATIVE_SCM_REVISION);
VERSION_ATTRS.put("NativeLibraryName", SigarLoader.getNativeLibraryName()); VERSION_ATTRS.put("NativeLibraryName", SigarLoader.getNativeLibraryName());
MBeanAttributeInfo[] attrs = new MBeanAttributeInfo[VERSION_ATTRS.size()]; MBeanAttributeInfo[] attrs = new MBeanAttributeInfo[VERSION_ATTRS.size()];
int i=0; int i=0;
for (Iterator it=VERSION_ATTRS.entrySet().iterator(); for (Iterator it=VERSION_ATTRS.entrySet().iterator();
it.hasNext();) it.hasNext();)
{ {
Map.Entry entry = (Map.Entry)it.next(); Map.Entry entry = (Map.Entry)it.next();
String name = (String)entry.getKey(); String name = (String)entry.getKey();
attrs[i++] = attrs[i++] =
new MBeanAttributeInfo(name, new MBeanAttributeInfo(name,
entry.getValue().getClass().getName(), entry.getValue().getClass().getName(),
name, name,
true, // isReadable true, // isReadable
false, // isWritable false, // isWritable
false); // isIs false); // isIs
} }
return attrs; return attrs;
} }
/** /**
* Creates a new instance of this class. Will create the Sigar instance this * Creates a new instance of this class. Will create the Sigar instance this
* class uses when constructing other MBeans. * class uses when constructing other MBeans.
*/ */
public SigarRegistry() { public SigarRegistry() {
super(new Sigar(), CACHELESS); super(new Sigar(), CACHELESS);
this.objectName = MBEAN_DOMAIN + ":" + MBEAN_ATTR_TYPE this.objectName = MBEAN_DOMAIN + ":" + MBEAN_ATTR_TYPE
+ "=" + MBEAN_TYPE; + "=" + MBEAN_TYPE;
this.managedBeans = new ArrayList(); this.managedBeans = new ArrayList();
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see AbstractMBean#getObjectName() * @see AbstractMBean#getObjectName()
*/ */
public String getObjectName() { public String getObjectName() {
return this.objectName; return this.objectName;
} }
/* public String listProcesses() { /* public String listProcesses() {
try { try {
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
long[] ids = sigar.getProcList(); long[] ids = sigar.getProcList();
StringBuffer procNames = new StringBuffer(); StringBuffer procNames = new StringBuffer();
for (int i = 0; i < ids.length; i++) { for (int i = 0; i < ids.length; i++) {
try { try {
procNames.append(ids[i] + ":" + sigar.getProcExe(ids[i]).getName()).append('\n'); procNames.append(ids[i] + ":" + sigar.getProcExe(ids[i]).getName()).append('\n');
} catch (SigarException e) { } catch (SigarException e) {
procNames.append(ids[i] + ":" + e.getMessage()).append('\n'); procNames.append(ids[i] + ":" + e.getMessage()).append('\n');
} }
} }
final long end = System.currentTimeMillis(); final long end = System.currentTimeMillis();
procNames.append("-- Took " + (end-start) + "ms"); procNames.append("-- Took " + (end-start) + "ms");
return procNames.toString(); return procNames.toString();
} catch (SigarException e) { } catch (SigarException e) {
throw unexpectedError("ProcList", e); throw unexpectedError("ProcList", e);
} }
} }
*/ */
/* (non-Javadoc) /* (non-Javadoc)
* @see javax.management.DynamicMBean#getAttribute(java.lang.String) * @see javax.management.DynamicMBean#getAttribute(java.lang.String)
*/ */
public Object getAttribute(String attr) throws AttributeNotFoundException { public Object getAttribute(String attr) throws AttributeNotFoundException {
Object obj = VERSION_ATTRS.get(attr); Object obj = VERSION_ATTRS.get(attr);
if (obj == null) { if (obj == null) {
throw new AttributeNotFoundException(attr); throw new AttributeNotFoundException(attr);
} }
return obj; return obj;
} }
/* (non-Javadoc) /* (non-Javadoc)
* @see javax.management.DynamicMBean#getMBeanInfo() * @see javax.management.DynamicMBean#getMBeanInfo()
*/ */
public MBeanInfo getMBeanInfo() { public MBeanInfo getMBeanInfo() {
return MBEAN_INFO; return MBEAN_INFO;
} }
private void registerMBean(AbstractMBean mbean) { private void registerMBean(AbstractMBean mbean) {
try { try {
ObjectName name = ObjectName name =
new ObjectName(mbean.getObjectName()); new ObjectName(mbean.getObjectName());
if (mbeanServer.isRegistered(name)) { if (mbeanServer.isRegistered(name)) {
return; return;
} }
ObjectInstance instance = ObjectInstance instance =
this.mbeanServer.registerMBean(mbean, name); this.mbeanServer.registerMBean(mbean, name);
this.managedBeans.add(instance.getObjectName()); this.managedBeans.add(instance.getObjectName());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
// ------- // -------
// Implementation of the MBeanRegistration interface // Implementation of the MBeanRegistration interface
// ------- // -------
/** /**
* Registers the default set of Sigar MBeans. Before doing so, a super call * Registers the default set of Sigar MBeans. Before doing so, a super call
* is made to satisfy {@link AbstractMBean}. * is made to satisfy {@link AbstractMBean}.
* *
* @see AbstractMBean#postRegister(Boolean) * @see AbstractMBean#postRegister(Boolean)
*/ */
public void postRegister(Boolean success) { public void postRegister(Boolean success) {
ReflectedMBean mbean; ReflectedMBean mbean;
super.postRegister(success); super.postRegister(success);
if (!success.booleanValue()) if (!success.booleanValue())
return; return;
//CPU beans //CPU beans
CpuInfo[] info; CpuInfo[] info;
try { try {
info = sigar.getCpuInfoList(); info = sigar.getCpuInfoList();
} catch (SigarException e) { } catch (SigarException e) {
throw unexpectedError("CpuInfoList", e); throw unexpectedError("CpuInfoList", e);
} }
for (int i=0; i<info.length; i++) { for (int i=0; i<info.length; i++) {
String idx = String.valueOf(i); String idx = String.valueOf(i);
mbean = mbean =
new ReflectedMBean(sigarImpl, "CpuCore", idx); new ReflectedMBean(sigarImpl, "CpuCore", idx);
mbean.setType("CpuList"); mbean.setType("CpuList");
registerMBean(mbean); registerMBean(mbean);
mbean = mbean =
new ReflectedMBean(sigarImpl, "CpuCoreUsage", idx); new ReflectedMBean(sigarImpl, "CpuCoreUsage", idx);
mbean.setType("CpuPercList"); mbean.setType("CpuPercList");
registerMBean(mbean); registerMBean(mbean);
} }
mbean = new ReflectedMBean(sigarImpl, "Cpu"); mbean = new ReflectedMBean(sigarImpl, "Cpu");
mbean.putAttributes(info[0]); mbean.putAttributes(info[0]);
registerMBean(mbean); registerMBean(mbean);
mbean = new ReflectedMBean(sigarImpl, "CpuUsage"); mbean = new ReflectedMBean(sigarImpl, "CpuUsage");
mbean.setType("CpuPerc"); mbean.setType("CpuPerc");
registerMBean(mbean); registerMBean(mbean);
//FileSystem beans //FileSystem beans
try { try {
FileSystem[] fslist = sigarImpl.getFileSystemList(); FileSystem[] fslist = sigarImpl.getFileSystemList();
for (int i=0; i<fslist.length; i++) { for (int i=0; i<fslist.length; i++) {
FileSystem fs = fslist[i]; FileSystem fs = fslist[i];
if (fs.getType() != FileSystem.TYPE_LOCAL_DISK) { if (fs.getType() != FileSystem.TYPE_LOCAL_DISK) {
continue; continue;
} }
String name = fs.getDirName(); String name = fs.getDirName();
mbean = mbean =
new ReflectedMBean(sigarImpl, "FileSystem", name); new ReflectedMBean(sigarImpl, "FileSystem", name);
mbean.setType(mbean.getType() + "Usage"); mbean.setType(mbean.getType() + "Usage");
mbean.putAttributes(fs); mbean.putAttributes(fs);
registerMBean(mbean); registerMBean(mbean);
} }
} catch (SigarException e) { } catch (SigarException e) {
throw unexpectedError("FileSystemList", e); throw unexpectedError("FileSystemList", e);
} }
//NetInterface beans //NetInterface beans
try { try {
String[] ifnames = sigarImpl.getNetInterfaceList(); String[] ifnames = sigarImpl.getNetInterfaceList();
for (int i=0; i<ifnames.length; i++) { for (int i=0; i<ifnames.length; i++) {
String name = ifnames[i]; String name = ifnames[i];
NetInterfaceConfig ifconfig = NetInterfaceConfig ifconfig =
this.sigar.getNetInterfaceConfig(name); this.sigar.getNetInterfaceConfig(name);
try { try {
sigarImpl.getNetInterfaceStat(name); sigarImpl.getNetInterfaceStat(name);
} catch (SigarException e) { } catch (SigarException e) {
continue; continue;
} }
mbean = mbean =
new ReflectedMBean(sigarImpl, "NetInterface", name); new ReflectedMBean(sigarImpl, "NetInterface", name);
mbean.setType(mbean.getType() + "Stat"); mbean.setType(mbean.getType() + "Stat");
mbean.putAttributes(ifconfig); mbean.putAttributes(ifconfig);
registerMBean(mbean); registerMBean(mbean);
} }
} catch (SigarException e) { } catch (SigarException e) {
throw unexpectedError("NetInterfaceList", e); throw unexpectedError("NetInterfaceList", e);
} }
//network info bean //network info bean
mbean = new ReflectedMBean(sigarImpl, "NetInfo"); mbean = new ReflectedMBean(sigarImpl, "NetInfo");
try { try {
mbean.putAttribute("FQDN", sigarImpl.getFQDN()); mbean.putAttribute("FQDN", sigarImpl.getFQDN());
} catch (SigarException e) { } catch (SigarException e) {
} }
registerMBean(mbean); registerMBean(mbean);
//physical memory bean //physical memory bean
registerMBean(new ReflectedMBean(sigarImpl, "Mem")); registerMBean(new ReflectedMBean(sigarImpl, "Mem"));
//swap memory bean //swap memory bean
registerMBean(new ReflectedMBean(sigarImpl, "Swap")); registerMBean(new ReflectedMBean(sigarImpl, "Swap"));
//load average bean //load average bean
registerMBean(new SigarLoadAverage(sigarImpl)); registerMBean(new SigarLoadAverage(sigarImpl));
//global process stats //global process stats
registerMBean(new ReflectedMBean(sigarImpl, "ProcStat")); registerMBean(new ReflectedMBean(sigarImpl, "ProcStat"));
} }
/** /**
* Deregisters all Sigar MBeans that were created and registered using this * Deregisters all Sigar MBeans that were created and registered using this
* instance. After doing so, a super call is made to satisfy {@link AbstractMBean}. * instance. After doing so, a super call is made to satisfy {@link AbstractMBean}.
* @throws Exception * @throws Exception
* *
* @see AbstractMBean#preDeregister() * @see AbstractMBean#preDeregister()
*/ */
public void preDeregister() throws Exception { public void preDeregister() throws Exception {
// count backwards to remove ONs immediately // count backwards to remove ONs immediately
for (int i = managedBeans.size() - 1; i >= 0; i--) { for (int i = managedBeans.size() - 1; i >= 0; i--) {
ObjectName next = (ObjectName) managedBeans.remove(i); ObjectName next = (ObjectName) managedBeans.remove(i);
if (mbeanServer.isRegistered(next)) { if (mbeanServer.isRegistered(next)) {
try { try {
mbeanServer.unregisterMBean(next); mbeanServer.unregisterMBean(next);
} catch (Exception e) { // ignore } catch (Exception e) { // ignore
} }
} }
} }
// do the super call // do the super call
super.preDeregister(); super.preDeregister();
} }
} }