X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fwrite_log.c;h=e10a912e5bc09b612e5adbb8d0f7ba331afacbac;hb=41288c6a9ed050b41ad47184aa1b53668c3588cc;hp=ebf0e12445cc9e9e3900a8416c3cedcf6db1a9eb;hpb=21058a13ed34ade6d2de0f54e4216b255d033af1;p=collectd.git diff --git a/src/write_log.c b/src/write_log.c index ebf0e124..e10a912e 100644 --- a/src/write_log.c +++ b/src/write_log.c @@ -26,32 +26,34 @@ **/ #include "collectd.h" + #include "common.h" #include "plugin.h" -#include "configfile.h" #include "utils_format_graphite.h" - -/* Folks without pthread will need to disable this plugin. */ -#include +#include "utils_format_json.h" #include -#define WL_BUF_SIZE 8192 +#define WL_BUF_SIZE 16384 + +#define WL_FORMAT_GRAPHITE 1 +#define WL_FORMAT_JSON 2 + +/* Plugin:WriteLog has to also operate without a config, so use a global. */ +int wl_format = WL_FORMAT_GRAPHITE; -static int wl_write_messages (const data_set_t *ds, const value_list_t *vl) +static int wl_write_graphite (const data_set_t *ds, const value_list_t *vl) { - char buffer[WL_BUF_SIZE]; + char buffer[WL_BUF_SIZE] = { 0 }; int status; if (0 != strcmp (ds->type, vl->type)) { - ERROR ("write_log plugin: DS type does not match " - "value list type"); + ERROR ("write_log plugin: DS type does not match value list type"); return -1; } - memset (buffer, 0, sizeof (buffer)); status = format_graphite (buffer, sizeof (buffer), ds, vl, NULL, NULL, '_', 0); if (status != 0) /* error message has been printed already. */ @@ -60,20 +62,95 @@ static int wl_write_messages (const data_set_t *ds, const value_list_t *vl) INFO ("write_log values:\n%s", buffer); return (0); -} /* int wl_write_messages */ +} /* int wl_write_graphite */ + +static int wl_write_json (const data_set_t *ds, const value_list_t *vl) +{ + char buffer[WL_BUF_SIZE] = { 0 }; + size_t bfree = sizeof(buffer); + size_t bfill = 0; + + if (0 != strcmp (ds->type, vl->type)) + { + ERROR ("write_log plugin: DS type does not match value list type"); + return -1; + } + + format_json_initialize(buffer, &bfill, &bfree); + format_json_value_list(buffer, &bfill, &bfree, ds, vl, + /* store rates = */ 0); + format_json_finalize(buffer, &bfill, &bfree); + + INFO ("write_log values:\n%s", buffer); + + return (0); +} /* int wl_write_json */ static int wl_write (const data_set_t *ds, const value_list_t *vl, - user_data_t *user_data) + __attribute__ ((unused)) user_data_t *user_data) { - int status; + int status = 0; - status = wl_write_messages (ds, vl); + if (wl_format == WL_FORMAT_GRAPHITE) + { + status = wl_write_graphite (ds, vl); + } + else if (wl_format == WL_FORMAT_JSON) + { + status = wl_write_json (ds, vl); + } return (status); } +static int wl_config (oconfig_item_t *ci) /* {{{ */ +{ + _Bool format_seen = 0; + + for (int i = 0; i < ci->children_num; i++) + { + oconfig_item_t *child = ci->children + i; + + if (strcasecmp ("Format", child->key) == 0) + { + char str[16]; + + if (cf_util_get_string_buffer (child, str, sizeof (str)) != 0) + continue; + + if (format_seen) + { + WARNING ("write_log plugin: Redefining option `%s'.", + child->key); + } + format_seen = 1; + + if (strcasecmp ("Graphite", str) == 0) + wl_format = WL_FORMAT_GRAPHITE; + else if (strcasecmp ("JSON", str) == 0) + wl_format = WL_FORMAT_JSON; + else + { + ERROR ("write_log plugin: Unknown format `%s' for option `%s'.", + str, child->key); + return (-EINVAL); + } + } + else + { + ERROR ("write_log plugin: Invalid configuration option: `%s'.", + child->key); + return (-EINVAL); + } + } + + return (0); +} /* }}} int wl_config */ + void module_register (void) { + plugin_register_complex_config ("write_log", wl_config); + /* If config is supplied, the global wl_format will be set. */ plugin_register_write ("write_log", wl_write, NULL); }