X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=bindings%2Fjava%2Forg%2Fcollectd%2Fjava%2FGenericJMXConfValue.java;h=4b42c91171036ca70d213d0f1131373f79b7f572;hp=b81ceb7dfc554ab1ed2739245514cdee18ac11ff;hb=633c3966f770e4d46651a2fe219a18d8a9907a9f;hpb=1a73830d72f470999df7f0289cfd0f1cf3cc150c diff --git a/bindings/java/org/collectd/java/GenericJMXConfValue.java b/bindings/java/org/collectd/java/GenericJMXConfValue.java index b81ceb7d..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,6 +32,9 @@ 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; @@ -59,8 +67,14 @@ class GenericJMXConfValue 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) @@ -79,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)); @@ -87,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 (); @@ -115,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) { @@ -140,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; @@ -190,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; @@ -212,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); @@ -268,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) { @@ -301,6 +357,22 @@ class GenericJMXConfValue } } /* }}} 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; @@ -363,6 +435,7 @@ class GenericJMXConfValue this._ds = null; this._attributes = new ArrayList (); this._instance_prefix = null; + this._instance_from = new ArrayList (); this._is_table = false; /* @@ -406,6 +479,12 @@ 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 ())); @@ -421,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. @@ -432,6 +511,8 @@ class GenericJMXConfValue ValueList vl; List dsrc; List values; + List instanceList; + String instancePrefix; if (this._ds == null) { @@ -457,10 +538,41 @@ class GenericJMXConfValue vl = new ValueList (pd); vl.setType (this._ds_name); - vl.setTypeInstance (this._instance_prefix); - 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++) { @@ -478,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 : */