X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=bindings%2Fjava%2Forg%2Fcollectd%2Fjava%2FGenericJMXConfValue.java;h=4b42c91171036ca70d213d0f1131373f79b7f572;hp=0fcf31aad02c0ead7a9cad9a167580e132338572;hb=633c3966f770e4d46651a2fe219a18d8a9907a9f;hpb=658b873e6ac13d387a710fa02d8f85057fd5cae8 diff --git a/bindings/java/org/collectd/java/GenericJMXConfValue.java b/bindings/java/org/collectd/java/GenericJMXConfValue.java index 0fcf31aa..4b42c911 100644 --- a/bindings/java/org/collectd/java/GenericJMXConfValue.java +++ b/bindings/java/org/collectd/java/GenericJMXConfValue.java @@ -1,22 +1,27 @@ -/* - * collectd/java - org/collectd/java/GenericJMXConfValue.java - * Copyright (C) 2009 Florian octo Forster +/** + * collectd - bindings/java/org/collectd/java/GenericJMXConfValue.java + * Copyright (C) 2009 Florian octo Forster * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; only version 2 of the License is applicable. + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: * - * 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. + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. * - * 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., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. * * Authors: - * Florian octo Forster + * Florian octo Forster */ package org.collectd.java; @@ -27,8 +32,12 @@ import java.util.Set; import java.util.Iterator; import java.util.ArrayList; +import java.math.BigDecimal; +import java.math.BigInteger; + import javax.management.MBeanServerConnection; import javax.management.ObjectName; +import javax.management.openmbean.OpenType; import javax.management.openmbean.CompositeData; import javax.management.openmbean.InvalidKeyException; @@ -54,12 +63,18 @@ import org.collectd.api.OConfigItem; */ class GenericJMXConfValue { - private String ds_name; + private String _ds_name; private DataSet _ds; private List _attributes; private String _instance_prefix; + private List _instance_from; private boolean _is_table; + /** + * Converts a generic (OpenType) object to a number. + * + * Returns null if a conversion is not possible or not implemented. + */ private Number genericObjectToNumber (Object obj, int ds_type) /* {{{ */ { if (obj instanceof String) @@ -78,6 +93,14 @@ class GenericJMXConfValue return (null); } } + else if (obj instanceof Byte) + { + return (new Byte ((Byte) obj)); + } + else if (obj instanceof Short) + { + return (new Short ((Short) obj)); + } else if (obj instanceof Integer) { return (new Integer ((Integer) obj)); @@ -86,14 +109,31 @@ class GenericJMXConfValue { return (new Long ((Long) obj)); } + else if (obj instanceof Float) + { + return (new Float ((Float) obj)); + } else if (obj instanceof Double) { return (new Double ((Double) obj)); } + else if (obj instanceof BigDecimal) + { + return (BigDecimal.ZERO.add ((BigDecimal) obj)); + } + else if (obj instanceof BigInteger) + { + return (BigInteger.ZERO.add ((BigInteger) obj)); + } return (null); } /* }}} Number genericObjectToNumber */ + /** + * Converts a generic list to a list of numbers. + * + * Returns null if one or more objects could not be converted. + */ private List genericListToNumber (List objects) /* {{{ */ { List ret = new ArrayList (); @@ -114,6 +154,14 @@ class GenericJMXConfValue return (ret); } /* }}} List genericListToNumber */ + /** + * Converts a list of CompositeData to a list of numbers. + * + * From each CompositeData the key key is received and all + * those values are converted to a number. If one of the + * CompositeData doesn't have the specified key or one returned + * object cannot converted to a number then the function will return null. + */ private List genericCompositeToNumber (List cdlist, /* {{{ */ String key) { @@ -139,7 +187,8 @@ class GenericJMXConfValue return (genericListToNumber (objects)); } /* }}} List genericCompositeToNumber */ - private void submitTable (List objects, ValueList vl) /* {{{ */ + private void submitTable (List objects, ValueList vl, /* {{{ */ + String instancePrefix) { List cdlist; Set keySet = null; @@ -189,17 +238,18 @@ class GenericJMXConfValue continue; } - if (this._instance_prefix == null) + if (instancePrefix == null) vl.setTypeInstance (key); else - vl.setTypeInstance (this._instance_prefix + key); + vl.setTypeInstance (instancePrefix + key); vl.setValues (values); Collectd.dispatchValues (vl); } } /* }}} void submitTable */ - private void submitScalar (List objects, ValueList vl) /* {{{ */ + private void submitScalar (List objects, ValueList vl, /* {{{ */ + String instancePrefix) { List values; @@ -211,10 +261,10 @@ class GenericJMXConfValue return; } - if (this._instance_prefix == null) + if (instancePrefix == null) vl.setTypeInstance (""); else - vl.setTypeInstance (this._instance_prefix); + vl.setTypeInstance (instancePrefix); vl.setValues (values); Collectd.dispatchValues (vl); @@ -267,7 +317,14 @@ class GenericJMXConfValue try { - value = conn.getAttribute (objName, key); + try + { + value = conn.getAttribute (objName, key); + } + catch (javax.management.AttributeNotFoundException e) + { + value = conn.invoke (objName, key, /* args = */ null, /* types = */ null); + } } catch (Exception e) { @@ -283,12 +340,39 @@ class GenericJMXConfValue else { if (value instanceof CompositeData) - return (queryAttributeRecursive ((CompositeData) value, attrNameList)); + return (queryAttributeRecursive((CompositeData) value, attrNameList)); + else if (value instanceof OpenType) + { + OpenType ot = (OpenType) value; + Collectd.logNotice ("GenericJMXConfValue: Handling of OpenType \"" + + ot.getTypeName () + "\" is not yet implemented."); + return (null); + } else + { + Collectd.logError ("GenericJMXConfValue: Received object of " + + "unknown class."); return (null); + } } } /* }}} Object queryAttribute */ + private String join (String separator, List list) /* {{{ */ + { + StringBuffer sb; + + sb = new StringBuffer (); + + for (int i = 0; i < list.size (); i++) + { + if (i > 0) + sb.append ("-"); + sb.append (list.get (i)); + } + + return (sb.toString ()); + } /* }}} String join */ + private String getConfigString (OConfigItem ci) /* {{{ */ { List values; @@ -347,10 +431,11 @@ class GenericJMXConfValue List children; Iterator iter; - this.ds_name = null; + this._ds_name = null; this._ds = null; this._attributes = new ArrayList (); this._instance_prefix = null; + this._instance_from = new ArrayList (); this._is_table = false; /* @@ -374,7 +459,7 @@ class GenericJMXConfValue { String tmp = getConfigString (child); if (tmp != null) - this.ds_name = tmp; + this._ds_name = tmp; } else if (child.getKey ().equalsIgnoreCase ("Table")) { @@ -394,12 +479,18 @@ class GenericJMXConfValue if (tmp != null) this._instance_prefix = tmp; } + else if (child.getKey ().equalsIgnoreCase ("InstanceFrom")) + { + String tmp = getConfigString (child); + if (tmp != null) + this._instance_from.add (tmp); + } else throw (new IllegalArgumentException ("Unknown option: " + child.getKey ())); } - if (this.ds_name == null) + if (this._ds_name == null) throw (new IllegalArgumentException ("No data set was defined.")); else if (this._attributes.size () == 0) throw (new IllegalArgumentException ("No attribute was defined.")); @@ -409,7 +500,7 @@ class GenericJMXConfValue * Query values via JMX according to the object's configuration and dispatch * them to collectd. * - * @param conn Connection to the MBeanServer. + * @param conn Connection to the MBeanServer. * @param objName Object name of the MBean to query. * @param pd Preset naming components. The members host, plugin and * plugin instance will be used. @@ -420,14 +511,16 @@ class GenericJMXConfValue ValueList vl; List dsrc; List values; + List instanceList; + String instancePrefix; if (this._ds == null) { - this._ds = Collectd.getDS (this.ds_name); + this._ds = Collectd.getDS (this._ds_name); if (this._ds == null) { Collectd.logError ("GenericJMXConfValue: Unknown type: " - + this.ds_name); + + this._ds_name); return; } } @@ -436,7 +529,7 @@ class GenericJMXConfValue if (dsrc.size () != this._attributes.size ()) { Collectd.logError ("GenericJMXConfValue.query: The data set " - + ds_name + " has " + this._ds.getDataSources ().size () + + this._ds_name + " has " + this._ds.getDataSources ().size () + " data sources, but there were " + this._attributes.size () + " attributes configured. This doesn't match!"); this._ds = null; @@ -444,11 +537,42 @@ class GenericJMXConfValue } vl = new ValueList (pd); - vl.setType (this.ds_name); - vl.setTypeInstance (this._instance_prefix); + vl.setType (this._ds_name); - values = new ArrayList (); + /* + * Build the instnace prefix from the fixed string prefix and the + * properties of the objName. + */ + instanceList = new ArrayList (); + for (int i = 0; i < this._instance_from.size (); i++) + { + String propertyName; + String propertyValue; + + propertyName = this._instance_from.get (i); + propertyValue = objName.getKeyProperty (propertyName); + if (propertyValue == null) + { + Collectd.logError ("GenericJMXConfMBean: " + + "No such property in object name: " + propertyName); + } + else + { + instanceList.add (propertyValue); + } + } + + if (this._instance_prefix != null) + instancePrefix = new String (this._instance_prefix + + join ("-", instanceList)); + else + instancePrefix = join ("-", instanceList); + /* + * Build a list of `Object's which is then passed to `submitTable' and + * `submitScalar'. + */ + values = new ArrayList (); assert (dsrc.size () == this._attributes.size ()); for (int i = 0; i < this._attributes.size (); i++) { @@ -466,10 +590,10 @@ class GenericJMXConfValue } if (this._is_table) - submitTable (values, vl); + submitTable (values, vl, instancePrefix); else - submitScalar (values, vl); + submitScalar (values, vl, instancePrefix); } /* }}} void query */ -} +} /* class GenericJMXConfValue */ /* vim: set sw=2 sts=2 et fdm=marker : */