write_riemann plugin: Implement the "TTLFactor" option.
authorFlorian Forster <octo@collectd.org>
Mon, 3 Jun 2013 07:07:15 +0000 (09:07 +0200)
committerFlorian Forster <octo@collectd.org>
Mon, 3 Jun 2013 07:14:40 +0000 (09:14 +0200)
Github: #336

src/collectd.conf.pod
src/write_riemann.c

index b66c435..541af4c 100644 (file)
@@ -6034,7 +6034,7 @@ Synopsis:
      Protocol UDP
      StoreRates true
      AlwaysAppendDS false
-     Delay 10
+     TTLFactor 2.0
    </Node>
    Tag "foobar"
  </Plugin>
@@ -6081,6 +6081,15 @@ If set the B<true>, append the name of the I<Data Source> (DS) to the
 identifies a metric in I<Riemann>. If set to B<false> (the default), this is
 only done when there is more than one DS.
 
+=item B<TTLFactor> I<Factor>
+
+I<Riemann> events have a I<Time to Live> (TTL) which specifies how long each
+event is considered active. I<collectd> populates this field based on the
+metrics interval setting. This setting controls the factor with which the
+interval is multiplied to set the TTL. The default value is B<2.0>. Unless you
+know exactly what you're doing, you should only increase this setting from its
+default value.
+
 =back
 
 =item B<Tag> I<String>
index d31a988..3e2ddd7 100644 (file)
@@ -37,6 +37,7 @@
 
 #define RIEMANN_HOST           "localhost"
 #define RIEMANN_PORT           "5555"
+#define RIEMANN_TTL_FACTOR      2.0
 
 struct riemann_host {
        char                    *name;
@@ -49,6 +50,7 @@ struct riemann_host {
        char                    *service;
        _Bool                    use_tcp;
        int                      s;
+       double                   ttl_factor;
 
        int                      reference_count;
 };
@@ -365,6 +367,7 @@ static Event *riemann_value_to_protobuf (struct riemann_host const *host, /* {{{
        Event *event;
        char name_buffer[5 * DATA_MAX_NAME_LEN];
        char service_buffer[6 * DATA_MAX_NAME_LEN];
+       double ttl;
        int i;
 
        event = malloc (sizeof (*event));
@@ -379,7 +382,9 @@ static Event *riemann_value_to_protobuf (struct riemann_host const *host, /* {{{
        event->host = strdup (vl->host);
        event->time = CDTIME_T_TO_TIME_T (vl->time);
        event->has_time = 1;
-       event->ttl = CDTIME_T_TO_TIME_T (2 * vl->interval);
+
+       ttl = CDTIME_T_TO_DOUBLE (vl->interval) * host->ttl_factor;
+       event->ttl = (float) ttl;
        event->has_ttl = 1;
 
        riemann_event_add_attribute (event, "plugin", vl->plugin);
@@ -597,6 +602,7 @@ riemann_config_node(oconfig_item_t *ci)
        host->store_rates = 1;
        host->always_append_ds = 0;
        host->use_tcp = 0;
+       host->ttl_factor = RIEMANN_TTL_FACTOR;
 
        status = cf_util_get_string (ci, &host->name);
        if (status != 0) {
@@ -656,6 +662,33 @@ riemann_config_node(oconfig_item_t *ci)
                                        &host->always_append_ds);
                        if (status != 0)
                                break;
+               } else if (strcasecmp ("TTLFactor", child->key) == 0) {
+                       double tmp = NAN;
+                       status = cf_util_get_double (child, &tmp);
+                       if (status != 0)
+                               break;
+                       if (tmp >= 2.0) {
+                               host->ttl_factor = tmp;
+                       } else if (tmp >= 1.0) {
+                               NOTICE ("write_riemann plugin: The configured "
+                                               "TTLFactor is very small "
+                                               "(%.1f). A value of 2.0 or "
+                                               "greater is recommended.",
+                                               tmp);
+                               host->ttl_factor = tmp;
+                       } else if (tmp > 0.0) {
+                               WARNING ("write_riemann plugin: The configured "
+                                               "TTLFactor is too small to be "
+                                               "useful (%.1f). I'll use it "
+                                               "since the user knows best, "
+                                               "but under protest.",
+                                               tmp);
+                               host->ttl_factor = tmp;
+                       } else { /* zero, negative and NAN */
+                               ERROR ("write_riemann plugin: The configured "
+                                               "TTLFactor is invalid (%.1f).",
+                                               tmp);
+                       }
                } else {
                        WARNING("write_riemann plugin: ignoring unknown config "
                                "option: \"%s\"", child->key);