X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Frrdcached.c;h=31c6352411fc4481deb584f37e9f07c59bf321e2;hb=4c295efaa4044d56f6222186557d35aa165ef6db;hp=fef78ce42cad94cc8d640b5df6947d330d84a4fd;hpb=979097128af0f9ee8be2b553c92b66e2934a359b;p=collectd.git diff --git a/src/rrdcached.c b/src/rrdcached.c index fef78ce4..31c63524 100644 --- a/src/rrdcached.c +++ b/src/rrdcached.c @@ -22,6 +22,7 @@ #include "collectd.h" #include "plugin.h" #include "common.h" +#include "utils_rrdcreate.h" #include @@ -31,12 +32,29 @@ static const char *config_keys[] = { "DaemonAddress", - "DataDir" + "DataDir", + "CreateFiles", + "CollectStatistics" }; static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); static char *datadir = NULL; static char *daemon_address = NULL; +static int config_create_files = 1; +static int 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 +}; static int value_list_to_string (char *buffer, int buffer_len, const data_set_t *ds, const value_list_t *vl) @@ -63,12 +81,12 @@ static int value_list_to_string (char *buffer, int buffer_len, if (ds->ds[i].type == DS_TYPE_COUNTER) { status = ssnprintf (buffer + offset, buffer_len - offset, - ",%llu", vl->values[i].counter); + ":%llu", vl->values[i].counter); } else /* if (ds->ds[i].type == DS_TYPE_GAUGE) */ { status = ssnprintf (buffer + offset, buffer_len - offset, - ",%lf", vl->values[i].gauge); + ":%lf", vl->values[i].gauge); } if ((status < 1) || (status >= (buffer_len - offset))) @@ -161,6 +179,24 @@ static int rc_config (const char *key, const char *value) return (1); } } + else if (strcasecmp ("CreateFiles", key) == 0) + { + if ((strcasecmp ("false", value) == 0) + || (strcasecmp ("no", value) == 0) + || (strcasecmp ("off", value) == 0)) + config_create_files = 0; + else + config_create_files = 1; + } + else if (strcasecmp ("CollectStatistics", key) == 0) + { + if ((strcasecmp ("false", value) == 0) + || (strcasecmp ("no", value) == 0) + || (strcasecmp ("off", value) == 0)) + config_collect_stats = 0; + else + config_collect_stats = 1; + } else { return (-1); @@ -168,6 +204,116 @@ static int rc_config (const char *key, const char *value) return (0); } /* int rc_config */ +static int rc_read (void) +{ + int status; + rrdc_stats_t *head; + rrdc_stats_t *ptr; + + value_t values[1]; + value_list_t vl = VALUE_LIST_INIT; + + if (daemon_address == NULL) + return (-1); + + if (config_collect_stats == 0) + return (-1); + + vl.values = values; + vl.values_len = 1; + + if ((strncmp ("unix:", daemon_address, strlen ("unix:")) == 0) + || (daemon_address[0] == '/')) + sstrncpy (vl.host, hostname_g, sizeof (vl.host)); + else + sstrncpy (vl.host, daemon_address, sizeof (vl.host)); + sstrncpy (vl.plugin, "rrdcached", sizeof (vl.plugin)); + + head = NULL; + status = rrdc_stats_get (&head); + if (status != 0) + { + ERROR ("rrdcached plugin: rrdc_stats_get failed with status %i.", status); + return (-1); + } + + for (ptr = head; ptr != NULL; ptr = ptr->next) + { + if (ptr->type == RRDC_STATS_TYPE_GAUGE) + values[0].gauge = (gauge_t) ptr->value.gauge; + else if (ptr->type == RRDC_STATS_TYPE_COUNTER) + values[0].counter = (counter_t) ptr->value.counter; + else + continue; + + if (strcasecmp ("QueueLength", ptr->name) == 0) + { + sstrncpy (vl.type, "queue_length", sizeof (vl.type)); + sstrncpy (vl.type_instance, "", sizeof (vl.type_instance)); + } + else if (strcasecmp ("UpdatesWritten", ptr->name) == 0) + { + sstrncpy (vl.type, "operations", sizeof (vl.type)); + sstrncpy (vl.type_instance, "write-updates", sizeof (vl.type_instance)); + } + else if (strcasecmp ("DataSetsWritten", ptr->name) == 0) + { + sstrncpy (vl.type, "operations", sizeof (vl.type)); + sstrncpy (vl.type_instance, "write-data_sets", + sizeof (vl.type_instance)); + } + else if (strcasecmp ("TreeNodesNumber", ptr->name) == 0) + { + sstrncpy (vl.type, "gauge", sizeof (vl.type)); + sstrncpy (vl.type_instance, "tree_nodes", sizeof (vl.type_instance)); + } + else if (strcasecmp ("TreeDepth", ptr->name) == 0) + { + sstrncpy (vl.type, "gauge", sizeof (vl.type)); + sstrncpy (vl.type_instance, "tree_depth", sizeof (vl.type_instance)); + } + else if (strcasecmp ("FlushesReceived", ptr->name) == 0) + { + sstrncpy (vl.type, "operations", sizeof (vl.type)); + sstrncpy (vl.type_instance, "receive-flush", sizeof (vl.type_instance)); + } + else if (strcasecmp ("JournalBytes", ptr->name) == 0) + { + sstrncpy (vl.type, "counter", sizeof (vl.type)); + sstrncpy (vl.type_instance, "journal-bytes", sizeof (vl.type_instance)); + } + else if (strcasecmp ("JournalRotate", ptr->name) == 0) + { + sstrncpy (vl.type, "counter", sizeof (vl.type)); + sstrncpy (vl.type_instance, "journal-rotates", sizeof (vl.type_instance)); + } + else if (strcasecmp ("UpdatesReceived", ptr->name) == 0) + { + sstrncpy (vl.type, "operations", sizeof (vl.type)); + sstrncpy (vl.type_instance, "receive-update", sizeof (vl.type_instance)); + } + else + { + DEBUG ("rrdcached plugin: rc_read: Unknown statistic `%s'.", ptr->name); + continue; + } + + plugin_dispatch_values (&vl); + } /* for (ptr = head; ptr != NULL; ptr = ptr->next) */ + + rrdc_stats_free (head); + + return (0); +} /* int rc_read */ + +static int rc_init (void) +{ + if (config_collect_stats != 0) + plugin_register_read ("rrdcached", rc_read); + + return (0); +} /* int rc_init */ + static int rc_write (const data_set_t *ds, const value_list_t *vl) { char filename[512]; @@ -203,7 +349,30 @@ static int rc_write (const data_set_t *ds, const value_list_t *vl) values_array[0] = values; values_array[1] = NULL; - /* TODO: Check if the file exists. */ + if (config_create_files != 0) + { + 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); + } + + 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); + } + } + } status = rrdc_connect (daemon_address); if (status != 0) @@ -235,6 +404,7 @@ void module_register (void) { plugin_register_config ("rrdcached", rc_config, config_keys, config_keys_num); + plugin_register_init ("rrdcached", rc_init); plugin_register_write ("rrdcached", rc_write); plugin_register_shutdown ("rrdcached", rc_shutdown); } /* void module_register */