1 /**
2 * collectd - bindings/java/org/collectd/java/JMXMemory.java
3 * Copyright (C) 2009 Florian octo Forster
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 * DEALINGS IN THE SOFTWARE.
22 *
23 * Authors:
24 * Florian octo Forster <octo at collectd.org>
25 */
27 package org.collectd.java;
29 import java.util.List;
30 import java.util.Date;
32 import java.lang.management.ManagementFactory;
33 import java.lang.management.MemoryUsage;
34 import java.lang.management.MemoryMXBean;
36 import javax.management.MBeanServerConnection;
37 import javax.management.remote.JMXConnector;
38 import javax.management.remote.JMXConnectorFactory;
39 import javax.management.remote.JMXServiceURL;
41 import org.collectd.api.Collectd;
42 import org.collectd.api.DataSet;
43 import org.collectd.api.ValueList;
44 import org.collectd.api.Notification;
45 import org.collectd.api.OConfigItem;
47 import org.collectd.api.CollectdConfigInterface;
48 import org.collectd.api.CollectdInitInterface;
49 import org.collectd.api.CollectdReadInterface;
50 import org.collectd.api.CollectdShutdownInterface;
52 import org.collectd.api.OConfigValue;
53 import org.collectd.api.OConfigItem;
55 public class JMXMemory implements CollectdConfigInterface,
56 CollectdInitInterface,
57 CollectdReadInterface,
58 CollectdShutdownInterface
59 {
60 private String _jmx_service_url = null;
61 private MemoryMXBean _mbean = null;
63 public JMXMemory ()
64 {
65 Collectd.registerConfig ("JMXMemory", this);
66 Collectd.registerInit ("JMXMemory", this);
67 Collectd.registerRead ("JMXMemory", this);
68 Collectd.registerShutdown ("JMXMemory", this);
69 }
71 private void submit (String plugin_instance, MemoryUsage usage) /* {{{ */
72 {
73 ValueList vl;
75 long mem_init;
76 long mem_used;
77 long mem_committed;
78 long mem_max;
80 mem_init = usage.getInit ();
81 mem_used = usage.getUsed ();
82 mem_committed = usage.getCommitted ();
83 mem_max = usage.getMax ();
85 Collectd.logDebug ("JMXMemory plugin: plugin_instance = " + plugin_instance + "; "
86 + "mem_init = " + mem_init + "; "
87 + "mem_used = " + mem_used + "; "
88 + "mem_committed = " + mem_committed + "; "
89 + "mem_max = " + mem_max + ";");
91 vl = new ValueList ();
93 vl.setHost ("localhost");
94 vl.setPlugin ("JMXMemory");
95 vl.setPluginInstance (plugin_instance);
96 vl.setType ("memory");
98 if (mem_init >= 0)
99 {
100 vl.addValue (mem_init);
101 vl.setTypeInstance ("init");
102 Collectd.dispatchValues (vl);
103 vl.clearValues ();
104 }
106 if (mem_used >= 0)
107 {
108 vl.addValue (mem_used);
109 vl.setTypeInstance ("used");
110 Collectd.dispatchValues (vl);
111 vl.clearValues ();
112 }
114 if (mem_committed >= 0)
115 {
116 vl.addValue (mem_committed);
117 vl.setTypeInstance ("committed");
118 Collectd.dispatchValues (vl);
119 vl.clearValues ();
120 }
122 if (mem_max >= 0)
123 {
124 vl.addValue (mem_max);
125 vl.setTypeInstance ("max");
126 Collectd.dispatchValues (vl);
127 vl.clearValues ();
128 }
129 } /* }}} void submit */
131 private int configServiceURL (OConfigItem ci) /* {{{ */
132 {
133 List<OConfigValue> values;
134 OConfigValue cv;
136 values = ci.getValues ();
137 if (values.size () != 1)
138 {
139 Collectd.logError ("JMXMemory plugin: The JMXServiceURL option needs "
140 + "exactly one string argument.");
141 return (-1);
142 }
144 cv = values.get (0);
145 if (cv.getType () != OConfigValue.OCONFIG_TYPE_STRING)
146 {
147 Collectd.logError ("JMXMemory plugin: The JMXServiceURL option needs "
148 + "exactly one string argument.");
149 return (-1);
150 }
152 _jmx_service_url = cv.getString ();
153 return (0);
154 } /* }}} int configServiceURL */
156 public int config (OConfigItem ci) /* {{{ */
157 {
158 List<OConfigItem> children;
159 int i;
161 Collectd.logDebug ("JMXMemory plugin: config: ci = " + ci + ";");
163 children = ci.getChildren ();
164 for (i = 0; i < children.size (); i++)
165 {
166 OConfigItem child;
167 String key;
169 child = children.get (i);
170 key = child.getKey ();
171 if (key.equalsIgnoreCase ("JMXServiceURL"))
172 {
173 configServiceURL (child);
174 }
175 else
176 {
177 Collectd.logError ("JMXMemory plugin: Unknown config option: " + key);
178 }
179 }
181 return (0);
182 } /* }}} int config */
184 public int init () /* {{{ */
185 {
186 JMXServiceURL service_url;
187 JMXConnector connector;
188 MBeanServerConnection connection;
190 if (_jmx_service_url == null)
191 {
192 Collectd.logError ("JMXMemory: _jmx_service_url == null");
193 return (-1);
194 }
196 try
197 {
198 service_url = new JMXServiceURL (_jmx_service_url);
199 connector = JMXConnectorFactory.connect (service_url);
200 connection = connector.getMBeanServerConnection ();
201 _mbean = ManagementFactory.newPlatformMXBeanProxy (connection,
202 ManagementFactory.MEMORY_MXBEAN_NAME,
203 MemoryMXBean.class);
204 }
205 catch (Exception e)
206 {
207 Collectd.logError ("JMXMemory: Creating MBean failed: " + e);
208 return (-1);
209 }
211 return (0);
212 } /* }}} int init */
214 public int read () /* {{{ */
215 {
216 if (_mbean == null)
217 {
218 Collectd.logError ("JMXMemory: _mbean == null");
219 return (-1);
220 }
222 submit ("heap", _mbean.getHeapMemoryUsage ());
223 submit ("non_heap", _mbean.getNonHeapMemoryUsage ());
225 return (0);
226 } /* }}} int read */
228 public int shutdown () /* {{{ */
229 {
230 System.out.print ("org.collectd.java.JMXMemory.Shutdown ();\n");
231 _jmx_service_url = null;
232 _mbean = null;
233 return (0);
234 } /* }}} int shutdown */
235 } /* class JMXMemory */
237 /* vim: set sw=2 sts=2 et fdm=marker : */