From: Wilfried Goesgens Date: Sat, 23 May 2015 13:44:24 +0000 (+0200) Subject: Filterchain: if we don't find a writer, output the available writers to syslog. X-Git-Tag: collectd-5.5.0~7 X-Git-Url: https://git.octo.it/?p=collectd.git;a=commitdiff_plain;h=809a89739bd92a5432deb6230a68dd6e6bbb72b3 Filterchain: if we don't find a writer, output the available writers to syslog. --- diff --git a/src/daemon/filter_chain.c b/src/daemon/filter_chain.c index b93435fd..32ce7367 100644 --- a/src/daemon/filter_chain.c +++ b/src/daemon/filter_chain.c @@ -733,6 +733,8 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */ "all write plugins failed with status %i (ENOENT). " "Most likely this means you didn't load any write plugins.", status); + + plugin_log_available_writers (); } else if (status != 0) { @@ -763,6 +765,8 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */ "Filter subsystem: Built-in target `write': Dispatching value to " "the `%s' plugin failed with status %i.", plugin_list[i].plugin, status); + + plugin_log_available_writers (); } else { diff --git a/src/daemon/plugin.c b/src/daemon/plugin.c index 25bd37b8..b69e65b6 100644 --- a/src/daemon/plugin.c +++ b/src/daemon/plugin.c @@ -307,6 +307,56 @@ static int register_callback (llist_t **list, /* {{{ */ return (0); } /* }}} int register_callback */ +static void log_list_callbacks (llist_t **list, /* {{{ */ + const char *comment) +{ + char *str; + int len; + llentry_t *le; + int i; + int n; + char **keys; + + n = llist_size(*list); + if (n == 0) + { + INFO("%s [none]", comment); + return; + } + + keys = calloc(n, sizeof(char*)); + + if (keys == NULL) + { + ERROR("%s: failed to allocate memory for list of callbacks", + comment); + + return; + } + + for (le = llist_head (*list), i = 0, len = 0; + le != NULL; + le = le->next, i++) + { + keys[i] = le->key; + len += strlen(le->key) + 6; + } + str = malloc(len + 10); + if (str == NULL) + { + ERROR("%s: failed to allocate memory for list of callbacks", + comment); + } + else + { + *str = '\0'; + strjoin(str, len, keys, n, "', '"); + INFO("%s ['%s']", comment, str); + free(str); + } + free(keys); +} /* }}} void log_list_callbacks */ + static int create_register_callback (llist_t **list, /* {{{ */ const char *name, void *callback, user_data_t *ud) { @@ -1398,6 +1448,11 @@ int plugin_unregister_read (const char *name) /* {{{ */ return (0); } /* }}} int plugin_unregister_read */ +void plugin_log_available_writers () +{ + log_list_callbacks (&list_write, "Available writers:"); +} + static int compare_read_func_group (llentry_t *e, void *ud) /* {{{ */ { read_func_t *rf = e->value; diff --git a/src/daemon/plugin.h b/src/daemon/plugin.h index 86a2d662..beeb5761 100644 --- a/src/daemon/plugin.h +++ b/src/daemon/plugin.h @@ -322,6 +322,17 @@ int plugin_unregister_data_set (const char *name); int plugin_unregister_log (const char *name); int plugin_unregister_notification (const char *name); +/* + * NAME + * plugin_log_available_writers + * + * DESCRIPTION + * This function can be called to output a list of _all_ registered + * writers to the logfacility. + * Since some writers dynamically build their name it can be hard for + * the configuring person to know it. This function will fill this gap. + */ +void plugin_log_available_writers (); /* * NAME