X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fwrite_log.c;h=e10a912e5bc09b612e5adbb8d0f7ba331afacbac;hb=c76419c0cf983f1ecd3d36aa236cc4e3f9cff733;hp=db09849fefc75aa2691a8c663be40f885b63a0fb;hpb=ab11d1b4db61f750f51be6e41dbe8320d3c65404;p=collectd.git diff --git a/src/write_log.c b/src/write_log.c index db09849f..e10a912e 100644 --- a/src/write_log.c +++ b/src/write_log.c @@ -26,29 +26,34 @@ **/ #include "collectd.h" + #include "common.h" #include "plugin.h" -#include "configfile.h" #include "utils_format_graphite.h" +#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 -static int wl_write_messages (const data_set_t *ds, const value_list_t *vl) +/* Plugin:WriteLog has to also operate without a config, so use a global. */ +int wl_format = WL_FORMAT_GRAPHITE; + +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. */ @@ -57,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); }