X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fstatsd.c;h=327b8db476e0b192d0bf12ee13268d6170cbd253;hb=b6fbfb1b864be53e71d755fba59d633f5c30da7e;hp=5af34833fbbbff4cb611f4c5ee0b24d2ace5b305;hpb=ba0be16485d017e2060bc3a1fef2cb0587a5336d;p=collectd.git diff --git a/src/statsd.c b/src/statsd.c index 5af34833..327b8db4 100644 --- a/src/statsd.c +++ b/src/statsd.c @@ -34,6 +34,11 @@ #include #include +/* AIX doesn't have MSG_DONTWAIT */ +#ifndef MSG_DONTWAIT +# define MSG_DONTWAIT MSG_NONBLOCK +#endif + #ifndef STATSD_DEFAULT_NODE # define STATSD_DEFAULT_NODE NULL #endif @@ -79,6 +84,11 @@ static _Bool conf_delete_sets = 0; static double *conf_timer_percentile = NULL; static size_t conf_timer_percentile_num = 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) @@ -240,19 +250,35 @@ static int statsd_handle_gauge (char const *name, /* {{{ */ } /* }}} int statsd_handle_gauge */ static int statsd_handle_timer (char const *name, /* {{{ */ - char const *value_str) + char const *value_str, + char const *extra) { statsd_metric_t *metric; value_t value_ms; + value_t scale; cdtime_t value; int status; + if ((extra != NULL) && (extra[0] != '@')) + return (-1); + + scale.gauge = 1.0; + if (extra != NULL) + { + status = statsd_parse_value (extra + 1, &scale); + if (status != 0) + return (status); + + 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); if (status != 0) return (status); - value = MS_TO_CDTIME_T (value_ms.gauge); + value = MS_TO_CDTIME_T (value_ms.gauge / scale.gauge); pthread_mutex_lock (&metrics_lock); @@ -362,15 +388,15 @@ static int statsd_parse_line (char *buffer) /* {{{ */ 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 */ + /* extra is only valid for counters and timers */ if (extra != NULL) return (-1); if (strcmp ("g", type) == 0) return (statsd_handle_gauge (name, value)); - else if (strcmp ("ms", type) == 0) - return (statsd_handle_timer (name, value)); else if (strcmp ("s", type) == 0) return (statsd_handle_set (name, value)); else @@ -625,6 +651,14 @@ static int statsd_config (oconfig_item_t *ci) /* {{{ */ 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 ("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 @@ -726,6 +760,30 @@ static int statsd_metric_submit_unsafe (char const *name, /* {{{ */ latency_counter_get_average (metric->latency)); plugin_dispatch_values (&vl); + if (conf_timer_lower) { + ssnprintf (vl.type_instance, sizeof (vl.type_instance), + "%s-lower", name); + values[0].gauge = CDTIME_T_TO_DOUBLE ( + latency_counter_get_min (metric->latency)); + plugin_dispatch_values (&vl); + } + + if (conf_timer_upper) { + ssnprintf (vl.type_instance, sizeof (vl.type_instance), + "%s-upper", name); + values[0].gauge = CDTIME_T_TO_DOUBLE ( + latency_counter_get_max (metric->latency)); + plugin_dispatch_values (&vl); + } + + if (conf_timer_sum) { + ssnprintf (vl.type_instance, sizeof (vl.type_instance), + "%s-sum", name); + values[0].gauge = CDTIME_T_TO_DOUBLE ( + latency_counter_get_sum (metric->latency)); + plugin_dispatch_values (&vl); + } + for (i = 0; i < conf_timer_percentile_num; i++) { ssnprintf (vl.type_instance, sizeof (vl.type_instance), @@ -736,6 +794,16 @@ static int statsd_metric_submit_unsafe (char const *name, /* {{{ */ 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); + } + latency_counter_reset (metric->latency); return (0); }