[collectd] Using GenericJMX to consume array's of objects ?

Joe Armstrong jarmstrong at postpath.com
Wed Oct 13 23:17:19 CEST 2010

Hi Guys,
I have a webservice that is instrumented with JMX (MXBean) that produces an array of objects, I can't seem to figure out what the collectd.conf should look like to consume this information.
I have the GenericJMX plugin consuming other data from this server, so the basic's are setup OK.  Here are some details (hopefully not too much...):
The MXBean interface:
package com.joe.sample.RESTService;
public interface ConnectArrayMXBean {
      public ConnectData[] getConnectData();
The MXBean implementation:
package com.joe.sample.RESTService;
import javax.management.ObjectName;
public class ConnectArray implements ConnectArrayMXBean {
      private static ConnectData[] data = null;
      private static int index;
      private ObjectName ObjName;
      private static MBServer server = null;
      public ConnectArray() {
            data = new ConnectData[12];
            index = 0;
      public ConnectData[] getConnectData() {
            return data;
      public void add(String id, int bs, int br) {
            data[index] = new ConnectData(id, bs, br);
      public void register() {
            if (server == null)
                  server = new MBServer();
            try {
                  ObjName = new ObjectName(
                  server.register(this, ObjName);
            } catch (Exception e) {
      // To allow the webapp to be reloaded
      public void unregister() {
            if (server != null) {
                  ObjName = null;
The class that is being returned (an array of these from getConnectData):
package com.joe.sample.RESTService;
import java.beans.ConstructorProperties;
public class ConnectData {
      private final String socketId;
      private final int bytesSent;
      private final int bytesRecv;
      @ConstructorProperties( { "socketId", "bytesSent", "bytesRecv" })
      public ConnectData(String socketId, int bytesSent, int bytesRecv) {
            this.socketId = socketId;
            this.bytesSent = bytesSent;
            this.bytesRecv = bytesRecv;
      public String getSocketId() {
            return socketId;
      public int getBytesSent() {
            return bytesSent;
      public int getBytesRecv() {
            return bytesRecv;
Small chunk of code that creates the data on the server-side:
                          ConnectArray Array = new ConnectArray();
            // just garbage data to test things
             cArray.add("Socket1", 1024, 2048);
             cArray.add("Socket2", 12, 24);
             cArray.add("Socket3", 30, 60);
My collectd.conf (only the MBean portion):
    <MBean "REST_ConnectArray">
      ObjectName "com.joe.sample.RESTService:type=ConnectArray,*"
      InstancePrefix "ConnectArray"
      #InstanceFrom "socketId"
        Type "counter"
        #InstancePrefix ""
       #InstanceFrom "socketId"
        Table true
       Attribute "bytesSent"
Other info:
Jconsole can view the data with no problems. 

The error I get from collectd depends on what collectd.conf contains -I have tried a lot of different versions so I won't waste your time by giving you all of the versions that don't work.  But basically the error always complains that the <Value> Attribute member can't be queried (ex. Querying attribute bytesSent failed).
Thanks for any hints.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.verplant.org/pipermail/collectd/attachments/20101013/2f884c3b/attachment-0001.htm>

More information about the collectd mailing list