X-Git-Url: https://git.octo.it/?p=collectd.git;a=blobdiff_plain;f=bindings%2Fjava%2Forg%2Fcollectd%2Fjava%2FGenericJMXConfValue.java;h=4b42c91171036ca70d213d0f1131373f79b7f572;hp=cdca02f3a2dbce17b91f63ec33888ac940d37dd5;hb=633c3966f770e4d46651a2fe219a18d8a9907a9f;hpb=7603c661cdeabe2068939486ed0a3e49aba129a3 diff --git a/bindings/java/org/collectd/java/GenericJMXConfValue.java b/bindings/java/org/collectd/java/GenericJMXConfValue.java index cdca02f3..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; @@ -62,6 +67,7 @@ class GenericJMXConfValue private DataSet _ds; private List _attributes; private String _instance_prefix; + private List _instance_from; private boolean _is_table; /** @@ -123,6 +129,11 @@ class GenericJMXConfValue 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 (); @@ -143,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) { @@ -168,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; @@ -218,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; @@ -240,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); @@ -296,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) { @@ -329,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; @@ -391,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; /* @@ -434,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 ())); @@ -449,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. @@ -460,6 +511,8 @@ class GenericJMXConfValue ValueList vl; List dsrc; List values; + List instanceList; + String instancePrefix; if (this._ds == null) { @@ -485,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++) { @@ -506,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 : */