X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fwrite_log.c;h=52ad61044e5c206d86125f1bde0a10f02de9359d;hb=b9b5e5d573d0011c4f3276e9b84b73ba4dd2e870;hp=35c9118e8e558b328a82a50968e5ccbcf43c8c4a;hpb=2079ee1517e34de372f58e7e2267ad5c71a8a41f;p=collectd.git diff --git a/src/write_log.c b/src/write_log.c index 35c9118e..52ad6104 100644 --- a/src/write_log.c +++ b/src/write_log.c @@ -31,41 +31,108 @@ #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; } status = format_graphite(buffer, sizeof(buffer), ds, vl, NULL, NULL, '_', 0); if (status != 0) /* error message has been printed already. */ - return (status); + return status; + + INFO("write_log values:\n%s", buffer); + + return 0; +} /* 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_messages */ + 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); + return status; } +static int wl_config(oconfig_item_t *ci) /* {{{ */ +{ + bool format_seen = false; + + 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 = true; + + 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); } - -/* vim: set sw=4 ts=4 sts=4 tw=78 et : */