#include "collectd.h"
-#include "plugin.h"
#include "common.h"
-#include "configfile.h"
+#include "plugin.h"
#include "utils_avltree.h"
#include "utils_latency.h"
-#include <sys/types.h>
#include <netdb.h>
#include <poll.h>
+#include <sys/types.h>
/* AIX doesn't have MSG_DONTWAIT */
#ifndef MSG_DONTWAIT
-# define MSG_DONTWAIT MSG_NONBLOCK
+#define MSG_DONTWAIT MSG_NONBLOCK
#endif
#ifndef STATSD_DEFAULT_NODE
-# define STATSD_DEFAULT_NODE NULL
+#define STATSD_DEFAULT_NODE NULL
#endif
#ifndef STATSD_DEFAULT_SERVICE
-# define STATSD_DEFAULT_SERVICE "8125"
+#define STATSD_DEFAULT_SERVICE "8125"
#endif
-enum metric_type_e
-{
- STATSD_COUNTER,
- STATSD_TIMER,
- STATSD_GAUGE,
- STATSD_SET
-};
+enum metric_type_e { STATSD_COUNTER, STATSD_TIMER, STATSD_GAUGE, STATSD_SET };
typedef enum metric_type_e metric_type_t;
-struct statsd_metric_s
-{
+struct statsd_metric_s {
metric_type_t type;
double value;
derive_t counter;
};
typedef struct statsd_metric_s statsd_metric_t;
-static c_avl_tree_t *metrics_tree = NULL;
+static c_avl_tree_t *metrics_tree = NULL;
static pthread_mutex_t metrics_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_t network_thread;
-static _Bool network_thread_running = 0;
-static _Bool network_thread_shutdown = 0;
+static _Bool network_thread_running = 0;
+static _Bool network_thread_shutdown = 0;
static char *conf_node = NULL;
static char *conf_service = NULL;
static _Bool conf_delete_counters = 0;
-static _Bool conf_delete_timers = 0;
-static _Bool conf_delete_gauges = 0;
-static _Bool conf_delete_sets = 0;
+static _Bool conf_delete_timers = 0;
+static _Bool conf_delete_gauges = 0;
+static _Bool conf_delete_sets = 0;
static double *conf_timer_percentile = NULL;
-static size_t conf_timer_percentile_num = 0;
+static size_t conf_timer_percentile_num = 0;
-static _Bool conf_counter_sum = 0;
-static _Bool conf_timer_lower = 0;
-static _Bool conf_timer_upper = 0;
-static _Bool conf_timer_sum = 0;
-static _Bool conf_timer_count = 0;
+static _Bool conf_counter_sum = 0;
+static _Bool conf_timer_lower = 0;
+static _Bool conf_timer_upper = 0;
+static _Bool conf_timer_sum = 0;
+static _Bool conf_timer_count = 0;
/* Must hold metrics_lock when calling this function. */
-static statsd_metric_t *statsd_metric_lookup_unsafe (char const *name, /* {{{ */
- metric_type_t type)
-{
+static statsd_metric_t *statsd_metric_lookup_unsafe(char const *name, /* {{{ */
+ metric_type_t type) {
char key[DATA_MAX_NAME_LEN + 2];
char *key_copy;
statsd_metric_t *metric;
int status;
- switch (type)
- {
- case STATSD_COUNTER: key[0] = 'c'; break;
- case STATSD_TIMER: key[0] = 't'; break;
- case STATSD_GAUGE: key[0] = 'g'; break;
- case STATSD_SET: key[0] = 's'; break;
- default: return (NULL);
+ switch (type) {
+ case STATSD_COUNTER:
+ key[0] = 'c';
+ break;
+ case STATSD_TIMER:
+ key[0] = 't';
+ break;
+ case STATSD_GAUGE:
+ key[0] = 'g';
+ break;
+ case STATSD_SET:
+ key[0] = 's';
+ break;
+ default:
+ return NULL;
}
key[1] = ':';
- sstrncpy (&key[2], name, sizeof (key) - 2);
+ sstrncpy(&key[2], name, sizeof(key) - 2);
- status = c_avl_get (metrics_tree, key, (void *) &metric);
+ status = c_avl_get(metrics_tree, key, (void *)&metric);
if (status == 0)
- return (metric);
+ return metric;
- key_copy = strdup (key);
- if (key_copy == NULL)
- {
- ERROR ("statsd plugin: strdup failed.");
- return (NULL);
+ key_copy = strdup(key);
+ if (key_copy == NULL) {
+ ERROR("statsd plugin: strdup failed.");
+ return NULL;
}
- metric = calloc (1, sizeof (*metric));
- if (metric == NULL)
- {
- ERROR ("statsd plugin: calloc failed.");
- sfree (key_copy);
- return (NULL);
+ metric = calloc(1, sizeof(*metric));
+ if (metric == NULL) {
+ ERROR("statsd plugin: calloc failed.");
+ sfree(key_copy);
+ return NULL;
}
metric->type = type;
metric->latency = NULL;
metric->set = NULL;
- status = c_avl_insert (metrics_tree, key_copy, metric);
- if (status != 0)
- {
- ERROR ("statsd plugin: c_avl_insert failed.");
- sfree (key_copy);
- sfree (metric);
- return (NULL);
+ status = c_avl_insert(metrics_tree, key_copy, metric);
+ if (status != 0) {
+ ERROR("statsd plugin: c_avl_insert failed.");
+ sfree(key_copy);
+ sfree(metric);
+ return NULL;
}
- return (metric);
+ return metric;
} /* }}} statsd_metric_lookup_unsafe */
-static int statsd_metric_set (char const *name, double value, /* {{{ */
- metric_type_t type)
-{
+static int statsd_metric_set(char const *name, double value, /* {{{ */
+ metric_type_t type) {
statsd_metric_t *metric;
- pthread_mutex_lock (&metrics_lock);
+ pthread_mutex_lock(&metrics_lock);
- metric = statsd_metric_lookup_unsafe (name, type);
- if (metric == NULL)
- {
- pthread_mutex_unlock (&metrics_lock);
- return (-1);
+ metric = statsd_metric_lookup_unsafe(name, type);
+ if (metric == NULL) {
+ pthread_mutex_unlock(&metrics_lock);
+ return -1;
}
metric->value = value;
metric->updates_num++;
- pthread_mutex_unlock (&metrics_lock);
+ pthread_mutex_unlock(&metrics_lock);
- return (0);
+ return 0;
} /* }}} int statsd_metric_set */
-static int statsd_metric_add (char const *name, double delta, /* {{{ */
- metric_type_t type)
-{
+static int statsd_metric_add(char const *name, double delta, /* {{{ */
+ metric_type_t type) {
statsd_metric_t *metric;
- pthread_mutex_lock (&metrics_lock);
+ pthread_mutex_lock(&metrics_lock);
- metric = statsd_metric_lookup_unsafe (name, type);
- if (metric == NULL)
- {
- pthread_mutex_unlock (&metrics_lock);
- return (-1);
+ metric = statsd_metric_lookup_unsafe(name, type);
+ if (metric == NULL) {
+ pthread_mutex_unlock(&metrics_lock);
+ return -1;
}
metric->value += delta;
metric->updates_num++;
- pthread_mutex_unlock (&metrics_lock);
+ pthread_mutex_unlock(&metrics_lock);
- return (0);
+ return 0;
} /* }}} int statsd_metric_add */
-static void statsd_metric_free (statsd_metric_t *metric) /* {{{ */
+static void statsd_metric_free(statsd_metric_t *metric) /* {{{ */
{
if (metric == NULL)
return;
- if (metric->latency != NULL)
- {
- latency_counter_destroy (metric->latency);
+ if (metric->latency != NULL) {
+ latency_counter_destroy(metric->latency);
metric->latency = NULL;
}
- if (metric->set != NULL)
- {
+ if (metric->set != NULL) {
void *key;
void *value;
- while (c_avl_pick (metric->set, &key, &value) == 0)
- {
- sfree (key);
- assert (value == NULL);
+ while (c_avl_pick(metric->set, &key, &value) == 0) {
+ sfree(key);
+ assert(value == NULL);
}
- c_avl_destroy (metric->set);
+ c_avl_destroy(metric->set);
metric->set = NULL;
}
- sfree (metric);
+ sfree(metric);
} /* }}} void statsd_metric_free */
-static int statsd_parse_value (char const *str, value_t *ret_value) /* {{{ */
+static int statsd_parse_value(char const *str, value_t *ret_value) /* {{{ */
{
char *endptr = NULL;
- ret_value->gauge = (gauge_t) strtod (str, &endptr);
+ ret_value->gauge = (gauge_t)strtod(str, &endptr);
if ((str == endptr) || ((endptr != NULL) && (*endptr != 0)))
- return (-1);
+ return -1;
- return (0);
+ return 0;
} /* }}} int statsd_parse_value */
-static int statsd_handle_counter (char const *name, /* {{{ */
- char const *value_str,
- char const *extra)
-{
+static int statsd_handle_counter(char const *name, /* {{{ */
+ char const *value_str, char const *extra) {
value_t value;
value_t scale;
int status;
if ((extra != NULL) && (extra[0] != '@'))
- return (-1);
+ return -1;
scale.gauge = 1.0;
- if (extra != NULL)
- {
- status = statsd_parse_value (extra + 1, &scale);
+ if (extra != NULL) {
+ status = statsd_parse_value(extra + 1, &scale);
if (status != 0)
- return (status);
+ return status;
- if (!isfinite (scale.gauge) || (scale.gauge <= 0.0) || (scale.gauge > 1.0))
- return (-1);
+ if (!isfinite(scale.gauge) || (scale.gauge <= 0.0) || (scale.gauge > 1.0))
+ return -1;
}
value.gauge = 1.0;
- status = statsd_parse_value (value_str, &value);
+ status = statsd_parse_value(value_str, &value);
if (status != 0)
- return (status);
+ return status;
/* Changes to the counter are added to (statsd_metric_t*)->value. ->counter is
* only updated in statsd_metric_submit_unsafe(). */
- return (statsd_metric_add (name, (double) (value.gauge / scale.gauge),
- STATSD_COUNTER));
+ return statsd_metric_add(name, (double)(value.gauge / scale.gauge),
+ STATSD_COUNTER);
} /* }}} int statsd_handle_counter */
-static int statsd_handle_gauge (char const *name, /* {{{ */
- char const *value_str)
-{
+static int statsd_handle_gauge(char const *name, /* {{{ */
+ char const *value_str) {
value_t value;
int status;
value.gauge = 0;
- status = statsd_parse_value (value_str, &value);
+ status = statsd_parse_value(value_str, &value);
if (status != 0)
- return (status);
+ return status;
if ((value_str[0] == '+') || (value_str[0] == '-'))
- return (statsd_metric_add (name, (double) value.gauge, STATSD_GAUGE));
+ return statsd_metric_add(name, (double)value.gauge, STATSD_GAUGE);
else
- return (statsd_metric_set (name, (double) value.gauge, STATSD_GAUGE));
+ return statsd_metric_set(name, (double)value.gauge, STATSD_GAUGE);
} /* }}} int statsd_handle_gauge */
-static int statsd_handle_timer (char const *name, /* {{{ */
- char const *value_str,
- char const *extra)
-{
+static int statsd_handle_timer(char const *name, /* {{{ */
+ char const *value_str, char const *extra) {
statsd_metric_t *metric;
value_t value_ms;
value_t scale;
int status;
if ((extra != NULL) && (extra[0] != '@'))
- return (-1);
+ return -1;
scale.gauge = 1.0;
- if (extra != NULL)
- {
- status = statsd_parse_value (extra + 1, &scale);
+ if (extra != NULL) {
+ status = statsd_parse_value(extra + 1, &scale);
if (status != 0)
- return (status);
+ return status;
- if (!isfinite (scale.gauge) || (scale.gauge <= 0.0) || (scale.gauge > 1.0))
- return (-1);
+ if (!isfinite(scale.gauge) || (scale.gauge <= 0.0) || (scale.gauge > 1.0))
+ return -1;
}
value_ms.derive = 0;
- status = statsd_parse_value (value_str, &value_ms);
+ status = statsd_parse_value(value_str, &value_ms);
if (status != 0)
- return (status);
+ return status;
- value = MS_TO_CDTIME_T (value_ms.gauge / scale.gauge);
+ value = MS_TO_CDTIME_T(value_ms.gauge / scale.gauge);
- pthread_mutex_lock (&metrics_lock);
+ pthread_mutex_lock(&metrics_lock);
- metric = statsd_metric_lookup_unsafe (name, STATSD_TIMER);
- if (metric == NULL)
- {
- pthread_mutex_unlock (&metrics_lock);
- return (-1);
+ metric = statsd_metric_lookup_unsafe(name, STATSD_TIMER);
+ if (metric == NULL) {
+ pthread_mutex_unlock(&metrics_lock);
+ return -1;
}
if (metric->latency == NULL)
- metric->latency = latency_counter_create ();
- if (metric->latency == NULL)
- {
- pthread_mutex_unlock (&metrics_lock);
- return (-1);
+ metric->latency = latency_counter_create();
+ if (metric->latency == NULL) {
+ pthread_mutex_unlock(&metrics_lock);
+ return -1;
}
- latency_counter_add (metric->latency, value);
+ latency_counter_add(metric->latency, value);
metric->updates_num++;
- pthread_mutex_unlock (&metrics_lock);
- return (0);
+ pthread_mutex_unlock(&metrics_lock);
+ return 0;
} /* }}} int statsd_handle_timer */
-static int statsd_handle_set (char const *name, /* {{{ */
- char const *set_key_orig)
-{
+static int statsd_handle_set(char const *name, /* {{{ */
+ char const *set_key_orig) {
statsd_metric_t *metric = NULL;
char *set_key;
int status;
- pthread_mutex_lock (&metrics_lock);
+ pthread_mutex_lock(&metrics_lock);
- metric = statsd_metric_lookup_unsafe (name, STATSD_SET);
- if (metric == NULL)
- {
- pthread_mutex_unlock (&metrics_lock);
- return (-1);
+ metric = statsd_metric_lookup_unsafe(name, STATSD_SET);
+ if (metric == NULL) {
+ pthread_mutex_unlock(&metrics_lock);
+ return -1;
}
/* Make sure metric->set exists. */
if (metric->set == NULL)
- metric->set = c_avl_create ((int (*) (const void *, const void *)) strcmp);
+ metric->set = c_avl_create((int (*)(const void *, const void *))strcmp);
- if (metric->set == NULL)
- {
- pthread_mutex_unlock (&metrics_lock);
- ERROR ("statsd plugin: c_avl_create failed.");
- return (-1);
+ if (metric->set == NULL) {
+ pthread_mutex_unlock(&metrics_lock);
+ ERROR("statsd plugin: c_avl_create failed.");
+ return -1;
}
- set_key = strdup (set_key_orig);
- if (set_key == NULL)
- {
- pthread_mutex_unlock (&metrics_lock);
- ERROR ("statsd plugin: strdup failed.");
- return (-1);
+ set_key = strdup(set_key_orig);
+ if (set_key == NULL) {
+ pthread_mutex_unlock(&metrics_lock);
+ ERROR("statsd plugin: strdup failed.");
+ return -1;
}
- status = c_avl_insert (metric->set, set_key, /* value = */ NULL);
- if (status < 0)
- {
- pthread_mutex_unlock (&metrics_lock);
+ status = c_avl_insert(metric->set, set_key, /* value = */ NULL);
+ if (status < 0) {
+ pthread_mutex_unlock(&metrics_lock);
if (status < 0)
- ERROR ("statsd plugin: c_avl_insert (\"%s\") failed with status %i.",
- set_key, status);
- sfree (set_key);
- return (-1);
- }
- else if (status > 0) /* key already exists */
+ ERROR("statsd plugin: c_avl_insert (\"%s\") failed with status %i.",
+ set_key, status);
+ sfree(set_key);
+ return -1;
+ } else if (status > 0) /* key already exists */
{
- sfree (set_key);
+ sfree(set_key);
}
metric->updates_num++;
- pthread_mutex_unlock (&metrics_lock);
- return (0);
+ pthread_mutex_unlock(&metrics_lock);
+ return 0;
} /* }}} int statsd_handle_set */
-static int statsd_parse_line (char *buffer) /* {{{ */
+static int statsd_parse_line(char *buffer) /* {{{ */
{
char *name = buffer;
char *value;
char *type;
char *extra;
- type = strchr (name, '|');
+ type = strchr(name, '|');
if (type == NULL)
- return (-1);
+ return -1;
*type = 0;
type++;
- value = strrchr (name, ':');
+ value = strrchr(name, ':');
if (value == NULL)
- return (-1);
+ return -1;
*value = 0;
value++;
- extra = strchr (type, '|');
- if (extra != NULL)
- {
+ extra = strchr(type, '|');
+ if (extra != NULL) {
*extra = 0;
extra++;
}
- if (strcmp ("c", type) == 0)
- return (statsd_handle_counter (name, value, extra));
- else if (strcmp ("ms", type) == 0)
- return (statsd_handle_timer (name, value, extra));
+ if (strcmp("c", type) == 0)
+ return statsd_handle_counter(name, value, extra);
+ else if (strcmp("ms", type) == 0)
+ return statsd_handle_timer(name, value, extra);
/* extra is only valid for counters and timers */
if (extra != NULL)
- return (-1);
+ return -1;
- if (strcmp ("g", type) == 0)
- return (statsd_handle_gauge (name, value));
- else if (strcmp ("s", type) == 0)
- return (statsd_handle_set (name, value));
+ if (strcmp("g", type) == 0)
+ return statsd_handle_gauge(name, value);
+ else if (strcmp("s", type) == 0)
+ return statsd_handle_set(name, value);
else
- return (-1);
+ return -1;
} /* }}} void statsd_parse_line */
-static void statsd_parse_buffer (char *buffer) /* {{{ */
+static void statsd_parse_buffer(char *buffer) /* {{{ */
{
- while (buffer != NULL)
- {
+ while (buffer != NULL) {
char orig[64];
char *next;
int status;
- next = strchr (buffer, '\n');
- if (next != NULL)
- {
+ next = strchr(buffer, '\n');
+ if (next != NULL) {
*next = 0;
next++;
}
- if (*buffer == 0)
- {
+ if (*buffer == 0) {
buffer = next;
continue;
}
- sstrncpy (orig, buffer, sizeof (orig));
+ sstrncpy(orig, buffer, sizeof(orig));
- status = statsd_parse_line (buffer);
+ status = statsd_parse_line(buffer);
if (status != 0)
- ERROR ("statsd plugin: Unable to parse line: \"%s\"", orig);
+ ERROR("statsd plugin: Unable to parse line: \"%s\"", orig);
buffer = next;
}
} /* }}} void statsd_parse_buffer */
-static void statsd_network_read (int fd) /* {{{ */
+static void statsd_network_read(int fd) /* {{{ */
{
char buffer[4096];
size_t buffer_size;
ssize_t status;
- status = recv (fd, buffer, sizeof (buffer), /* flags = */ MSG_DONTWAIT);
- if (status < 0)
- {
+ status = recv(fd, buffer, sizeof(buffer), /* flags = */ MSG_DONTWAIT);
+ if (status < 0) {
char errbuf[1024];
if ((errno == EAGAIN) || (errno == EWOULDBLOCK))
return;
- ERROR ("statsd plugin: recv(2) failed: %s",
- sstrerror (errno, errbuf, sizeof (errbuf)));
+ ERROR("statsd plugin: recv(2) failed: %s",
+ sstrerror(errno, errbuf, sizeof(errbuf)));
return;
}
- buffer_size = (size_t) status;
- if (buffer_size >= sizeof (buffer))
- buffer_size = sizeof (buffer) - 1;
+ buffer_size = (size_t)status;
+ if (buffer_size >= sizeof(buffer))
+ buffer_size = sizeof(buffer) - 1;
buffer[buffer_size] = 0;
- statsd_parse_buffer (buffer);
+ statsd_parse_buffer(buffer);
} /* }}} void statsd_network_read */
-static int statsd_network_init (struct pollfd **ret_fds, /* {{{ */
- size_t *ret_fds_num)
-{
+static int statsd_network_init(struct pollfd **ret_fds, /* {{{ */
+ size_t *ret_fds_num) {
struct pollfd *fds = NULL;
size_t fds_num = 0;
int status;
char const *node = (conf_node != NULL) ? conf_node : STATSD_DEFAULT_NODE;
- char const *service = (conf_service != NULL)
- ? conf_service : STATSD_DEFAULT_SERVICE;
+ char const *service =
+ (conf_service != NULL) ? conf_service : STATSD_DEFAULT_SERVICE;
- struct addrinfo ai_hints = {
- .ai_family = AF_UNSPEC,
- .ai_flags = AI_PASSIVE | AI_ADDRCONFIG,
- .ai_socktype = SOCK_DGRAM
- };
+ struct addrinfo ai_hints = {.ai_family = AF_UNSPEC,
+ .ai_flags = AI_PASSIVE | AI_ADDRCONFIG,
+ .ai_socktype = SOCK_DGRAM};
- status = getaddrinfo (node, service, &ai_hints, &ai_list);
- if (status != 0)
- {
- ERROR ("statsd plugin: getaddrinfo (\"%s\", \"%s\") failed: %s",
- node, service, gai_strerror (status));
- return (status);
+ status = getaddrinfo(node, service, &ai_hints, &ai_list);
+ if (status != 0) {
+ ERROR("statsd plugin: getaddrinfo (\"%s\", \"%s\") failed: %s", node,
+ service, gai_strerror(status));
+ return status;
}
- for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL; ai_ptr = ai_ptr->ai_next)
- {
+ for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL;
+ ai_ptr = ai_ptr->ai_next) {
int fd;
struct pollfd *tmp;
char dbg_node[NI_MAXHOST];
char dbg_service[NI_MAXSERV];
- fd = socket (ai_ptr->ai_family, ai_ptr->ai_socktype, ai_ptr->ai_protocol);
- if (fd < 0)
- {
+ fd = socket(ai_ptr->ai_family, ai_ptr->ai_socktype, ai_ptr->ai_protocol);
+ if (fd < 0) {
char errbuf[1024];
- ERROR ("statsd plugin: socket(2) failed: %s",
- sstrerror (errno, errbuf, sizeof (errbuf)));
+ ERROR("statsd plugin: socket(2) failed: %s",
+ sstrerror(errno, errbuf, sizeof(errbuf)));
continue;
}
- getnameinfo (ai_ptr->ai_addr, ai_ptr->ai_addrlen,
- dbg_node, sizeof (dbg_node), dbg_service, sizeof (dbg_service),
- NI_DGRAM | NI_NUMERICHOST | NI_NUMERICSERV);
- DEBUG ("statsd plugin: Trying to bind to [%s]:%s ...", dbg_node, dbg_service);
+ getnameinfo(ai_ptr->ai_addr, ai_ptr->ai_addrlen, dbg_node, sizeof(dbg_node),
+ dbg_service, sizeof(dbg_service),
+ NI_DGRAM | NI_NUMERICHOST | NI_NUMERICSERV);
+ DEBUG("statsd plugin: Trying to bind to [%s]:%s ...", dbg_node,
+ dbg_service);
- status = bind (fd, ai_ptr->ai_addr, ai_ptr->ai_addrlen);
- if (status != 0)
- {
+ status = bind(fd, ai_ptr->ai_addr, ai_ptr->ai_addrlen);
+ if (status != 0) {
char errbuf[1024];
- ERROR ("statsd plugin: bind(2) failed: %s",
- sstrerror (errno, errbuf, sizeof (errbuf)));
- close (fd);
+ ERROR("statsd plugin: bind(2) failed: %s",
+ sstrerror(errno, errbuf, sizeof(errbuf)));
+ close(fd);
continue;
}
- tmp = realloc (fds, sizeof (*fds) * (fds_num + 1));
- if (tmp == NULL)
- {
- ERROR ("statsd plugin: realloc failed.");
- close (fd);
+ tmp = realloc(fds, sizeof(*fds) * (fds_num + 1));
+ if (tmp == NULL) {
+ ERROR("statsd plugin: realloc failed.");
+ close(fd);
continue;
}
fds = tmp;
tmp = fds + fds_num;
fds_num++;
- memset (tmp, 0, sizeof (*tmp));
+ memset(tmp, 0, sizeof(*tmp));
tmp->fd = fd;
tmp->events = POLLIN | POLLPRI;
}
- freeaddrinfo (ai_list);
+ freeaddrinfo(ai_list);
- if (fds_num == 0)
- {
- ERROR ("statsd plugin: Unable to create listening socket for [%s]:%s.",
- (node != NULL) ? node : "::", service);
- return (ENOENT);
+ if (fds_num == 0) {
+ ERROR("statsd plugin: Unable to create listening socket for [%s]:%s.",
+ (node != NULL) ? node : "::", service);
+ return ENOENT;
}
*ret_fds = fds;
*ret_fds_num = fds_num;
- return (0);
+ return 0;
} /* }}} int statsd_network_init */
-static void *statsd_network_thread (void *args) /* {{{ */
+static void *statsd_network_thread(void *args) /* {{{ */
{
struct pollfd *fds = NULL;
size_t fds_num = 0;
int status;
- status = statsd_network_init (&fds, &fds_num);
- if (status != 0)
- {
- ERROR ("statsd plugin: Unable to open listening sockets.");
- pthread_exit ((void *) 0);
+ status = statsd_network_init(&fds, &fds_num);
+ if (status != 0) {
+ ERROR("statsd plugin: Unable to open listening sockets.");
+ pthread_exit((void *)0);
}
- while (!network_thread_shutdown)
- {
- status = poll (fds, (nfds_t) fds_num, /* timeout = */ -1);
- if (status < 0)
- {
+ while (!network_thread_shutdown) {
+ status = poll(fds, (nfds_t)fds_num, /* timeout = */ -1);
+ if (status < 0) {
char errbuf[1024];
if ((errno == EINTR) || (errno == EAGAIN))
continue;
- ERROR ("statsd plugin: poll(2) failed: %s",
- sstrerror (errno, errbuf, sizeof (errbuf)));
+ ERROR("statsd plugin: poll(2) failed: %s",
+ sstrerror(errno, errbuf, sizeof(errbuf)));
break;
}
- for (size_t i = 0; i < fds_num; i++)
- {
+ for (size_t i = 0; i < fds_num; i++) {
if ((fds[i].revents & (POLLIN | POLLPRI)) == 0)
continue;
- statsd_network_read (fds[i].fd);
+ statsd_network_read(fds[i].fd);
fds[i].revents = 0;
}
} /* while (!network_thread_shutdown) */
/* Clean up */
for (size_t i = 0; i < fds_num; i++)
- close (fds[i].fd);
- sfree (fds);
+ close(fds[i].fd);
+ sfree(fds);
- return ((void *) 0);
+ return (void *)0;
} /* }}} void *statsd_network_thread */
-static int statsd_config_timer_percentile (oconfig_item_t *ci) /* {{{ */
+static int statsd_config_timer_percentile(oconfig_item_t *ci) /* {{{ */
{
double percent = NAN;
double *tmp;
int status;
- status = cf_util_get_double (ci, &percent);
+ status = cf_util_get_double(ci, &percent);
if (status != 0)
- return (status);
+ return status;
- if ((percent <= 0.0) || (percent >= 100))
- {
- ERROR ("statsd plugin: The value for \"%s\" must be between 0 and 100, "
- "exclusively.", ci->key);
- return (ERANGE);
+ if ((percent <= 0.0) || (percent >= 100)) {
+ ERROR("statsd plugin: The value for \"%s\" must be between 0 and 100, "
+ "exclusively.",
+ ci->key);
+ return ERANGE;
}
- tmp = realloc (conf_timer_percentile,
- sizeof (*conf_timer_percentile) * (conf_timer_percentile_num + 1));
- if (tmp == NULL)
- {
- ERROR ("statsd plugin: realloc failed.");
- return (ENOMEM);
+ tmp =
+ realloc(conf_timer_percentile,
+ sizeof(*conf_timer_percentile) * (conf_timer_percentile_num + 1));
+ if (tmp == NULL) {
+ ERROR("statsd plugin: realloc failed.");
+ return ENOMEM;
}
conf_timer_percentile = tmp;
conf_timer_percentile[conf_timer_percentile_num] = percent;
conf_timer_percentile_num++;
- return (0);
+ return 0;
} /* }}} int statsd_config_timer_percentile */
-static int statsd_config (oconfig_item_t *ci) /* {{{ */
+static int statsd_config(oconfig_item_t *ci) /* {{{ */
{
- for (int i = 0; i < ci->children_num; i++)
- {
+ for (int i = 0; i < ci->children_num; i++) {
oconfig_item_t *child = ci->children + i;
- if (strcasecmp ("Host", child->key) == 0)
- cf_util_get_string (child, &conf_node);
- else if (strcasecmp ("Port", child->key) == 0)
- cf_util_get_service (child, &conf_service);
- else if (strcasecmp ("DeleteCounters", child->key) == 0)
- cf_util_get_boolean (child, &conf_delete_counters);
- else if (strcasecmp ("DeleteTimers", child->key) == 0)
- cf_util_get_boolean (child, &conf_delete_timers);
- else if (strcasecmp ("DeleteGauges", child->key) == 0)
- cf_util_get_boolean (child, &conf_delete_gauges);
- else if (strcasecmp ("DeleteSets", child->key) == 0)
- cf_util_get_boolean (child, &conf_delete_sets);
- else if (strcasecmp ("CounterSum", child->key) == 0)
- cf_util_get_boolean (child, &conf_counter_sum);
- else if (strcasecmp ("TimerLower", child->key) == 0)
- cf_util_get_boolean (child, &conf_timer_lower);
- else if (strcasecmp ("TimerUpper", child->key) == 0)
- cf_util_get_boolean (child, &conf_timer_upper);
- else if (strcasecmp ("TimerSum", child->key) == 0)
- cf_util_get_boolean (child, &conf_timer_sum);
- else if (strcasecmp ("TimerCount", child->key) == 0)
- cf_util_get_boolean (child, &conf_timer_count);
- else if (strcasecmp ("TimerPercentile", child->key) == 0)
- statsd_config_timer_percentile (child);
+ if (strcasecmp("Host", child->key) == 0)
+ cf_util_get_string(child, &conf_node);
+ else if (strcasecmp("Port", child->key) == 0)
+ cf_util_get_service(child, &conf_service);
+ else if (strcasecmp("DeleteCounters", child->key) == 0)
+ cf_util_get_boolean(child, &conf_delete_counters);
+ else if (strcasecmp("DeleteTimers", child->key) == 0)
+ cf_util_get_boolean(child, &conf_delete_timers);
+ else if (strcasecmp("DeleteGauges", child->key) == 0)
+ cf_util_get_boolean(child, &conf_delete_gauges);
+ else if (strcasecmp("DeleteSets", child->key) == 0)
+ cf_util_get_boolean(child, &conf_delete_sets);
+ else if (strcasecmp("CounterSum", child->key) == 0)
+ cf_util_get_boolean(child, &conf_counter_sum);
+ else if (strcasecmp("TimerLower", child->key) == 0)
+ cf_util_get_boolean(child, &conf_timer_lower);
+ else if (strcasecmp("TimerUpper", child->key) == 0)
+ cf_util_get_boolean(child, &conf_timer_upper);
+ else if (strcasecmp("TimerSum", child->key) == 0)
+ cf_util_get_boolean(child, &conf_timer_sum);
+ else if (strcasecmp("TimerCount", child->key) == 0)
+ cf_util_get_boolean(child, &conf_timer_count);
+ else if (strcasecmp("TimerPercentile", child->key) == 0)
+ statsd_config_timer_percentile(child);
else
- ERROR ("statsd plugin: The \"%s\" config option is not valid.",
- child->key);
+ ERROR("statsd plugin: The \"%s\" config option is not valid.",
+ child->key);
}
- return (0);
+ return 0;
} /* }}} int statsd_config */
-static int statsd_init (void) /* {{{ */
+static int statsd_init(void) /* {{{ */
{
- pthread_mutex_lock (&metrics_lock);
+ pthread_mutex_lock(&metrics_lock);
if (metrics_tree == NULL)
- metrics_tree = c_avl_create ((int (*) (const void *, const void *)) strcmp);
+ metrics_tree = c_avl_create((int (*)(const void *, const void *))strcmp);
- if (!network_thread_running)
- {
+ if (!network_thread_running) {
int status;
- status = pthread_create (&network_thread,
- /* attr = */ NULL,
- statsd_network_thread,
- /* args = */ NULL);
- if (status != 0)
- {
+ status = pthread_create(&network_thread,
+ /* attr = */ NULL, statsd_network_thread,
+ /* args = */ NULL);
+ if (status != 0) {
char errbuf[1024];
- pthread_mutex_unlock (&metrics_lock);
- ERROR ("statsd plugin: pthread_create failed: %s",
- sstrerror (errno, errbuf, sizeof (errbuf)));
- return (status);
+ pthread_mutex_unlock(&metrics_lock);
+ ERROR("statsd plugin: pthread_create failed: %s",
+ sstrerror(errno, errbuf, sizeof(errbuf)));
+ return status;
}
}
network_thread_running = 1;
- pthread_mutex_unlock (&metrics_lock);
+ pthread_mutex_unlock(&metrics_lock);
- return (0);
+ return 0;
} /* }}} int statsd_init */
/* Must hold metrics_lock when calling this function. */
-static int statsd_metric_clear_set_unsafe (statsd_metric_t *metric) /* {{{ */
+static int statsd_metric_clear_set_unsafe(statsd_metric_t *metric) /* {{{ */
{
void *key;
void *value;
if ((metric == NULL) || (metric->type != STATSD_SET))
- return (EINVAL);
+ return EINVAL;
if (metric->set == NULL)
- return (0);
+ return 0;
- while (c_avl_pick (metric->set, &key, &value) == 0)
- {
- sfree (key);
- sfree (value);
+ while (c_avl_pick(metric->set, &key, &value) == 0) {
+ sfree(key);
+ sfree(value);
}
- return (0);
+ return 0;
} /* }}} int statsd_metric_clear_set_unsafe */
/* Must hold metrics_lock when calling this function. */
-static int statsd_metric_submit_unsafe (char const *name, statsd_metric_t *metric) /* {{{ */
+static int statsd_metric_submit_unsafe(char const *name,
+ statsd_metric_t *metric) /* {{{ */
{
- value_t values[1];
value_list_t vl = VALUE_LIST_INIT;
- vl.values = values;
+ vl.values = &(value_t){.gauge = NAN};
vl.values_len = 1;
- sstrncpy (vl.host, hostname_g, sizeof (vl.host));
- sstrncpy (vl.plugin, "statsd", sizeof (vl.plugin));
+ sstrncpy(vl.plugin, "statsd", sizeof(vl.plugin));
if (metric->type == STATSD_GAUGE)
- sstrncpy (vl.type, "gauge", sizeof (vl.type));
+ sstrncpy(vl.type, "gauge", sizeof(vl.type));
else if (metric->type == STATSD_TIMER)
- sstrncpy (vl.type, "latency", sizeof (vl.type));
+ sstrncpy(vl.type, "latency", sizeof(vl.type));
else if (metric->type == STATSD_SET)
- sstrncpy (vl.type, "objects", sizeof (vl.type));
+ sstrncpy(vl.type, "objects", sizeof(vl.type));
else /* if (metric->type == STATSD_COUNTER) */
- sstrncpy (vl.type, "derive", sizeof (vl.type));
+ sstrncpy(vl.type, "derive", sizeof(vl.type));
- sstrncpy (vl.type_instance, name, sizeof (vl.type_instance));
+ sstrncpy(vl.type_instance, name, sizeof(vl.type_instance));
if (metric->type == STATSD_GAUGE)
- values[0].gauge = (gauge_t) metric->value;
- else if (metric->type == STATSD_TIMER)
- {
+ vl.values[0].gauge = (gauge_t)metric->value;
+ else if (metric->type == STATSD_TIMER) {
_Bool have_events = (metric->updates_num > 0);
/* Make sure all timer metrics share the *same* timestamp. */
- vl.time = cdtime ();
+ vl.time = cdtime();
- ssnprintf (vl.type_instance, sizeof (vl.type_instance),
- "%s-average", name);
- values[0].gauge = have_events
- ? CDTIME_T_TO_DOUBLE (latency_counter_get_average (metric->latency))
- : NAN;
- plugin_dispatch_values (&vl);
+ snprintf(vl.type_instance, sizeof(vl.type_instance), "%s-average", name);
+ vl.values[0].gauge =
+ have_events
+ ? CDTIME_T_TO_DOUBLE(latency_counter_get_average(metric->latency))
+ : NAN;
+ plugin_dispatch_values(&vl);
if (conf_timer_lower) {
- ssnprintf (vl.type_instance, sizeof (vl.type_instance),
- "%s-lower", name);
- values[0].gauge = have_events
- ? CDTIME_T_TO_DOUBLE (latency_counter_get_min (metric->latency))
- : NAN;
- plugin_dispatch_values (&vl);
+ snprintf(vl.type_instance, sizeof(vl.type_instance), "%s-lower", name);
+ vl.values[0].gauge =
+ have_events
+ ? CDTIME_T_TO_DOUBLE(latency_counter_get_min(metric->latency))
+ : NAN;
+ plugin_dispatch_values(&vl);
}
if (conf_timer_upper) {
- ssnprintf (vl.type_instance, sizeof (vl.type_instance),
- "%s-upper", name);
- values[0].gauge = have_events
- ? CDTIME_T_TO_DOUBLE (latency_counter_get_max (metric->latency))
- : NAN;
- plugin_dispatch_values (&vl);
+ snprintf(vl.type_instance, sizeof(vl.type_instance), "%s-upper", name);
+ vl.values[0].gauge =
+ have_events
+ ? CDTIME_T_TO_DOUBLE(latency_counter_get_max(metric->latency))
+ : NAN;
+ plugin_dispatch_values(&vl);
}
if (conf_timer_sum) {
- ssnprintf (vl.type_instance, sizeof (vl.type_instance),
- "%s-sum", name);
- values[0].gauge = have_events
- ? CDTIME_T_TO_DOUBLE (latency_counter_get_sum (metric->latency))
- : NAN;
- plugin_dispatch_values (&vl);
+ snprintf(vl.type_instance, sizeof(vl.type_instance), "%s-sum", name);
+ vl.values[0].gauge =
+ have_events
+ ? CDTIME_T_TO_DOUBLE(latency_counter_get_sum(metric->latency))
+ : NAN;
+ plugin_dispatch_values(&vl);
}
- for (size_t i = 0; i < conf_timer_percentile_num; i++)
- {
- ssnprintf (vl.type_instance, sizeof (vl.type_instance),
- "%s-percentile-%.0f", name, conf_timer_percentile[i]);
- values[0].gauge = have_events
- ? CDTIME_T_TO_DOUBLE (latency_counter_get_percentile (metric->latency, conf_timer_percentile[i]))
- : NAN;
- plugin_dispatch_values (&vl);
+ for (size_t i = 0; i < conf_timer_percentile_num; i++) {
+ snprintf(vl.type_instance, sizeof(vl.type_instance), "%s-percentile-%.0f",
+ name, conf_timer_percentile[i]);
+ vl.values[0].gauge =
+ have_events ? CDTIME_T_TO_DOUBLE(latency_counter_get_percentile(
+ metric->latency, conf_timer_percentile[i]))
+ : NAN;
+ plugin_dispatch_values(&vl);
}
/* Keep this at the end, since vl.type is set to "gauge" here. The
* vl.type's above are implicitly set to "latency". */
if (conf_timer_count) {
- sstrncpy (vl.type, "gauge", sizeof (vl.type));
- ssnprintf (vl.type_instance, sizeof (vl.type_instance),
- "%s-count", name);
- values[0].gauge = latency_counter_get_num (metric->latency);
- plugin_dispatch_values (&vl);
+ sstrncpy(vl.type, "gauge", sizeof(vl.type));
+ snprintf(vl.type_instance, sizeof(vl.type_instance), "%s-count", name);
+ vl.values[0].gauge = latency_counter_get_num(metric->latency);
+ plugin_dispatch_values(&vl);
}
- latency_counter_reset (metric->latency);
- return (0);
- }
- else if (metric->type == STATSD_SET)
- {
+ latency_counter_reset(metric->latency);
+ return 0;
+ } else if (metric->type == STATSD_SET) {
if (metric->set == NULL)
- values[0].gauge = 0.0;
+ vl.values[0].gauge = 0.0;
else
- values[0].gauge = (gauge_t) c_avl_size (metric->set);
- }
- else { /* STATSD_COUNTER */
- gauge_t delta = nearbyint (metric->value);
+ vl.values[0].gauge = (gauge_t)c_avl_size(metric->set);
+ } else { /* STATSD_COUNTER */
+ gauge_t delta = nearbyint(metric->value);
/* Etsy's statsd writes counters as two metrics: a rate and the change since
* the last write. Since collectd does not reset its DERIVE metrics to zero,
* this makes little sense, but we're dispatching a "count" metric here
* anyway - if requested by the user - for compatibility reasons. */
- if (conf_counter_sum)
- {
- sstrncpy (vl.type, "count", sizeof (vl.type));
- values[0].gauge = delta;
- plugin_dispatch_values (&vl);
+ if (conf_counter_sum) {
+ sstrncpy(vl.type, "count", sizeof(vl.type));
+ vl.values[0].gauge = delta;
+ plugin_dispatch_values(&vl);
/* restore vl.type */
- sstrncpy (vl.type, "derive", sizeof (vl.type));
+ sstrncpy(vl.type, "derive", sizeof(vl.type));
}
/* Rather than resetting value to zero, subtract delta so we correctly keep
* track of residuals. */
- metric->value -= delta;
- metric->counter += (derive_t) delta;
+ metric->value -= delta;
+ metric->counter += (derive_t)delta;
- values[0].derive = metric->counter;
+ vl.values[0].derive = metric->counter;
}
- return (plugin_dispatch_values (&vl));
+ return plugin_dispatch_values(&vl);
} /* }}} int statsd_metric_submit_unsafe */
-static int statsd_read (void) /* {{{ */
+static int statsd_read(void) /* {{{ */
{
c_avl_iterator_t *iter;
char *name;
char **to_be_deleted = NULL;
size_t to_be_deleted_num = 0;
- pthread_mutex_lock (&metrics_lock);
+ pthread_mutex_lock(&metrics_lock);
- if (metrics_tree == NULL)
- {
- pthread_mutex_unlock (&metrics_lock);
- return (0);
+ if (metrics_tree == NULL) {
+ pthread_mutex_unlock(&metrics_lock);
+ return 0;
}
- iter = c_avl_get_iterator (metrics_tree);
- while (c_avl_iterator_next (iter, (void *) &name, (void *) &metric) == 0)
- {
- if ((metric->updates_num == 0)
- && ((conf_delete_counters && (metric->type == STATSD_COUNTER))
- || (conf_delete_timers && (metric->type == STATSD_TIMER))
- || (conf_delete_gauges && (metric->type == STATSD_GAUGE))
- || (conf_delete_sets && (metric->type == STATSD_SET))))
- {
- DEBUG ("statsd plugin: Deleting metric \"%s\".", name);
- strarray_add (&to_be_deleted, &to_be_deleted_num, name);
+ iter = c_avl_get_iterator(metrics_tree);
+ while (c_avl_iterator_next(iter, (void *)&name, (void *)&metric) == 0) {
+ if ((metric->updates_num == 0) &&
+ ((conf_delete_counters && (metric->type == STATSD_COUNTER)) ||
+ (conf_delete_timers && (metric->type == STATSD_TIMER)) ||
+ (conf_delete_gauges && (metric->type == STATSD_GAUGE)) ||
+ (conf_delete_sets && (metric->type == STATSD_SET)))) {
+ DEBUG("statsd plugin: Deleting metric \"%s\".", name);
+ strarray_add(&to_be_deleted, &to_be_deleted_num, name);
continue;
}
/* Names have a prefix, e.g. "c:", which determines the (statsd) type.
* Remove this here. */
- statsd_metric_submit_unsafe (name + 2, metric);
+ statsd_metric_submit_unsafe(name + 2, metric);
/* Reset the metric. */
metric->updates_num = 0;
if (metric->type == STATSD_SET)
- statsd_metric_clear_set_unsafe (metric);
+ statsd_metric_clear_set_unsafe(metric);
}
- c_avl_iterator_destroy (iter);
+ c_avl_iterator_destroy(iter);
- for (size_t i = 0; i < to_be_deleted_num; i++)
- {
+ for (size_t i = 0; i < to_be_deleted_num; i++) {
int status;
- status = c_avl_remove (metrics_tree, to_be_deleted[i],
- (void *) &name, (void *) &metric);
- if (status != 0)
- {
- ERROR ("stats plugin: c_avl_remove (\"%s\") failed with status %i.",
- to_be_deleted[i], status);
+ status = c_avl_remove(metrics_tree, to_be_deleted[i], (void *)&name,
+ (void *)&metric);
+ if (status != 0) {
+ ERROR("stats plugin: c_avl_remove (\"%s\") failed with status %i.",
+ to_be_deleted[i], status);
continue;
}
- sfree (name);
- statsd_metric_free (metric);
+ sfree(name);
+ statsd_metric_free(metric);
}
- pthread_mutex_unlock (&metrics_lock);
+ pthread_mutex_unlock(&metrics_lock);
- strarray_free (to_be_deleted, to_be_deleted_num);
+ strarray_free(to_be_deleted, to_be_deleted_num);
- return (0);
+ return 0;
} /* }}} int statsd_read */
-static int statsd_shutdown (void) /* {{{ */
+static int statsd_shutdown(void) /* {{{ */
{
void *key;
void *value;
- if (network_thread_running)
- {
+ if (network_thread_running) {
network_thread_shutdown = 1;
- pthread_kill (network_thread, SIGTERM);
- pthread_join (network_thread, /* retval = */ NULL);
+ pthread_kill(network_thread, SIGTERM);
+ pthread_join(network_thread, /* retval = */ NULL);
}
network_thread_running = 0;
- pthread_mutex_lock (&metrics_lock);
+ pthread_mutex_lock(&metrics_lock);
- while (c_avl_pick (metrics_tree, &key, &value) == 0)
- {
- sfree (key);
- statsd_metric_free (value);
+ while (c_avl_pick(metrics_tree, &key, &value) == 0) {
+ sfree(key);
+ statsd_metric_free(value);
}
- c_avl_destroy (metrics_tree);
+ c_avl_destroy(metrics_tree);
metrics_tree = NULL;
- sfree (conf_node);
- sfree (conf_service);
+ sfree(conf_node);
+ sfree(conf_service);
- pthread_mutex_unlock (&metrics_lock);
+ pthread_mutex_unlock(&metrics_lock);
- return (0);
+ return 0;
} /* }}} int statsd_shutdown */
-void module_register (void)
-{
- plugin_register_complex_config ("statsd", statsd_config);
- plugin_register_init ("statsd", statsd_init);
- plugin_register_read ("statsd", statsd_read);
- plugin_register_shutdown ("statsd", statsd_shutdown);
+void module_register(void) {
+ plugin_register_complex_config("statsd", statsd_config);
+ plugin_register_init("statsd", statsd_init);
+ plugin_register_read("statsd", statsd_read);
+ plugin_register_shutdown("statsd", statsd_shutdown);
}
-
-/* vim: set sw=2 sts=2 et fdm=marker : */