+2010-11-27, Version 4.10.2
+ * Documentation: Various documentation fixes.
+ * collectd: If including one configuration file fails, continue with
+ the rest of the configuration if possible.
+ * collectd: Fix a bug in the read function scheduling. In rare cases
+ read functions may not have been called as often as requested.
+ * collectd: Concurrency issues with errno(3) under AIX have been
+ fixed: A thread-safe version of errno has to be requested under AIX.
+ Thanks to Aurélien Reynaud for his patch.
+ * collectd: A left-over hard-coded 2 has been replaced by the
+ configurable timeout value.
+ * curl, memcachec, tail plugins: Fix handling of "DERIVE" data
+ sources. Matching the end of a string has been improved; thanks to
+ Sebastian Harl for the patch.
+ * curl_json plugin: Fix a problem when parsing 64bit integers. Reading
+ JSON data from non-HTTP sources has been fixed.
+ * netapp plugin: Pass the interval setting to the dispatch function.
+ Restore compatibility to NetApp Release 7.3. Thanks to Sven Trenkel
+ for the patch.
+ * network plugin: Be less verbose about unchecked signatures, in order
+ to prevent spamming the logs.
+ * notify_email plugin: Concurrency problems have been fixed.
+ * python plugin: Set "sys.argv", since many scripts don't expect that
+ it may not be set. Thanks to Sven Trenkel for the patch.
+ * rrdtool, rrdcached plugin: Fix a too strict assertion when creating
+ RRD files.
+ * swap plugin: A bug which lead to incorrect I/O values has been
+ fixed.
+ * value match: A minor memory leak has been fixed. Thanks to Sven
+ Trenkel for the patch.
+
+2010-07-09, Version 4.10.1
+ * Build system: Checking for "strtok_r" under Solaris has been fixed.
+ * Portability: Fixes for Solaris 8 have been applied. Thanks to
+ Alexander Wuerstlein for his patch.
+ * collectd: The shutdown speed when terminating the read threads has
+ been improved.
+ * libcollectdclient: A format error in the PUTVAL command has been
+ removed. Thanks to Johan Van den Brande for fixing this.
+ * df plugin: An error message shown when "cu_mount_getlist" fails has
+ been added.
+ * processes plugin: Missing initialization code for IO members of a
+ struct has been added. Thanks to Aurélien Reynaud for fixing this.
+ * python plugin: Memory leaks in the write and notification callbacks
+ have been fixed. A possible crash when the plugin was loaded but not
+ configured has been fixed. Thanks to Sven Trenkel for his patches.
+ * snmp plugin: Verbosity with regard to unknown ASN types has been
+ increased. A build problem on PowerPC and ARM processors has been
+ fixed by Aurélien Reynaud; thanks!
+ * powerdns plugin: Compatibility changes for PowerDNS 2.9.22 and above
+ have been applied. Thanks to Luke Heberling for his changes.
+
+2010-05-01, Version 4.10.0
+ * collectd: JSON output now includes the "dstypes" and "dsnames"
+ fields. This makes it easier for external applications to interpret
+ the data. Thanks to Chris Buben for his work.
+ * collectd: The new "Timeout" option can be used to specify a
+ "timeout" for missing values. This is used in the threshold checking
+ code to detect missing values. Thanks to Andrés J. Díaz for the
+ patch.
+ * apache plugin: Support for "IdleWorkers" (Apache 1.*: "IdleServers")
+ has been added.
+ * curl plugin: The new "ExcludeRegex" allows to easily exclude certain
+ lines from the match.
+ * curl_xml plugin: This new plugin allows to read XML files using cURL
+ and extract metrics included in the files. Thanks to Amit Gupta for
+ his work.
+ * filecount plugin: The new "IncludeHidden" option allows to include
+ "hidden" files and directories in the statistics. Thanks to Vaclav
+ Malek for the patch.
+ * logfile plugin: The new "PrintSeverity" option allows to include the
+ severity of a message in the output. Thanks to Clément Stenac for
+ his patch.
+ * memcachec plugin: The new "ExcludeRegex" allows to easily exclude
+ certain lines from the match.
+ * modbus plugin: This new plugin allows to read registers from
+ Modbus-TCP enabled devices.
+ * network plugin: The new "Interface" option allows to set the
+ interface to be used for multicast and, if supported, unicast
+ traffic. Thanks to Max Henkel for his work.
+ * openvpn plugin: The "CollectUserCount" and "CollectIndividualUsers"
+ options allow more detailed control over how to report sessions of
+ multiple users. Thanks to Fabian Schuh for his work.
+ * pinba plugin: This new plugin receives timing information from the
+ Pinba PHP extension, which can be used for profiling PHP code and
+ webserver performance. Thanks to Phoenix Kayo for his work.
+ * ping plugin: The new "MaxMissed" allows to re-resolve a hosts
+ address when it doesn't reply to a number of ping requests. Thanks
+ to Stefan Völkel for the patch.
+ * postgresql plugin: The "Interval" config option has been added. The
+ plugin has been relicensed under the 2-clause BSD license. Thanks to
+ Sebastian Harl for his work.
+ * processes plugin: Support for "code" and "data" virtual memory sizes
+ has been added. Thanks to Clément Stenac for his patch.
+ * python plugin: Support for Python 3 has been implemented. Thanks to
+ Sven Trenkel for his work.
+ * routeros plugin: Support for collecting CPU load, memory usage, used
+ and free disk space, sectors written and number of bad blocks from
+ MikroTik devices has been added.
+ * swap plugin: Support for Linux < 2.6 has been added. Thanks to Lorin
+ Scraba for his patch.
+ * tail plugin: The new "ExcludeRegex" allows to easily exclude certain
+ lines from the match. Thanks to Peter Warasin for his patch.
+ * write_http plugin: The "StoreRates" option has been added. Thanks to
+ Paul Sadauskas for his patch.
+ * regex match: The "Invert" option has been added. Thanks to Julien
+ Ammous for his patch.
+
+ 2011-03-26, Version 4.9.5
+ * collectd: Build issues (compiler warnings) have been fixed. Thanks to
+ Bruno Prémont.
+ * collectd, java plugin, ntpd plugin: Several diagnostic messages have
+ been improved.
+ * collectd: Threshold subsection: Handling of NAN values in the
+ percentage calculation has been fixed.
+ * Documentation: Several updates and additions. Thanks to Sebastian Harl.
+ * libvirt plugin: A bug in reading the virtual CPU statistics has been
+ fixed. Thanks to “JLPC” for reporting this problem.
+ * python plugin: Fix dispatching of values from Python scripts to
+ collectd. Thanks to Gregory Szorc for finding and fixing this
+ problem.
+ * processes plugin: Potentially erroneous behavior has been fixed in an
+ error handling case.
+
2010-11-27, Version 4.9.4
* Documentation: Various documentation fixes.
* collectd: If including one configuration file fails, continue with
#define rf_callback rf_super.cf_callback
#define rf_udata rf_super.cf_udata
callback_func_t rf_super;
+ char rf_group[DATA_MAX_NAME_LEN];
char rf_name[DATA_MAX_NAME_LEN];
int rf_type;
struct timespec rf_interval;
rf->rf_callback = (void *) callback;
rf->rf_udata.data = NULL;
rf->rf_udata.free_func = NULL;
+ rf->rf_group[0] = '\0';
sstrncpy (rf->rf_name, name, sizeof (rf->rf_name));
rf->rf_type = RF_SIMPLE;
rf->rf_interval.tv_sec = 0;
return (plugin_insert_read (rf));
} /* int plugin_register_read */
-int plugin_register_complex_read (const char *name,
+int plugin_register_complex_read (const char *group, const char *name,
plugin_read_cb callback,
const struct timespec *interval,
user_data_t *user_data)
memset (rf, 0, sizeof (read_func_t));
rf->rf_callback = (void *) callback;
+ if (group != NULL)
+ sstrncpy (rf->rf_group, group, sizeof (rf->rf_group));
+ else
+ rf->rf_group[0] = '\0';
sstrncpy (rf->rf_name, name, sizeof (rf->rf_name));
rf->rf_type = RF_COMPLEX;
if (interval != NULL)
(void *) callback, ud));
} /* int plugin_register_flush */
- int plugin_register_shutdown (char *name,
+ int plugin_register_shutdown (const char *name,
int (*callback) (void))
{
return (create_register_callback (&list_shutdown, name,
return (0);
} /* }}} int plugin_unregister_read */
+static int compare_read_func_group (llentry_t *e, void *ud) /* {{{ */
+{
+ read_func_t *rf = e->value;
+ char *group = ud;
+
+ return strcmp (rf->rf_group, (const char *)group);
+} /* }}} int compare_read_func_group */
+
+int plugin_unregister_read_group (const char *group) /* {{{ */
+{
+ llentry_t *le;
+ read_func_t *rf;
+
+ int found = 0;
+
+ if (group == NULL)
+ return (-ENOENT);
+
+ pthread_mutex_lock (&read_lock);
+
+ if (read_list == NULL)
+ {
+ pthread_mutex_unlock (&read_lock);
+ return (-ENOENT);
+ }
+
+ while (42)
+ {
+ le = llist_search_custom (read_list,
+ compare_read_func_group, (void *)group);
+
+ if (le == NULL)
+ break;
+
+ ++found;
+
+ llist_remove (read_list, le);
+
+ rf = le->value;
+ assert (rf != NULL);
+ rf->rf_type = RF_REMOVE;
+
+ llentry_destroy (le);
+
+ DEBUG ("plugin_unregister_read_group: "
+ "Marked `%s' (group `%s') for removal.",
+ rf->rf_name, group);
+ }
+
+ pthread_mutex_unlock (&read_lock);
+
+ if (found == 0)
+ {
+ WARNING ("plugin_unregister_read_group: No such "
+ "group of read function: %s", group);
+ return (-ENOENT);
+ }
+
+ return (0);
+} /* }}} int plugin_unregister_read_group */
+
int plugin_unregister_write (const char *name)
{
return (plugin_unregister (list_write, name));
plugin_init_cb callback);
int plugin_register_read (const char *name,
int (*callback) (void));
-int plugin_register_complex_read (const char *name,
+int plugin_register_complex_read (const char *group, const char *name,
plugin_read_cb callback,
const struct timespec *interval,
user_data_t *user_data);
plugin_write_cb callback, user_data_t *user_data);
int plugin_register_flush (const char *name,
plugin_flush_cb callback, user_data_t *user_data);
- int plugin_register_shutdown (char *name,
+ int plugin_register_shutdown (const char *name,
plugin_shutdown_cb callback);
int plugin_register_data_set (const data_set_t *ds);
int plugin_register_log (const char *name,
int plugin_unregister_complex_config (const char *name);
int plugin_unregister_init (const char *name);
int plugin_unregister_read (const char *name);
+int plugin_unregister_read_group (const char *group);
int plugin_unregister_write (const char *name);
int plugin_unregister_flush (const char *name);
int plugin_unregister_shutdown (const char *name);