From 1e0040b88f83688e67d71521177cf4fa962bf32a Mon Sep 17 00:00:00 2001 From: tcambron Date: Tue, 3 Nov 2015 14:36:43 -0600 Subject: StatsD: Add res_statsd compatibility Added a new api to res_statsd.c to allow it to receive a character pointer for the value argument. This allows for a '+' and a '-' to easily be sent with the value. ASTERISK-25419 Reported By: Ashley Sanders Change-Id: Id6bb53600943d27347d2bcae26c0bd5643567611 --- include/asterisk/statsd.h | 16 ++++++++++++++++ res/res_statsd.c | 40 +++++++++++++++++++++++++++++----------- res/res_statsd.exports.in | 1 + 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/include/asterisk/statsd.h b/include/asterisk/statsd.h index 8e5e2f987..a04407f89 100644 --- a/include/asterisk/statsd.h +++ b/include/asterisk/statsd.h @@ -39,6 +39,22 @@ /*! Events over time. Sorta like increment-only counters. */ #define AST_STATSD_METER "m" +/*! + * \brief Send a stat to the configured statsd server. + * + * This function uses a character argument for value instead of + * an intmax_t argument. This is designed to be simpler to use for + * updating a current value rather than resetting it. + * + * \param metric_name String (UTF-8) name of the metric. + * \param type_str Type of metric to send. + * \param value Value to send. + * \param sample_rate Percentage of samples to send. + * \since 13 + */ +AST_OPTIONAL_API(void, ast_statsd_log_string, (const char *metric_name, + const char *metric_type, const char *value, double sample_rate), {}); + /*! * \brief Send a stat to the configured statsd server. * diff --git a/res/res_statsd.c b/res/res_statsd.c index 2cbd7f09c..b8b79be07 100644 --- a/res/res_statsd.c +++ b/res/res_statsd.c @@ -97,11 +97,11 @@ static void conf_server(const struct conf *cfg, struct ast_sockaddr *addr) } } -void AST_OPTIONAL_API_NAME(ast_statsd_log_full)(const char *metric_name, - const char *metric_type, intmax_t value, double sample_rate) +void AST_OPTIONAL_API_NAME(ast_statsd_log_string)(const char *metric_name, + const char *metric_type, const char *value, double sample_rate) { - RAII_VAR(struct conf *, cfg, NULL, ao2_cleanup); - RAII_VAR(struct ast_str *, msg, NULL, ast_free); + struct conf *cfg; + struct ast_str *msg; size_t len; struct ast_sockaddr statsd_server; @@ -109,9 +109,6 @@ void AST_OPTIONAL_API_NAME(ast_statsd_log_full)(const char *metric_name, return; } - cfg = ao2_global_obj_ref(confs); - conf_server(cfg, &statsd_server); - /* Rates <= 0.0 never get logged. * Rates >= 1.0 always get logged. * All others leave it to chance. @@ -122,9 +119,11 @@ void AST_OPTIONAL_API_NAME(ast_statsd_log_full)(const char *metric_name, } cfg = ao2_global_obj_ref(confs); + conf_server(cfg, &statsd_server); msg = ast_str_create(40); if (!msg) { + ao2_cleanup(cfg); return; } @@ -132,7 +131,7 @@ void AST_OPTIONAL_API_NAME(ast_statsd_log_full)(const char *metric_name, ast_str_append(&msg, 0, "%s.", cfg->global->prefix); } - ast_str_append(&msg, 0, "%s:%jd|%s", metric_name, value, metric_type); + ast_str_append(&msg, 0, "%s:%s|%s", metric_name, value, metric_type); if (sample_rate < 1.0) { ast_str_append(&msg, 0, "|@%.2f", sample_rate); @@ -144,20 +143,39 @@ void AST_OPTIONAL_API_NAME(ast_statsd_log_full)(const char *metric_name, len = ast_str_strlen(msg); - ast_debug(6, "send: %s\n", ast_str_buffer(msg)); + ast_debug(6, "Sending statistic %s to StatsD server\n", ast_str_buffer(msg)); ast_sendto(socket_fd, ast_str_buffer(msg), len, 0, &statsd_server); + + ao2_cleanup(cfg); + ast_free(msg); +} + +void AST_OPTIONAL_API_NAME(ast_statsd_log_full)(const char *metric_name, + const char *metric_type, intmax_t value, double sample_rate) +{ + char char_value[30]; + snprintf(char_value, sizeof(char_value), "%jd", value); + + ast_statsd_log_string(metric_name, metric_type, char_value, sample_rate); + } void AST_OPTIONAL_API_NAME(ast_statsd_log)(const char *metric_name, const char *metric_type, intmax_t value) { - ast_statsd_log_full(metric_name, metric_type, value, 1.0); + char char_value[30]; + snprintf(char_value, sizeof(char_value), "%jd", value); + + ast_statsd_log_string(metric_name, metric_type, char_value, 1.0); } void AST_OPTIONAL_API_NAME(ast_statsd_log_sample)(const char *metric_name, intmax_t value, double sample_rate) { - ast_statsd_log_full(metric_name, AST_STATSD_COUNTER, value, + char char_value[30]; + snprintf(char_value, sizeof(char_value), "%jd", value); + + ast_statsd_log_string(metric_name, AST_STATSD_COUNTER, char_value, sample_rate); } diff --git a/res/res_statsd.exports.in b/res/res_statsd.exports.in index 6f02b25d6..d4a79c18f 100644 --- a/res/res_statsd.exports.in +++ b/res/res_statsd.exports.in @@ -3,6 +3,7 @@ LINKER_SYMBOL_PREFIX*ast_statsd_log; LINKER_SYMBOL_PREFIX*ast_statsd_log_full; LINKER_SYMBOL_PREFIX*ast_statsd_log_sample; + LINKER_SYMBOL_PREFIX*ast_statsd_log_string; local: *; }; -- cgit v1.2.3