write_riemann plugin: Coding style fixes.
[collectd.git] / src / write_riemann.c
index 0bd8e3a..c890818 100644 (file)
@@ -57,6 +57,8 @@ struct riemann_host {
 
 static char    **riemann_tags;
 static size_t    riemann_tags_num;
+static char    **riemann_attrs;
+static size_t     riemann_attrs_num;
 
 static void riemann_event_protobuf_free (Event *event) /* {{{ */
 {
@@ -106,8 +108,7 @@ static void riemann_msg_protobuf_free (Msg *msg) /* {{{ */
 } /* }}} void riemann_msg_protobuf_free */
 
 /* host->lock must be held when calling this function. */
-static int
-riemann_connect(struct riemann_host *host)
+static int riemann_connect(struct riemann_host *host) /* {{{ */
 {
        int                      e;
        struct addrinfo         *ai, *res, hints;
@@ -162,11 +163,10 @@ riemann_connect(struct riemann_host *host)
                return -1;
        }
        return 0;
-}
+} /* }}} int riemann_connect */
 
 /* host->lock must be held when calling this function. */
-static int
-riemann_disconnect (struct riemann_host *host)
+static int riemann_disconnect (struct riemann_host *host) /* {{{ */
 {
        if ((host->flags & F_CONNECT) == 0)
                return (0);
@@ -176,17 +176,15 @@ riemann_disconnect (struct riemann_host *host)
        host->flags &= ~F_CONNECT;
 
        return (0);
-}
+} /* }}} int riemann_disconnect */
 
-static inline int
-riemann_send_msg(struct riemann_host *host, const Msg *msg)
+static int riemann_send_msg (struct riemann_host *host, const Msg *msg) /* {{{ */
 {
        int status = 0;
        u_char *buffer = NULL;
        size_t  buffer_len;
 
        status = riemann_connect (host);
-
        if (status != 0)
                return status;
 
@@ -196,12 +194,10 @@ riemann_send_msg(struct riemann_host *host, const Msg *msg)
                buffer_len += 4;
 
        buffer = malloc (buffer_len);
-
        if (buffer == NULL) {
                ERROR ("write_riemann plugin: malloc failed.");
                return ENOMEM;
        }
-
        memset (buffer, 0, buffer_len);
 
        if (host->use_tcp)
@@ -216,26 +212,22 @@ riemann_send_msg(struct riemann_host *host, const Msg *msg)
        }
 
        status = (int) swrite (host->s, buffer, buffer_len);
-
        if (status != 0)
        {
                char errbuf[1024];
-
                ERROR ("write_riemann plugin: Sending to Riemann at %s:%s failed: %s",
                                (host->node != NULL) ? host->node : RIEMANN_HOST,
                                (host->service != NULL) ? host->service : RIEMANN_PORT,
                                sstrerror (errno, errbuf, sizeof (errbuf)));
-
                sfree (buffer);
                return -1;
        }
 
        sfree (buffer);
        return 0;
-}
+} /* }}} int riemann_send_msg */
 
-static inline int
-riemann_recv_ack(struct riemann_host *host)
+static int riemann_recv_ack(struct riemann_host *host) /* {{{ */
 {
        int status = 0;
        Msg *msg = NULL;
@@ -275,21 +267,19 @@ riemann_recv_ack(struct riemann_host *host)
 
        msg__free_unpacked (msg, NULL);
        return 0;
-}
+} /* }}} int riemann_recv_ack */
 
 /**
  * Function to send messages (Msg) to riemann.
  *
  * Acquires the host lock, disconnects on errors.
  */
