riemann plugin: Implement the "StoreRates" option.
authorFlorian Forster <octo@collectd.org>
Sun, 13 Jan 2013 22:14:13 +0000 (23:14 +0100)
committerFlorian Forster <octo@collectd.org>
Sun, 13 Jan 2013 22:14:13 +0000 (23:14 +0100)
src/riemann.c

index 315a52d..ebffd6c 100644 (file)
@@ -21,6 +21,7 @@
 #include "plugin.h"
 #include "common.h"
 #include "configfile.h"
+#include "utils_cache.h"
 #include "riemann.pb-c.h"
 
 #include <sys/socket.h>
@@ -40,6 +41,7 @@ struct riemann_host {
        uint8_t                  flags;
        pthread_mutex_t          lock;
        int                      delay;
+       _Bool                    store_rates;
        char                    *node;
        char                    *service;
        int                      s;
@@ -301,23 +303,31 @@ static Event *riemann_value_to_protobuf (struct riemann_host const *host, /* {{{
                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++)
                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
        {
@@ -348,6 +358,7 @@ static Msg *riemann_value_list_to_protobuf (struct riemann_host const *host, /*
 {
        Msg *msg;
        size_t i;
+       gauge_t *rates = NULL;
 
        /* Initialize the Msg structure. */
        msg = malloc (sizeof (*msg));
@@ -369,17 +380,30 @@ static Msg *riemann_value_list_to_protobuf (struct riemann_host const *host, /*
                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 */
 
@@ -579,6 +603,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);