X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fwrite_log.c;h=e10a912e5bc09b612e5adbb8d0f7ba331afacbac;hb=da11ce02eb202b3e01d3e2d1b40f248a84430973;hp=8a9355c3bc4dc6af2ac12f46e61bb0d9e44faaa4;hpb=976b9c4bfc6a2ab821fb7a087b015906ba7d36a8;p=collectd.git diff --git a/src/write_log.c b/src/write_log.c index 8a9355c3..fdc99ef3 100644 --- a/src/write_log.c +++ b/src/write_log.c @@ -40,130 +40,99 @@ #define WL_FORMAT_GRAPHITE 1 #define WL_FORMAT_JSON 2 -static int wl_write_graphite (const data_set_t *ds, const value_list_t *vl) -{ - char buffer[WL_BUF_SIZE] = { 0 }; - int status; +/* Plugin:WriteLog has to also operate without a config, so use a global. */ +int wl_format = WL_FORMAT_GRAPHITE; - if (0 != strcmp (ds->type, vl->type)) - { - ERROR ("write_log plugin: DS type does not match value list type"); - return -1; - } +static int wl_write_graphite(const data_set_t *ds, const value_list_t *vl) { + char buffer[WL_BUF_SIZE] = {0}; + int status; - status = format_graphite (buffer, sizeof (buffer), ds, vl, - NULL, NULL, '_', 0); - if (status != 0) /* error message has been printed already. */ - return (status); + if (0 != strcmp(ds->type, vl->type)) { + ERROR("write_log plugin: DS type does not match value list type"); + return -1; + } - INFO ("write_log values:\n%s", buffer); + status = format_graphite(buffer, sizeof(buffer), ds, vl, NULL, NULL, '_', 0); + if (status != 0) /* error message has been printed already. */ + return status; - return (0); + 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; - } +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); + 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); + INFO("write_log values:\n%s", buffer); - return (0); + 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) -{ - int status = 0; - int mode = (int) (size_t) user_data->data; +static int wl_write(const data_set_t *ds, const value_list_t *vl, + __attribute__((unused)) user_data_t *user_data) { + int status = 0; - if (mode == WL_FORMAT_GRAPHITE) - { - status = wl_write_graphite (ds, vl); - } - else if (mode == WL_FORMAT_JSON) - { - status = wl_write_json (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) /* {{{ */ +static int wl_config(oconfig_item_t *ci) /* {{{ */ { - int mode = 0; - for (int i = 0; i < ci->children_num; i++) - { - oconfig_item_t *child = ci->children + i; - - if (strcasecmp ("Format", child->key) == 0) - { - char *mode_str = NULL; - if ((child->values_num != 1) - || (child->values[0].type != OCONFIG_TYPE_STRING)) - { - ERROR ("write_log plugin: Option `%s' requires " - "exactly one string argument.", child->key); - return (-EINVAL); - } - if (mode != 0) - { - WARNING ("write_log plugin: Redefining option `%s'.", - child->key); - } - mode_str = child->values[0].value.string; - if (strcasecmp ("Graphite", mode_str) == 0) - mode = WL_FORMAT_GRAPHITE; - else if (strcasecmp ("JSON", mode_str) == 0) - mode = WL_FORMAT_JSON; - else - { - ERROR ("write_log plugin: Unknown mode `%s' for option `%s'.", - mode_str, child->key); - return (-EINVAL); - } - } - else - { - ERROR ("write_log plugin: Invalid configuration option: `%s'.", - child->key); - } + _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; } - if (mode == 0) - mode = WL_FORMAT_GRAPHITE; - - user_data_t ud = { - .data = (void *) (size_t) mode, - .free_func = NULL - }; + } - plugin_register_write ("write_log", wl_write, &ud); - - return (0); + return 0; } /* }}} int wl_config */ -void module_register (void) -{ - plugin_register_complex_config ("write_log", wl_config); - - user_data_t ud = { - .data = (void *) (size_t) WL_FORMAT_GRAPHITE, - .free_func = NULL - }; - - plugin_register_write ("write_log", wl_write, &ud); +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 : */