-static int
-riemann_send(struct riemann_host *host, Msg const *msg)
+static int riemann_send(struct riemann_host *host, Msg const *msg) /* {{{ */
 {
        int status = 0;
        pthread_mutex_lock (&host->lock);
 
        status = riemann_send_msg(host, msg);
-
        if (status != 0) {
                riemann_disconnect (host);
                pthread_mutex_unlock (&host->lock);
@@ -313,7 +303,7 @@ riemann_send(struct riemann_host *host, Msg const *msg)
 
        pthread_mutex_unlock (&host->lock);
        return 0;
-}
+} /* }}} int riemann_send */
 
 static int riemann_event_add_tag (Event *event, char const *tag) /* {{{ */
 {
@@ -422,6 +412,11 @@ static Msg *riemann_notification_to_protobuf (struct riemann_host *host, /* {{{
                riemann_event_add_attribute (event, "type_instance",
                                n->type_instance);
 
+       for (i = 0; i < riemann_attrs_num; i += 2)
+               riemann_event_add_attribute(event,
+                                           riemann_attrs[i],
+                                           riemann_attrs[i +1]);
+
        for (i = 0; i < riemann_tags_num; i++)
                riemann_event_add_tag (event, riemann_tags[i]);
 
@@ -511,6 +506,11 @@ static Event *riemann_value_to_protobuf (struct riemann_host const *host, /* {{{
                riemann_event_add_attribute (event, "ds_index", ds_index);
        }
 
+       for (i = 0; i < riemann_attrs_num; i += 2)
+               riemann_event_add_attribute(event,
+                                           riemann_attrs[i],
+                                           riemann_attrs[i +1]);
+
        for (i = 0; i < riemann_tags_num; i++)
                riemann_event_add_tag (event, riemann_tags[i]);
 
@@ -608,8 +608,7 @@ static Msg *riemann_value_list_to_protobuf (struct riemann_host const *host, /*
        return (msg);
 } /* }}} Msg *riemann_value_list_to_protobuf */
 
-static int
-riemann_notification(const notification_t *n, user_data_t *ud)
+static int riemann_notification(const notification_t *n, user_data_t *ud) /* {{{ */
 {
        int                      status;
        struct riemann_host     *host = ud->data;
@@ -628,8 +627,7 @@ riemann_notification(const notification_t *n, user_data_t *ud)
        return (status);
 } /* }}} int riemann_notification */
 
-static int
-riemann_write(const data_set_t *ds,
+static int riemann_write(const data_set_t *ds, /* {{{ */
              const value_list_t *vl,
              user_data_t *ud)
 {
@@ -648,10 +646,9 @@ riemann_write(const data_set_t *ds,
 
        riemann_msg_protobuf_free (msg);
        return status;
-}
+} /* }}} int riemann_write */
 
-static void
-riemann_free(void *p)
+static void riemann_free(void *p) /* {{{ */
 {
        struct riemann_host     *host = p;
 
@@ -672,10 +669,9 @@ riemann_free(void *p)
        sfree(host->service);
        pthread_mutex_destroy (&host->lock);
        sfree(host);
-}
+} /* }}} void riemann_free */
 
-static int
-riemann_config_node(oconfig_item_t *ci)
+static int riemann_config_node(oconfig_item_t *ci) /* {{{ */
 {
        struct riemann_host     *host = NULL;
        int                      status = 0;
@@ -831,10 +827,9 @@ riemann_config_node(oconfig_item_t *ci)
        pthread_mutex_unlock (&host->lock);
 
        return status;
-}
+} /* }}} int riemann_config_node */
 
-static int
-riemann_config(oconfig_item_t *ci)
+static int riemann_config(oconfig_item_t *ci) /* {{{ */
 {
        int              i;
        oconfig_item_t  *child;
@@ -845,6 +840,32 @@ riemann_config(oconfig_item_t *ci)
 
                if (strcasecmp("Node", child->key) == 0) {
                        riemann_config_node (child);
+               } else if (strcasecmp(child->key, "attribute") == 0) {
+                       char *key = NULL;
+                       char *val = NULL;
+
+                       if (child->values_num != 2) {
+                               WARNING("riemann attributes need both a key and a value.");
+                               return (-1);
+                       }
+                       if (child->values[0].type != OCONFIG_TYPE_STRING ||
+                           child->values[1].type != OCONFIG_TYPE_STRING) {
+                               WARNING("riemann attribute needs string arguments.");
+                               return (-1);
+                       }
+                       if ((key = strdup(child->values[0].value.string)) == NULL) {
+                               WARNING("cannot allocate memory for attribute key.");
+                               return (-1);
+                       }
+                       if ((val = strdup(child->values[1].value.string)) == NULL) {
+                               WARNING("cannot allocate memory for attribute value.");
+                               return (-1);
+                       }
+                       strarray_add(&riemann_attrs, &riemann_attrs_num, key);
+                       strarray_add(&riemann_attrs, &riemann_attrs_num, val);
+                       DEBUG("write_riemann: got attr: %s => %s", key, val);
+                       sfree(key);
+                       sfree(val);
                } else if (strcasecmp(child->key, "tag") == 0) {
                        char *tmp = NULL;
                        status = cf_util_get_string(child, &tmp);
@@ -861,10 +882,9 @@ riemann_config(oconfig_item_t *ci)
                }
        }
        return (0);
-}
+} /* }}} int riemann_config */
 
-void
-module_register(void)
+void module_register(void)
 {
        plugin_register_complex_config ("write_riemann", riemann_config);
 }