From 2f95b0626881d8ed2a2c0675a1a4767db486ef03 Mon Sep 17 00:00:00 2001 From: Florian Forster Date: Thu, 24 Jul 2008 14:10:41 +0200 Subject: [PATCH] rrdcached plugin: Add the `CollectStatistics' option. If set to `true', the plugin will register a `read' callback and query statistics from rrdcached. --- src/collectd.conf.in | 1 + src/rrdcached.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++--- src/types.db | 2 + 3 files changed, 110 insertions(+), 5 deletions(-) diff --git a/src/collectd.conf.in b/src/collectd.conf.in index 462e2f8b..fa124fbd 100644 --- a/src/collectd.conf.in +++ b/src/collectd.conf.in @@ -294,6 +294,7 @@ FQDNLookup true # DaemonAddress "unix:/tmp/rrdcached.sock" # DataDir "@prefix@/var/lib/@PACKAGE_NAME@/rrd" # CreateFiles true +# CollectStatistics true # # diff --git a/src/rrdcached.c b/src/rrdcached.c index 7b2cb6a4..012b2815 100644 --- a/src/rrdcached.c +++ b/src/rrdcached.c @@ -33,13 +33,15 @@ static const char *config_keys[] = { "DaemonAddress", "DataDir", - "CreateFiles" + "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, @@ -179,12 +181,21 @@ static int rc_config (const char *key, const char *value) } else if (strcasecmp ("CreateFiles", key) == 0) { - if ((strcasecmp ("true", value) == 0) - || (strcasecmp ("yes", value) == 0) - || (strcasecmp ("on", value) == 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_create_files = 0; + config_collect_stats = 1; } else { @@ -193,6 +204,96 @@ 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; + vl.time = time (NULL); + + 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."); + 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 + { + 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]; @@ -283,6 +384,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 */ diff --git a/src/types.db b/src/types.db index fabae124..80d6cee2 100644 --- a/src/types.db +++ b/src/types.db @@ -62,6 +62,7 @@ mysql_threads running:GAUGE:0:U, connected:GAUGE:0:U, cached:GAUGE:0:U, created nfs_procedure value:COUNTER:0:4294967295 nginx_connections value:GAUGE:0:U nginx_requests value:COUNTER:0:134217728 +operations value:COUNTER:0:4294967295 percent percent:GAUGE:0:100.1 pg_blks value:COUNTER:0:U pg_n_tup_c value:COUNTER:0:U @@ -77,6 +78,7 @@ ps_cputime user:COUNTER:0:16000000, syst:COUNTER:0:16000000 ps_pagefaults minflt:COUNTER:0:9223372036854775807, majflt:COUNTER:0:9223372036854775807 ps_rss value:GAUGE:0:9223372036854775807 ps_state value:GAUGE:0:65535 +queue_length value:GAUGE:0:U serial_octets rx:COUNTER:0:4294967295, tx:COUNTER:0:4294967295 signal_noise value:GAUGE:U:0 signal_power value:GAUGE:U:0 -- 2.11.0