X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrdcached.c;h=d25471465d5d82b89f2ec439a30a2e368e418bca;hb=a10fb163601ca09ee160dac3b3d6f0707f01b8fd;hp=6eb67d4f1b6c0f29d88c54ce188663ced3811b14;hpb=01d23e3f5daf016d03f82d92a76be2fe3decdca4;p=collectd.git diff --git a/src/rrdcached.c b/src/rrdcached.c index 6eb67d4f..d2547146 100644 --- a/src/rrdcached.c +++ b/src/rrdcached.c @@ -26,9 +26,9 @@ #include "collectd.h" -#include "common.h" #include "plugin.h" -#include "utils_rrdcreate.h" +#include "utils/common/common.h" +#include "utils/rrdcreate/rrdcreate.h" #undef HAVE_CONFIG_H #include @@ -37,168 +37,153 @@ /* * Private variables */ -static char *datadir = NULL; -static char *daemon_address = NULL; -static _Bool config_create_files = 1; -static _Bool config_collect_stats = 1; -static rrdcreate_config_t rrdcreate_config = { - /* stepsize = */ 0, - /* heartbeat = */ 0, - /* rrarows = */ 1200, - /* xff = */ 0.1, - - /* timespans = */ NULL, - /* timespans_num = */ 0, - - /* consolidation_functions = */ NULL, - /* consolidation_functions_num = */ 0, - - /* async = */ 0}; +static char *datadir; +static char *daemon_address; +static bool config_create_files = true; +static bool config_collect_stats = true; +static rrdcreate_config_t rrdcreate_config = {.stepsize = 0, + .heartbeat = 0, + .rrarows = 1200, + .xff = 0.1, + .timespans = NULL, + .timespans_num = 0, + .consolidation_functions = NULL, + .consolidation_functions_num = 0, + .async = 0}; /* * Prototypes. */ static int rc_write(const data_set_t *ds, const value_list_t *vl, - user_data_t __attribute__((unused)) * user_data); + __attribute__((unused)) user_data_t *ud); static int rc_flush(__attribute__((unused)) cdtime_t timeout, const char *identifier, __attribute__((unused)) user_data_t *ud); static int value_list_to_string(char *buffer, int buffer_len, const data_set_t *ds, const value_list_t *vl) { - int offset; - int status; - time_t t; - - assert(0 == strcmp(ds->type, vl->type)); + assert(strcmp(ds->type, vl->type) == 0); memset(buffer, '\0', buffer_len); - t = CDTIME_T_TO_TIME_T(vl->time); - status = ssnprintf(buffer, buffer_len, "%lu", (unsigned long)t); + double t = CDTIME_T_TO_DOUBLE(vl->time); + int status = snprintf(buffer, buffer_len, "%f", t); if ((status < 1) || (status >= buffer_len)) - return (-1); - offset = status; + return -1; + int offset = status; for (size_t i = 0; i < ds->ds_num; i++) { if ((ds->ds[i].type != DS_TYPE_COUNTER) && (ds->ds[i].type != DS_TYPE_GAUGE) && (ds->ds[i].type != DS_TYPE_DERIVE) && (ds->ds[i].type != DS_TYPE_ABSOLUTE)) - return (-1); + return -1; if (ds->ds[i].type == DS_TYPE_COUNTER) { - status = ssnprintf(buffer + offset, buffer_len - offset, ":%llu", - vl->values[i].counter); + status = snprintf(buffer + offset, buffer_len - offset, ":%" PRIu64, + (uint64_t)vl->values[i].counter); } else if (ds->ds[i].type == DS_TYPE_GAUGE) { - status = ssnprintf(buffer + offset, buffer_len - offset, ":%f", - vl->values[i].gauge); + status = snprintf(buffer + offset, buffer_len - offset, ":%f", + vl->values[i].gauge); } else if (ds->ds[i].type == DS_TYPE_DERIVE) { - status = ssnprintf(buffer + offset, buffer_len - offset, ":%" PRIi64, - vl->values[i].derive); + status = snprintf(buffer + offset, buffer_len - offset, ":%" PRIi64, + vl->values[i].derive); } else /* if (ds->ds[i].type == DS_TYPE_ABSOLUTE) */ { - status = ssnprintf(buffer + offset, buffer_len - offset, ":%" PRIu64, - vl->values[i].absolute); + status = snprintf(buffer + offset, buffer_len - offset, ":%" PRIu64, + vl->values[i].absolute); } if ((status < 1) || (status >= (buffer_len - offset))) - return (-1); + return -1; offset += status; } /* for ds->ds_num */ - return (0); + return 0; } /* int value_list_to_string */ static int value_list_to_filename(char *buffer, size_t buffer_size, value_list_t const *vl) { char const suffix[] = ".rrd"; - int status; - size_t len; if (datadir != NULL) { size_t datadir_len = strlen(datadir) + 1; if (datadir_len >= buffer_size) - return (ENOMEM); + return ENOMEM; sstrncpy(buffer, datadir, buffer_size); buffer[datadir_len - 1] = '/'; - buffer[datadir_len] = 0; + buffer[datadir_len] = '\0'; buffer += datadir_len; buffer_size -= datadir_len; } - status = FORMAT_VL(buffer, buffer_size, vl); + int status = FORMAT_VL(buffer, buffer_size, vl); if (status != 0) - return (status); + return status; - len = strlen(buffer); + size_t len = strlen(buffer); assert(len < buffer_size); buffer += len; buffer_size -= len; if (buffer_size <= sizeof(suffix)) - return (ENOMEM); + return ENOMEM; memcpy(buffer, suffix, sizeof(suffix)); - return (0); + return 0; } /* int value_list_to_filename */ static int rc_config_get_int_positive(oconfig_item_t const *ci, int *ret) { - int status; int tmp = 0; - status = cf_util_get_int(ci, &tmp); + int status = cf_util_get_int(ci, &tmp); if (status != 0) - return (status); + return status; if (tmp < 0) - return (EINVAL); + return EINVAL; *ret = tmp; - return (0); + return 0; } /* int rc_config_get_int_positive */ static int rc_config_get_xff(oconfig_item_t const *ci, double *ret) { - double value; - if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_NUMBER)) { ERROR("rrdcached plugin: The \"%s\" needs exactly one numeric argument " "in the range [0.0, 1.0)", ci->key); - return (EINVAL); + return EINVAL; } - value = ci->values[0].value.number; + double value = ci->values[0].value.number; if ((value >= 0.0) && (value < 1.0)) { *ret = value; - return (0); + return 0; } ERROR("rrdcached plugin: The \"%s\" needs exactly one numeric argument " "in the range [0.0, 1.0)", ci->key); - return (EINVAL); + return EINVAL; } /* int rc_config_get_xff */ static int rc_config_add_timespan(int timespan) { - int *tmp; - if (timespan <= 0) - return (EINVAL); + return EINVAL; - tmp = realloc(rrdcreate_config.timespans, - sizeof(*rrdcreate_config.timespans) * - (rrdcreate_config.timespans_num + 1)); + int *tmp = realloc(rrdcreate_config.timespans, + sizeof(*rrdcreate_config.timespans) * + (rrdcreate_config.timespans_num + 1)); if (tmp == NULL) - return (ENOMEM); + return ENOMEM; rrdcreate_config.timespans = tmp; rrdcreate_config.timespans[rrdcreate_config.timespans_num] = timespan; rrdcreate_config.timespans_num++; - return (0); + return 0; } /* int rc_config_add_timespan */ static int rc_config(oconfig_item_t *ci) { @@ -258,43 +243,38 @@ static int rc_config(oconfig_item_t *ci) { plugin_register_write("rrdcached", rc_write, /* user_data = */ NULL); plugin_register_flush("rrdcached", rc_flush, /* user_data = */ NULL); } - return (0); + return 0; } /* int rc_config */ static int try_reconnect(void) { - int status; - rrdc_disconnect(); rrd_clear_error(); - status = rrdc_connect(daemon_address); + int status = rrdc_connect(daemon_address); if (status != 0) { ERROR("rrdcached plugin: Failed to reconnect to RRDCacheD " "at %s: %s (status=%d)", daemon_address, rrd_get_error(), status); - return (-1); + return -1; } INFO("rrdcached plugin: Successfully reconnected to RRDCacheD " "at %s", daemon_address); - return (0); + return 0; } /* int try_reconnect */ static int rc_read(void) { - int status; - rrdc_stats_t *head; - _Bool retried = 0; value_list_t vl = VALUE_LIST_INIT; vl.values = &(value_t){.gauge = NAN}; vl.values_len = 1; if (daemon_address == NULL) - return (-1); + return -1; if (!config_collect_stats) - return (-1); + return -1; if ((strncmp("unix:", daemon_address, strlen("unix:")) != 0) && (daemon_address[0] != '/')) @@ -302,14 +282,17 @@ static int rc_read(void) { sstrncpy(vl.plugin, "rrdcached", sizeof(vl.plugin)); rrd_clear_error(); - status = rrdc_connect(daemon_address); + int status = rrdc_connect(daemon_address); if (status != 0) { ERROR("rrdcached plugin: Failed to connect to RRDCacheD " "at %s: %s (status=%d)", daemon_address, rrd_get_error(), status); - return (-1); + return -1; } + rrdc_stats_t *head; + bool retried = false; + while (42) { /* The RRD client lib does not provide any means for checking a * connection, hence we'll have to retry upon failed operations. */ @@ -320,7 +303,7 @@ static int rc_read(void) { break; if (!retried) { - retried = 1; + retried = true; if (try_reconnect() == 0) continue; /* else: report the error and fail */ @@ -328,7 +311,7 @@ static int rc_read(void) { ERROR("rrdcached plugin: rrdc_stats_get failed: %s (status=%i).", rrd_get_error(), status); - return (-1); + return -1; } for (rrdc_stats_t *ptr = head; ptr != NULL; ptr = ptr->next) { @@ -376,66 +359,60 @@ static int rc_read(void) { rrdc_stats_free(head); - return (0); + return 0; } /* int rc_read */ static int rc_init(void) { if (config_collect_stats) plugin_register_read("rrdcached", rc_read); - return (0); + return 0; } /* int rc_init */ static int rc_write(const data_set_t *ds, const value_list_t *vl, user_data_t __attribute__((unused)) * user_data) { char filename[PATH_MAX]; char values[512]; - char *values_array[2]; int status; - _Bool retried = 0; + bool retried = false; if (daemon_address == NULL) { ERROR("rrdcached plugin: daemon_address == NULL."); plugin_unregister_write("rrdcached"); - return (-1); + return -1; } if (strcmp(ds->type, vl->type) != 0) { ERROR("rrdcached plugin: DS type does not match value list type"); - return (-1); + return -1; } if (value_list_to_filename(filename, sizeof(filename), vl) != 0) { ERROR("rrdcached plugin: value_list_to_filename failed."); - return (-1); + return -1; } if (value_list_to_string(values, sizeof(values), ds, vl) != 0) { ERROR("rrdcached plugin: value_list_to_string failed."); - return (-1); + return -1; } - values_array[0] = values; - values_array[1] = NULL; - if (config_create_files) { struct stat statbuf; status = stat(filename, &statbuf); if (status != 0) { if (errno != ENOENT) { - char errbuf[1024]; - ERROR("rrdcached plugin: stat (%s) failed: %s", filename, - sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + ERROR("rrdcached plugin: stat (%s) failed: %s", filename, STRERRNO); + return -1; } status = cu_rrd_create_file(filename, ds, vl, &rrdcreate_config); if (status != 0) { ERROR("rrdcached plugin: cu_rrd_create_file (%s) failed.", filename); - return (-1); + return -1; } else if (rrdcreate_config.async) - return (0); + return 0; } } @@ -445,9 +422,13 @@ static int rc_write(const data_set_t *ds, const value_list_t *vl, ERROR("rrdcached plugin: Failed to connect to RRDCacheD " "at %s: %s (status=%d)", daemon_address, rrd_get_error(), status); - return (-1); + return -1; } + char *values_array[2] = { + [0] = values, [1] = NULL, + }; + while (42) { /* The RRD client lib does not provide any means for checking a * connection, hence we'll have to retry upon failed operations. */ @@ -457,7 +438,7 @@ static int rc_write(const data_set_t *ds, const value_list_t *vl, break; if (!retried) { - retried = 1; + retried = true; if (try_reconnect() == 0) continue; /* else: report the error and fail */ @@ -465,36 +446,36 @@ static int rc_write(const data_set_t *ds, const value_list_t *vl, ERROR("rrdcached plugin: rrdc_update (%s, [%s], 1) failed: %s (status=%i)", filename, values_array[0], rrd_get_error(), status); - return (-1); + return -1; } - return (0); + return 0; } /* int rc_write */ static int rc_flush(__attribute__((unused)) cdtime_t timeout, /* {{{ */ const char *identifier, __attribute__((unused)) user_data_t *ud) { - char filename[PATH_MAX + 1]; - int status; - _Bool retried = 0; - if (identifier == NULL) - return (EINVAL); + return EINVAL; + + char filename[PATH_MAX + 1]; if (datadir != NULL) - ssnprintf(filename, sizeof(filename), "%s/%s.rrd", datadir, identifier); + snprintf(filename, sizeof(filename), "%s/%s.rrd", datadir, identifier); else - ssnprintf(filename, sizeof(filename), "%s.rrd", identifier); + snprintf(filename, sizeof(filename), "%s.rrd", identifier); rrd_clear_error(); - status = rrdc_connect(daemon_address); + int status = rrdc_connect(daemon_address); if (status != 0) { ERROR("rrdcached plugin: Failed to connect to RRDCacheD " "at %s: %s (status=%d)", daemon_address, rrd_get_error(), status); - return (-1); + return -1; } + bool retried = false; + while (42) { /* The RRD client lib does not provide any means for checking a * connection, hence we'll have to retry upon failed operations. */ @@ -504,7 +485,7 @@ static int rc_flush(__attribute__((unused)) cdtime_t timeout, /* {{{ */ break; if (!retried) { - retried = 1; + retried = true; if (try_reconnect() == 0) continue; /* else: report the error and fail */ @@ -512,16 +493,16 @@ static int rc_flush(__attribute__((unused)) cdtime_t timeout, /* {{{ */ ERROR("rrdcached plugin: rrdc_flush (%s) failed: %s (status=%i).", filename, rrd_get_error(), status); - return (-1); + return -1; } DEBUG("rrdcached plugin: rrdc_flush (%s): Success.", filename); - return (0); + return 0; } /* }}} int rc_flush */ static int rc_shutdown(void) { rrdc_disconnect(); - return (0); + return 0; } /* int rc_shutdown */ void module_register(void) { @@ -529,7 +510,3 @@ void module_register(void) { plugin_register_init("rrdcached", rc_init); plugin_register_shutdown("rrdcached", rc_shutdown); } /* void module_register */ - -/* - * vim: set sw=2 sts=2 et : - */