diff options
-rw-r--r-- | include/asterisk/statsd.h | 48 | ||||
-rw-r--r-- | res/res_statsd.c | 48 |
2 files changed, 94 insertions, 2 deletions
diff --git a/include/asterisk/statsd.h b/include/asterisk/statsd.h index a04407f89..c4ecce8f6 100644 --- a/include/asterisk/statsd.h +++ b/include/asterisk/statsd.h @@ -57,9 +57,31 @@ AST_OPTIONAL_API(void, ast_statsd_log_string, (const char *metric_name, /*! * \brief Send a stat to the configured statsd server. + * \since 13.7.0 * - * The is the most flexible function for sending a message to the statsd server, - * but also the least easy to use. See ast_statsd_log() or + * This is the most flexible function for sending a message to the statsd + * server. In addition to allowing the string value and sample rate to be specified, + * the metric_name can be formed as a printf style string with variable + * arguments. + * + * \param metric_name Format string (UTF-8) specifying the name of the metric. + * \param metric_type Type of metric to send. + * \param value Value to send. + * \param sample_rate Percentage of samples to send. + * + * Example Usage: + * \code + * ast_statsd_log_string_va(AST_STATSD_GUAGE, "+1", 1.0, "endpoints.states.%s", state_name); + * \endcode + */ +AST_OPTIONAL_API_ATTR(void, format(printf, 1, 5), ast_statsd_log_string_va, + (const char *metric_name, const char *metric_type, const char *value, double sample_rate, ...), {}); + +/*! + * \brief Send a stat to the configured statsd server. + * + * The is nearly the most flexible function for sending a message to the statsd + * server, but also the least easy to use. See ast_statsd_log() or * ast_statsd_log_sample() for a slightly more convenient interface. * * \param metric_name String (UTF-8) name of the metric. @@ -73,6 +95,28 @@ AST_OPTIONAL_API(void, ast_statsd_log_full, (const char *metric_name, /*! * \brief Send a stat to the configured statsd server. + * \since 13.7.0 + * + * This is the most flexible function for sending a message to the statsd + * server. In addition to allowing the value and sample rate to be specified, + * the metric_name can be formed as a printf style string with variable + * arguments. + * + * \param metric_name Format string (UTF-8) specifying the name of the metric. + * \param metric_type Type of metric to send. + * \param value Value to send. + * \param sample_rate Percentage of samples to send. + * + * Example Usage: + * \code + * ast_statsd_log_full_va(AST_STATSD_TIMER, rtt, 1.0, "endpoint.%s.rtt", endpoint_name); + * \endcode + */ +AST_OPTIONAL_API_ATTR(void, format(printf, 1, 5), ast_statsd_log_full_va, + (const char *metric_name, const char *metric_type, intmax_t value, double sample_rate, ...), {}); + +/*! + * \brief Send a stat to the configured statsd server. * \param metric_name String (UTF-8) name of the metric. * \param metric_type Type of metric to send. * \param value Value to send. diff --git a/res/res_statsd.c b/res/res_statsd.c index 8bf74db09..f3a64e0f8 100644 --- a/res/res_statsd.c +++ b/res/res_statsd.c @@ -160,6 +160,54 @@ void AST_OPTIONAL_API_NAME(ast_statsd_log_full)(const char *metric_name, } +AST_THREADSTORAGE(statsd_buf); + +void AST_OPTIONAL_API_NAME(ast_statsd_log_string_va)(const char *metric_name, + const char *metric_type, const char *value, double sample_rate, ...) +{ + struct ast_str *buf; + va_list ap; + int res; + + buf = ast_str_thread_get(&statsd_buf, 128); + if (!buf) { + return; + } + + va_start(ap, sample_rate); + res = ast_str_set_va(&buf, 0, metric_name, ap); + va_end(ap); + + if (res == AST_DYNSTR_BUILD_FAILED) { + return; + } + + ast_statsd_log_string(ast_str_buffer(buf), metric_type, value, sample_rate); +} + +void AST_OPTIONAL_API_NAME(ast_statsd_log_full_va)(const char *metric_name, + const char *metric_type, intmax_t value, double sample_rate, ...) +{ + struct ast_str *buf; + va_list ap; + int res; + + buf = ast_str_thread_get(&statsd_buf, 128); + if (!buf) { + return; + } + + va_start(ap, sample_rate); + res = ast_str_set_va(&buf, 0, metric_name, ap); + va_end(ap); + + if (res == AST_DYNSTR_BUILD_FAILED) { + return; + } + + ast_statsd_log_full(ast_str_buffer(buf), metric_type, value, sample_rate); +} + void AST_OPTIONAL_API_NAME(ast_statsd_log)(const char *metric_name, const char *metric_type, intmax_t value) { |