summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortcambron <tcambron@digium.com>2015-11-03 14:36:43 -0600
committerMatt Jordan <mjordan@digium.com>2015-11-18 10:07:19 -0600
commit1e0040b88f83688e67d71521177cf4fa962bf32a (patch)
tree58459df3bec834073e4d72c17f426ffdae0a8f8b
parentccf80f95a21c380fb9e96a367bece411e349edb0 (diff)
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
-rw-r--r--include/asterisk/statsd.h16
-rw-r--r--res/res_statsd.c40
-rw-r--r--res/res_statsd.exports.in1
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
@@ -42,6 +42,22 @@
/*!
* \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.
+ *
* 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
* ast_statsd_log_sample() for a slightly more convenient interface.
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:
*;
};