From: Florian Forster Date: Mon, 14 Jan 2013 08:49:17 +0000 (+0100) Subject: Merge remote-tracking branch 'github-octo/pyr/riemann' into pyr/riemann X-Git-Tag: collectd-5.3.0~56^2~8 X-Git-Url: https://git.octo.it/?a=commitdiff_plain;h=917c18f7783c176e0df13a017f1ca1213724910c;hp=-c;p=collectd.git Merge remote-tracking branch 'github-octo/pyr/riemann' into pyr/riemann --- 917c18f7783c176e0df13a017f1ca1213724910c diff --combined src/riemann.c index a2211127,ebffd6c8..4af77b43 --- a/src/riemann.c +++ b/src/riemann.c @@@ -21,6 -21,7 +21,7 @@@ #include "plugin.h" #include "common.h" #include "configfile.h" + #include "utils_cache.h" #include "riemann.pb-c.h" #include @@@ -40,6 -41,7 +41,7 @@@ struct riemann_host uint8_t flags; pthread_mutex_t lock; int delay; + _Bool store_rates; char *node; char *service; int s; @@@ -47,8 -49,8 +49,8 @@@ int reference_count; }; -static char *riemann_tags[RIEMANN_EXTRA_TAGS]; -static int riemann_tagcount; +static char **riemann_tags; +static size_t riemann_tags_num; static int riemann_send(struct riemann_host *, Msg const *); static int riemann_notification(const notification_t *, user_data_t *); @@@ -62,6 -64,8 +64,6 @@@ void module_register(void) static void riemann_event_protobuf_free (Event *event) /* {{{ */ { - size_t i; - if (event == NULL) return; @@@ -70,9 -74,9 +72,9 @@@ sfree (event->host); sfree (event->description); - for (i = 0; i < event->n_tags; i++) - sfree (event->tags[i]); - sfree (event->tags); + strarray_free (event->tags, event->n_tags); + event->tags = NULL; + event->n_tags = 0; sfree (event); } /* }}} void riemann_event_protobuf_free */ @@@ -151,6 -155,13 +153,6 @@@ static int riemann_event_add_tag (Even char buffer[1024]; size_t ret; - char **tmp; - - tmp = realloc (event->tags, (event->n_tags + 1) * sizeof (*event->tags)); - if (tmp == NULL) - return (ENOMEM); - event->tags = tmp; - va_start (ap, format); ret = vsnprintf (buffer, sizeof (buffer), format, ap); if (ret >= sizeof (buffer)) @@@ -158,7 -169,11 +160,7 @@@ buffer[ret] = 0; va_end (ap); - event->tags[event->n_tags] = strdup (buffer); - if (event->tags[event->n_tags] == NULL) - return (ENOMEM); - event->n_tags++; - return (0); + return (strarray_add (&event->tags, &event->n_tags, buffer)); } /* }}} int riemann_event_add_tag */ static Msg *riemann_notification_to_protobuf (struct riemann_host *host, /* {{{ */ @@@ -228,7 -243,7 +230,7 @@@ riemann_event_add_tag (event, "type_instance:%s", n->type_instance); - for (i = 0; i < riemann_tagcount; i++) + for (i = 0; i < riemann_tags_num; i++) riemann_event_add_tag (event, "%s", riemann_tags[i]); /* TODO: Use FORMAT_VL() here. */ @@@ -288,23 -303,31 +290,31 @@@ static Event *riemann_value_to_protobu riemann_event_add_tag (event, "type_instance:%s", vl->type_instance); - riemann_event_add_tag (event, "ds_type:%s", - DS_TYPE_TO_STRING(ds->ds[index].type)); + if ((ds->ds[index].type != DS_TYPE_GAUGE) && (rates != NULL)) + { + riemann_event_add_tag (event, "ds_type:%s:rate", + DS_TYPE_TO_STRING(ds->ds[index].type)); + } + else + { + riemann_event_add_tag (event, "ds_type:%s", + DS_TYPE_TO_STRING(ds->ds[index].type)); + } riemann_event_add_tag (event, "ds_name:%s", ds->ds[index].name); riemann_event_add_tag (event, "ds_index:%zu", index); - for (i = 0; i < riemann_tagcount; i++) + for (i = 0; i < riemann_tags_num; i++) riemann_event_add_tag (event, "%s", riemann_tags[i]); - if (rates != NULL) + if (ds->ds[index].type == DS_TYPE_GAUGE) { event->has_metric_d = 1; - event->metric_d = (double) rates[index]; + event->metric_d = (double) vl->values[index].gauge; } - else if (ds->ds[index].type == DS_TYPE_GAUGE) + else if (rates != NULL) { event->has_metric_d = 1; - event->metric_d = (double) vl->values[index].gauge; + event->metric_d = (double) rates[index]; } else { @@@ -335,6 -358,7 +345,7 @@@ static Msg *riemann_value_list_to_proto { Msg *msg; size_t i; + gauge_t *rates = NULL; /* Initialize the Msg structure. */ msg = malloc (sizeof (*msg)); @@@ -356,17 -380,30 +367,30 @@@ return (NULL); } + if (host->store_rates) + { + rates = uc_get_rate (ds, vl); + if (rates == NULL) + { + ERROR ("riemann plugin: uc_get_rate failed."); + riemann_msg_protobuf_free (msg); + return (NULL); + } + } + for (i = 0; i < msg->n_events; i++) { msg->events[i] = riemann_value_to_protobuf (host, ds, vl, - (int) i, /* rates = */ NULL); + (int) i, rates); if (msg->events[i] == NULL) { riemann_msg_protobuf_free (msg); + sfree (rates); return (NULL); } } + sfree (rates); return (msg); } /* }}} Msg *riemann_value_list_to_protobuf */ @@@ -566,6 -603,10 +590,10 @@@ riemann_config_host(oconfig_item_t *ci } else if (strcasecmp(child->key, "delay") == 0) { if ((status = cf_util_get_int(ci, &host->delay)) != 0) break; + } else if (strcasecmp ("StoreRates", child->key) == 0) { + status = cf_util_get_boolean (ci, &host->store_rates); + if (status != 0) + break; } else { WARNING("riemann plugin: ignoring unknown config " "option: \"%s\"", child->key); @@@ -627,8 -668,8 +655,8 @@@ static in riemann_config(oconfig_item_t *ci) { int i; - char *newtag; oconfig_item_t *child; + int status; for (i = 0; i < ci->children_num; i++) { child = &ci->children[i]; @@@ -636,14 -677,17 +664,14 @@@ if (strcasecmp(child->key, "host") == 0) { riemann_config_host(child); } else if (strcasecmp(child->key, "tag") == 0) { - if (riemann_tagcount >= RIEMANN_EXTRA_TAGS) { - WARNING("riemann plugin: too many tags"); - return -1; - } - newtag = NULL; - cf_util_get_string(child, &newtag); - if (newtag == NULL) - return -1; - riemann_tags[riemann_tagcount++] = newtag; - DEBUG("riemann_config: got tag: %s", newtag); + char *tmp = NULL; + status = cf_util_get_string(child, &tmp); + if (status != 0) + continue; + strarray_add (&riemann_tags, &riemann_tags_num, tmp); + DEBUG("riemann plugin: Got tag: %s", tmp); + sfree (tmp); } else { WARNING ("riemann plugin: Ignoring unknown " "configuration option \"%s\" at top level.",