X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fwrite_log.c;h=e10a912e5bc09b612e5adbb8d0f7ba331afacbac;hb=6d8031d73b7c1d874d7afa4cad2f248c4073764d;hp=b0dc6f11cca43072ed7a094ba6ef3c2f2e6ac794;hpb=88001af68cb86d0d95fa143b031359b10eddbe1f;p=collectd.git diff --git a/src/write_log.c b/src/write_log.c index b0dc6f11..e10a912e 100644 --- a/src/write_log.c +++ b/src/write_log.c @@ -31,20 +31,26 @@ #include "plugin.h" #include "utils_format_graphite.h" +#include "utils_format_json.h" #include -#define WL_BUF_SIZE 8192 +#define WL_BUF_SIZE 16384 -static int wl_write_messages (const data_set_t *ds, const value_list_t *vl) +#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_graphite (const data_set_t *ds, const value_list_t *vl) { 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; } @@ -56,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, __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); }