Merge pull request #2252 from jaroug/kairosdb_ttl_support
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Tue, 18 Apr 2017 14:31:08 +0000 (16:31 +0200)
committerGitHub <noreply@github.com>
Tue, 18 Apr 2017 14:31:08 +0000 (16:31 +0200)
Kairosdb ttl support

src/collectd.conf.in
src/collectd.conf.pod
src/utils_format_kairosdb.c
src/utils_format_kairosdb.h
src/write_http.c

index e2d6aaf..ad9437b 100644 (file)
 #              SSLVersion "TLSv1"
 #              Format "Command"
 #              Attribute "key" "value"     # only available for KAIROSDB format
+#              TTL 0   # data ttl, only available for KAIROSDB format
 #              Metrics true
 #              Notifications false
 #              StoreRates false
index 6a7a917..43bc0ef 100644 (file)
@@ -8771,13 +8771,21 @@ Defaults to B<Command>.
 
 =item B<Attribute> I<String> I<String>
 
-Only available for KAIROSDB output format.
+Only available for the KAIROSDB output format.
 
 Consider the two given strings to be the key and value of an additional tag for
 each metric being sent out.
 
 You can add multiple B<Attribute>.
 
+=item B<TTL> I<Int>
+
+Only available for the KAIROSDB output format.
+
+Sets the Cassandra ttl for the data points.
+
+Please refer to L<http://kairosdb.github.io/docs/build/html/restapi/AddDataPoints.html?highlight=ttl>
+
 =item B<Metrics> B<true>|B<false>
 
 Controls whether I<metrics> are POSTed to this location. Defaults to B<true>.
index 2a14f0e..224e8a5 100644 (file)
@@ -183,7 +183,7 @@ static int value_list_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
                                   const data_set_t *ds, const value_list_t *vl,
                                   int store_rates,
                                   char const *const *http_attrs,
-                                  size_t http_attrs_num) {
+                                  size_t http_attrs_num, int data_ttl) {
   char temp[512];
   size_t offset = 0;
   int status;
@@ -230,6 +230,9 @@ static int value_list_to_kairosdb(char *buffer, size_t buffer_size, /* {{{ */
 
     memset(temp, 0, sizeof(temp));
 
+    if (data_ttl != 0)
+      BUFFER_ADD(", \"ttl\": %i", data_ttl);
+
     BUFFER_ADD(", \"tags\":\{");
 
     BUFFER_ADD("\"host\": \"%s\"", vl->host);
@@ -260,12 +263,12 @@ static int format_kairosdb_value_list_nocheck(
     char *buffer, /* {{{ */
     size_t *ret_buffer_fill, size_t *ret_buffer_free, const data_set_t *ds,
     const value_list_t *vl, int store_rates, size_t temp_size,
-    char const *const *http_attrs, size_t http_attrs_num) {
+    char const *const *http_attrs, size_t http_attrs_num, int data_ttl) {
   char temp[temp_size];
   int status;
 
   status = value_list_to_kairosdb(temp, sizeof(temp), ds, vl, store_rates,
-                                  http_attrs, http_attrs_num);
+                                  http_attrs, http_attrs_num, data_ttl);
   if (status != 0)
     return (status);
   temp_size = strlen(temp);
@@ -334,7 +337,7 @@ int format_kairosdb_value_list(char *buffer, /* {{{ */
                                size_t *ret_buffer_fill, size_t *ret_buffer_free,
                                const data_set_t *ds, const value_list_t *vl,
                                int store_rates, char const *const *http_attrs,
-                               size_t http_attrs_num) {
+                               size_t http_attrs_num, int data_ttl) {
   if ((buffer == NULL) || (ret_buffer_fill == NULL) ||
       (ret_buffer_free == NULL) || (ds == NULL) || (vl == NULL))
     return (-EINVAL);
@@ -344,7 +347,7 @@ int format_kairosdb_value_list(char *buffer, /* {{{ */
 
   return (format_kairosdb_value_list_nocheck(
       buffer, ret_buffer_fill, ret_buffer_free, ds, vl, store_rates,
-      (*ret_buffer_free) - 2, http_attrs, http_attrs_num));
+      (*ret_buffer_free) - 2, http_attrs, http_attrs_num, data_ttl));
 } /* }}} int format_kairosdb_value_list */
 
 /* vim: set sw=2 sts=2 et fdm=marker : */
index b6aa39d..3a4c7c7 100644 (file)
@@ -41,7 +41,7 @@ int format_kairosdb_value_list(char *buffer, size_t *ret_buffer_fill,
                                size_t *ret_buffer_free, const data_set_t *ds,
                                const value_list_t *vl, int store_rates,
                                char const *const *http_attrs,
-                               size_t http_attrs_num);
+                               size_t http_attrs_num, int data_ttl);
 int format_kairosdb_finalize(char *buffer, size_t *ret_buffer_fill,
                              size_t *ret_buffer_free);
 
index c6efe07..097101f 100644 (file)
@@ -78,6 +78,8 @@ struct wh_callback_s {
   cdtime_t send_buffer_init_time;
 
   pthread_mutex_t send_lock;
+
+  int data_ttl;
 };
 typedef struct wh_callback_s wh_callback_t;
 
@@ -473,7 +475,8 @@ static int wh_write_kairosdb(const data_set_t *ds,
 
   status = format_kairosdb_value_list(
       cb->send_buffer, &cb->send_buffer_fill, &cb->send_buffer_free, ds, vl,
-      cb->store_rates, (char const *const *)http_attrs, http_attrs_num);
+      cb->store_rates, (char const *const *)http_attrs, http_attrs_num,
+      cb->data_ttl);
   if (status == -ENOMEM) {
     status = wh_flush_nolock(/* timeout = */ 0, cb);
     if (status != 0) {
@@ -484,7 +487,8 @@ static int wh_write_kairosdb(const data_set_t *ds,
 
     status = format_kairosdb_value_list(
         cb->send_buffer, &cb->send_buffer_fill, &cb->send_buffer_free, ds, vl,
-        cb->store_rates, (char const *const *)http_attrs, http_attrs_num);
+        cb->store_rates, (char const *const *)http_attrs, http_attrs_num,
+        cb->data_ttl);
   }
   if (status != 0) {
     pthread_mutex_unlock(&cb->send_lock);
@@ -624,6 +628,7 @@ static int wh_config_node(oconfig_item_t *ci) /* {{{ */
   cb->headers = NULL;
   cb->send_metrics = 1;
   cb->send_notifications = 0;
+  cb->data_ttl = 0;
 
   pthread_mutex_init(&cb->send_lock, /* attr = */ NULL);
 
@@ -733,6 +738,8 @@ static int wh_config_node(oconfig_item_t *ci) /* {{{ */
       DEBUG("write_http plugin: got attribute: %s => %s", key, val);
       sfree(key);
       sfree(val);
+    } else if (strcasecmp("TTL", child->key) == 0) {
+      status = cf_util_get_int(child, &cb->data_ttl);
     } else {
       ERROR("write_http plugin: Invalid configuration "
             "option: %s.",