Asterisk - The Open Source Telephony Project  18.5.0
Data Structures | Macros | Functions | Variables
res_statsd.c File Reference
#include "asterisk.h"
#include "asterisk/config_options.h"
#include "asterisk/module.h"
#include "asterisk/netsock2.h"
#include "asterisk/statsd.h"
Include dependency graph for res_statsd.c:

Go to the source code of this file.

Data Structures

struct  conf
 All configuration options for statsd client. More...
 
struct  conf_global_options
 Global configuration options for statsd client. More...
 

Macros

#define AST_API_MODULE
 Support for publishing to a StatsD server. More...
 
#define DEFAULT_STATSD_PORT   8125
 
#define MAX_PREFIX   40
 

Functions

static void __init_statsd_buf (void)
 
static void __reg_module (void)
 
static void __unreg_module (void)
 
static AO2_GLOBAL_OBJ_STATIC (confs)
 Locking container for safe configuration access. More...
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
void AST_OPTIONAL_API_NAME() ast_statsd_log (const char *metric_name, const char *metric_type, intmax_t value)
 Send a stat to the configured statsd server. More...
 
void AST_OPTIONAL_API_NAME() ast_statsd_log_full (const char *metric_name, const char *metric_type, intmax_t value, double sample_rate)
 Send a stat to the configured statsd server. More...
 
void AST_OPTIONAL_API_NAME() ast_statsd_log_full_va (const char *metric_name, const char *metric_type, intmax_t value, double sample_rate,...)
 Send a stat to the configured statsd server. More...
 
void AST_OPTIONAL_API_NAME() ast_statsd_log_sample (const char *metric_name, intmax_t value, double sample_rate)
 Send a random sampling of a stat to the configured statsd server. More...
 
void AST_OPTIONAL_API_NAME() ast_statsd_log_string (const char *metric_name, const char *metric_type, const char *value, double sample_rate)
 Send a stat to the configured statsd server. More...
 
void AST_OPTIONAL_API_NAME() ast_statsd_log_string_va (const char *metric_name, const char *metric_type, const char *value, double sample_rate,...)
 Send a stat to the configured statsd server. More...
 
static void * conf_alloc (void)
 Creates the statis http conf object. More...
 
static void conf_destructor (void *obj)
 Disposes of the statsd conf object. More...
 
static void conf_server (const struct conf *cfg, struct ast_sockaddr *addr)
 
 CONFIG_INFO_STANDARD (cfg_info, confs, conf_alloc,.files=ACO_FILES(&conf_file))
 
static char is_enabled (void)
 Helper function to check if module is enabled. More...
 
static int load_module (void)
 
static int reload_module (void)
 
static int statsd_init (void)
 
static void statsd_shutdown (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "StatsD client support" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_EXTENDED, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_REALTIME_DRIVER + 5, }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct aco_file conf_file
 The conf file that's processed for the module. More...
 
static struct aco_type global_option
 Mapping of the statsd conf struct's globals to the general context in the config file. More...
 
static struct aco_typeglobal_options [] = ACO_TYPES(&global_option)
 
static int socket_fd = -1
 
static struct ast_threadstorage statsd_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_statsd_buf , .custom_init = NULL , }
 

Macro Definition Documentation

◆ AST_API_MODULE

#define AST_API_MODULE

Support for publishing to a StatsD server.

Author
David M. Lee, II dlee@.nosp@m.digi.nosp@m.um.co.nosp@m.m
Since
12

Definition at line 72 of file res_statsd.c.

◆ DEFAULT_STATSD_PORT

#define DEFAULT_STATSD_PORT   8125

Definition at line 75 of file res_statsd.c.

Referenced by conf_server().

◆ MAX_PREFIX

#define MAX_PREFIX   40

Definition at line 77 of file res_statsd.c.

Function Documentation

◆ __init_statsd_buf()

static void __init_statsd_buf ( void  )
static

Definition at line 174 of file res_statsd.c.

178 {

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 427 of file res_statsd.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 427 of file res_statsd.c.

◆ AO2_GLOBAL_OBJ_STATIC()

static AO2_GLOBAL_OBJ_STATIC ( confs  )
static

Locking container for safe configuration access.

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 427 of file res_statsd.c.

◆ ast_statsd_log()

void AST_OPTIONAL_API_NAME() ast_statsd_log ( const char *  metric_name,
const char *  metric_type,
intmax_t  value 
)

Send a stat to the configured statsd server.

Parameters
metric_nameString (UTF-8) name of the metric.
metric_typeType of metric to send.
valueValue to send.
Since
12

Definition at line 222 of file res_statsd.c.

References ast_statsd_log_string(), and value.

Referenced by load_module(), statsmaker(), and updates().

224 {
225  char char_value[30];
226  snprintf(char_value, sizeof(char_value), "%jd", value);
227 
228  ast_statsd_log_string(metric_name, metric_type, char_value, 1.0);
229 }
int value
Definition: syslog.c:37
void AST_OPTIONAL_API_NAME() ast_statsd_log_string(const char *metric_name, const char *metric_type, const char *value, double sample_rate)
Send a stat to the configured statsd server.
Definition: res_statsd.c:111

◆ ast_statsd_log_full()

void AST_OPTIONAL_API_NAME() ast_statsd_log_full ( const char *  metric_name,
const char *  metric_type,
intmax_t  value,
double  sample_rate 
)

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.

Parameters
metric_nameString (UTF-8) name of the metric.
type_strType of metric to send.
valueValue to send.
sample_ratePercentage of samples to send.
Since
12

Definition at line 164 of file res_statsd.c.

References ast_statsd_log_string(), and value.

Referenced by ast_statsd_log_full_va().

166 {
167  char char_value[30];
168  snprintf(char_value, sizeof(char_value), "%jd", value);
169 
170  ast_statsd_log_string(metric_name, metric_type, char_value, sample_rate);
171 
172 }
int value
Definition: syslog.c:37
void AST_OPTIONAL_API_NAME() ast_statsd_log_string(const char *metric_name, const char *metric_type, const char *value, double sample_rate)
Send a stat to the configured statsd server.
Definition: res_statsd.c:111

◆ ast_statsd_log_full_va()

void AST_OPTIONAL_API_NAME() ast_statsd_log_full_va ( const char *  metric_name,
const char *  metric_type,
intmax_t  value,
double  sample_rate,
  ... 
)

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.

Parameters
metric_nameFormat string (UTF-8) specifying the name of the metric.
metric_typeType of metric to send.
valueValue to send.
sample_ratePercentage of samples to send.

Example Usage:

ast_statsd_log_full_va(AST_STATSD_TIMER, rtt, 1.0, "endpoint.%s.rtt", endpoint_name);

Definition at line 199 of file res_statsd.c.

References AST_DYNSTR_BUILD_FAILED, ast_statsd_log_full(), ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), buf, statsd_buf, and value.

Referenced by ast_sip_initialize_sorcery_location(), handle_endpoint_update(), and sip_options_contact_status_notify_task().

201 {
202  struct ast_str *buf;
203  va_list ap;
204  int res;
205 
206  buf = ast_str_thread_get(&statsd_buf, 128);
207  if (!buf) {
208  return;
209  }
210 
211  va_start(ap, sample_rate);
212  res = ast_str_set_va(&buf, 0, metric_name, ap);
213  va_end(ap);
214 
215  if (res == AST_DYNSTR_BUILD_FAILED) {
216  return;
217  }
218 
219  ast_statsd_log_full(ast_str_buffer(buf), metric_type, value, sample_rate);
220 }
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
int ast_str_set_va(struct ast_str **buf, ssize_t max_len, const char *fmt, va_list ap)
Set a dynamic string from a va_list.
Definition: strings.h:982
int value
Definition: syslog.c:37
void AST_OPTIONAL_API_NAME() ast_statsd_log_full(const char *metric_name, const char *metric_type, intmax_t value, double sample_rate)
Send a stat to the configured statsd server.
Definition: res_statsd.c:164
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static struct ast_threadstorage statsd_buf
Definition: res_statsd.c:174
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861

◆ ast_statsd_log_sample()

void AST_OPTIONAL_API_NAME() ast_statsd_log_sample ( const char *  metric_name,
intmax_t  value,
double  sample_rate 
)

Send a random sampling of a stat to the configured statsd server.

The type of sampled metrics is always AST_STATSD_COUNTER. The given sample_rate should be a percentage between 0.0 and 1.0. If it's <= 0.0, then no samples will be sent. If it's >= 1.0, then all samples will be sent.

Parameters
metric_nameString (UTF-8) name of the metric.
valueValue to send.
sample_ratePercentage of samples to send.
Since
12

Definition at line 231 of file res_statsd.c.

References AST_STATSD_COUNTER, ast_statsd_log_string(), and value.

233 {
234  char char_value[30];
235  snprintf(char_value, sizeof(char_value), "%jd", value);
236 
237  ast_statsd_log_string(metric_name, AST_STATSD_COUNTER, char_value,
238  sample_rate);
239 }
int value
Definition: syslog.c:37
void AST_OPTIONAL_API_NAME() ast_statsd_log_string(const char *metric_name, const char *metric_type, const char *value, double sample_rate)
Send a stat to the configured statsd server.
Definition: res_statsd.c:111
#define AST_STATSD_COUNTER
Definition: statsd.h:39

◆ ast_statsd_log_string()

void AST_OPTIONAL_API_NAME() ast_statsd_log_string ( const char *  metric_name,
const char *  metric_type,
const char *  value,
double  sample_rate 
)

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.

Parameters
metric_nameString (UTF-8) name of the metric.
type_strType of metric to send.
valueValue to send.
sample_ratePercentage of samples to send.
Since
13

Definition at line 111 of file res_statsd.c.

References conf_global_options::add_newline, ao2_cleanup, ao2_global_obj_ref, ast_debug, ast_free, ast_random_double, ast_sendto(), ast_str_append(), ast_str_buffer(), ast_str_create, ast_str_strlen(), ast_strlen_zero, conf_server(), conf::global, len(), conf_global_options::prefix, socket_fd, and value.

Referenced by ast_statsd_log(), ast_statsd_log_full(), ast_statsd_log_sample(), ast_statsd_log_string_va(), handle_endpoint_update(), sip_outbound_registration_client_state_destroy(), sip_outbound_registration_state_alloc(), statsd_exec(), update_endpoint_state(), and updates().

113 {
114  struct conf *cfg;
115  struct ast_str *msg;
116  size_t len;
117  struct ast_sockaddr statsd_server;
118 
119  if (socket_fd == -1) {
120  return;
121  }
122 
123  /* Rates <= 0.0 never get logged.
124  * Rates >= 1.0 always get logged.
125  * All others leave it to chance.
126  */
127  if (sample_rate <= 0.0 ||
128  (sample_rate < 1.0 && sample_rate < ast_random_double())) {
129  return;
130  }
131 
132  cfg = ao2_global_obj_ref(confs);
133  conf_server(cfg, &statsd_server);
134 
135  msg = ast_str_create(40);
136  if (!msg) {
137  ao2_cleanup(cfg);
138  return;
139  }
140 
141  if (!ast_strlen_zero(cfg->global->prefix)) {
142  ast_str_append(&msg, 0, "%s.", cfg->global->prefix);
143  }
144 
145  ast_str_append(&msg, 0, "%s:%s|%s", metric_name, value, metric_type);
146 
147  if (sample_rate < 1.0) {
148  ast_str_append(&msg, 0, "|@%.2f", sample_rate);
149  }
150 
151  if (cfg->global->add_newline) {
152  ast_str_append(&msg, 0, "\n");
153  }
154 
155  len = ast_str_strlen(msg);
156 
157  ast_debug(6, "Sending statistic %s to StatsD server\n", ast_str_buffer(msg));
158  ast_sendto(socket_fd, ast_str_buffer(msg), len, 0, &statsd_server);
159 
160  ao2_cleanup(cfg);
161  ast_free(msg);
162 }
ssize_t ast_sendto(int sockfd, const void *buf, size_t len, int flags, const struct ast_sockaddr *dest_addr)
Wrapper around sendto(2) that uses ast_sockaddr.
Definition: netsock2.c:614
struct conf_global_options * global
Definition: res_statsd.c:97
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
#define ao2_global_obj_ref(holder)
Definition: astobj2.h:925
int value
Definition: syslog.c:37
Socket address structure.
Definition: netsock2.h:97
#define ast_strlen_zero(foo)
Definition: strings.h:52
All configuration options for statsd client.
Definition: res_statsd.c:95
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
#define ast_free(a)
Definition: astmm.h:182
size_t ast_str_strlen(const struct ast_str *buf)
Returns the current length of the string stored within buf.
Definition: strings.h:688
char prefix[MAX_PREFIX+1]
Definition: res_statsd.c:91
static int socket_fd
Definition: res_statsd.c:80
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
#define ast_random_double()
Returns a random number between 0.0 and 1.0, inclusive.
Definition: utils.h:599
static void conf_server(const struct conf *cfg, struct ast_sockaddr *addr)
Definition: res_statsd.c:103
#define ast_str_create(init_len)
Create a malloc&#39;ed dynamic length string.
Definition: strings.h:620

◆ ast_statsd_log_string_va()

void AST_OPTIONAL_API_NAME() ast_statsd_log_string_va ( const char *  metric_name,
const char *  metric_type,
const char *  value,
double  sample_rate,
  ... 
)

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 string value and sample rate to be specified, the metric_name can be formed as a printf style string with variable arguments.

Parameters
metric_nameFormat string (UTF-8) specifying the name of the metric.
metric_typeType of metric to send.
valueValue to send.
sample_ratePercentage of samples to send.

Example Usage:

ast_statsd_log_string_va(AST_STATSD_GAUGE, "+1", 1.0, "endpoints.states.%s", state_name);

Definition at line 176 of file res_statsd.c.

References AST_DYNSTR_BUILD_FAILED, ast_statsd_log_string(), ast_str_buffer(), ast_str_set_va(), ast_str_thread_get(), buf, statsd_buf, and value.

Referenced by ast_res_pjsip_find_or_create_contact_status(), sip_options_contact_status_notify_task(), sip_options_remove_contact_status(), sip_options_set_contact_status(), sip_outbound_registration_client_state_destroy(), sip_outbound_registration_state_alloc(), and update_client_state_status().

178 {
179  struct ast_str *buf;
180  va_list ap;
181  int res;
182 
183  buf = ast_str_thread_get(&statsd_buf, 128);
184  if (!buf) {
185  return;
186  }
187 
188  va_start(ap, sample_rate);
189  res = ast_str_set_va(&buf, 0, metric_name, ap);
190  va_end(ap);
191 
192  if (res == AST_DYNSTR_BUILD_FAILED) {
193  return;
194  }
195 
196  ast_statsd_log_string(ast_str_buffer(buf), metric_type, value, sample_rate);
197 }
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
int ast_str_set_va(struct ast_str **buf, ssize_t max_len, const char *fmt, va_list ap)
Set a dynamic string from a va_list.
Definition: strings.h:982
int value
Definition: syslog.c:37
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static struct ast_threadstorage statsd_buf
Definition: res_statsd.c:174
void AST_OPTIONAL_API_NAME() ast_statsd_log_string(const char *metric_name, const char *metric_type, const char *value, double sample_rate)
Send a stat to the configured statsd server.
Definition: res_statsd.c:111
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861

◆ conf_alloc()

static void* conf_alloc ( void  )
static

Creates the statis http conf object.

Definition at line 261 of file res_statsd.c.

References ao2_alloc, ao2_ref, conf_destructor(), conf::global, and NULL.

Referenced by load_module().

262 {
263  struct conf *cfg;
264 
265  if (!(cfg = ao2_alloc(sizeof(*cfg), conf_destructor))) {
266  return NULL;
267  }
268 
269  if (!(cfg->global = ao2_alloc(sizeof(*cfg->global), NULL))) {
270  ao2_ref(cfg, -1);
271  return NULL;
272  }
273  return cfg;
274 }
struct conf_global_options * global
Definition: res_statsd.c:97
#define NULL
Definition: resample.c:96
static void conf_destructor(void *obj)
Disposes of the statsd conf object.
Definition: res_statsd.c:254
All configuration options for statsd client.
Definition: res_statsd.c:95
#define ao2_ref(o, delta)
Definition: astobj2.h:464
#define ao2_alloc(data_size, destructor_fn)
Definition: astobj2.h:411

◆ conf_destructor()

static void conf_destructor ( void *  obj)
static

Disposes of the statsd conf object.

Definition at line 254 of file res_statsd.c.

References ao2_cleanup, and conf::global.

Referenced by conf_alloc().

255 {
256  struct conf *cfg = obj;
257  ao2_cleanup(cfg->global);
258 }
struct conf_global_options * global
Definition: res_statsd.c:97
All configuration options for statsd client.
Definition: res_statsd.c:95
#define ao2_cleanup(obj)
Definition: astobj2.h:1958

◆ conf_server()

static void conf_server ( const struct conf cfg,
struct ast_sockaddr addr 
)
static

Definition at line 103 of file res_statsd.c.

References ast_sockaddr_port, ast_sockaddr_set_port, DEFAULT_STATSD_PORT, conf::global, and conf_global_options::statsd_server.

Referenced by ast_statsd_log_string(), and statsd_init().

104 {
105  *addr = cfg->global->statsd_server;
106  if (ast_sockaddr_port(addr) == 0) {
108  }
109 }
struct conf_global_options * global
Definition: res_statsd.c:97
struct ast_sockaddr statsd_server
Definition: res_statsd.c:89
#define ast_sockaddr_port(addr)
Get the port number of a socket address.
Definition: netsock2.h:521
#define ast_sockaddr_set_port(addr, port)
Sets the port number of a socket address.
Definition: netsock2.h:537
#define DEFAULT_STATSD_PORT
Definition: res_statsd.c:75

◆ CONFIG_INFO_STANDARD()

CONFIG_INFO_STANDARD ( cfg_info  ,
confs  ,
conf_alloc  ,
files = ACO_FILES(&conf_file) 
)

◆ is_enabled()

static char is_enabled ( void  )
static

Helper function to check if module is enabled.

Definition at line 288 of file res_statsd.c.

References ao2_cleanup, ao2_global_obj_ref, and RAII_VAR.

Referenced by load_module(), reload_module(), and statsd_init().

289 {
291  return cfg->global->enabled;
292 }
#define ao2_global_obj_ref(holder)
Definition: astobj2.h:925
All configuration options for statsd client.
Definition: res_statsd.c:95
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
#define ao2_cleanup(obj)
Definition: astobj2.h:1958

◆ load_module()

static int load_module ( void  )
static

Definition at line 340 of file res_statsd.c.

References ACO_EXACT, aco_info_destroy(), aco_info_init(), aco_option_register, aco_process_config(), ACO_PROCESS_ERROR, aco_set_defaults(), conf_global_options::add_newline, ao2_global_obj_replace_unref, ao2_ref, ast_log, AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, CHARFLDSET, conf_alloc(), conf_global_options::enabled, FLDSET, conf::global, is_enabled(), LOG_ERROR, LOG_NOTICE, OPT_BOOL_T, OPT_CHAR_ARRAY_T, OPT_SOCKADDR_T, conf_global_options::prefix, statsd_init(), conf_global_options::statsd_server, and unload_module().

Referenced by reload_module().

341 {
342  if (aco_info_init(&cfg_info)) {
343  aco_info_destroy(&cfg_info);
345  }
346 
347  aco_option_register(&cfg_info, "enabled", ACO_EXACT, global_options,
348  "no", OPT_BOOL_T, 1,
350 
351  aco_option_register(&cfg_info, "add_newline", ACO_EXACT, global_options,
352  "no", OPT_BOOL_T, 1,
353  FLDSET(struct conf_global_options, add_newline));
354 
355  aco_option_register(&cfg_info, "server", ACO_EXACT, global_options,
356  "127.0.0.1", OPT_SOCKADDR_T, 0,
357  FLDSET(struct conf_global_options, statsd_server));
358 
359  aco_option_register(&cfg_info, "prefix", ACO_EXACT, global_options,
360  "", OPT_CHAR_ARRAY_T, 0,
362 
363  if (aco_process_config(&cfg_info, 0) == ACO_PROCESS_ERROR) {
364  struct conf *cfg;
365 
366  ast_log(LOG_NOTICE, "Could not load statsd config; using defaults\n");
367  cfg = conf_alloc();
368  if (!cfg) {
369  aco_info_destroy(&cfg_info);
371  }
372 
373  if (aco_set_defaults(&global_option, "general", cfg->global)) {
374  ast_log(LOG_ERROR, "Failed to initialize statsd defaults.\n");
375  ao2_ref(cfg, -1);
376  aco_info_destroy(&cfg_info);
378  }
379 
381  ao2_ref(cfg, -1);
382  }
383 
384  if (!is_enabled()) {
386  }
387 
388  if (statsd_init()) {
389  unload_module();
391  }
392 
394 }
Type for default handler for ast_sockaddrs.
static void * conf_alloc(void)
Creates the statis http conf object.
Definition: res_statsd.c:261
struct conf_global_options * global
Definition: res_statsd.c:97
static char is_enabled(void)
Helper function to check if module is enabled.
Definition: res_statsd.c:288
#define aco_option_register(info, name, matchtype, types, default_val, opt_type, flags,...)
Register a config option.
#define CHARFLDSET(type, field)
A helper macro to pass the appropriate arguments to aco_option_register for OPT_CHAR_ARRAY_T.
enum aco_process_status aco_process_config(struct aco_info *info, int reload)
Process a config info via the options registered with an aco_info.
static int unload_module(void)
Definition: res_statsd.c:332
All configuration options for statsd client.
Definition: res_statsd.c:95
Type for default option handler for character array strings.
#define ast_log
Definition: astobj2.c:42
#define FLDSET(type,...)
Convert a struct and list of fields to an argument list of field offsets.
int aco_info_init(struct aco_info *info)
Initialize an aco_info structure.
#define ao2_ref(o, delta)
Definition: astobj2.h:464
Their was an error and no changes were applied.
static struct aco_type * global_options[]
Definition: res_statsd.c:251
#define LOG_ERROR
Definition: logger.h:285
void aco_info_destroy(struct aco_info *info)
Destroy an initialized aco_info struct.
Type for default option handler for bools (ast_true/ast_false)
#define LOG_NOTICE
Definition: logger.h:263
int aco_set_defaults(struct aco_type *type, const char *category, void *obj)
Set all default options of obj.
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
Global configuration options for statsd client.
Definition: res_statsd.c:83
static struct aco_type global_option
Mapping of the statsd conf struct&#39;s globals to the general context in the config file.
Definition: res_statsd.c:243
#define ao2_global_obj_replace_unref(holder, obj)
Definition: astobj2.h:908
static int statsd_init(void)
Definition: res_statsd.c:294
static char prefix[MAX_PREFIX]
Definition: http.c:141
static int enabled
Definition: dnsmgr.c:91

◆ reload_module()

static int reload_module ( void  )
static

Definition at line 396 of file res_statsd.c.

References aco_process_config(), ACO_PROCESS_ERROR, ACO_PROCESS_OK, ACO_PROCESS_UNCHANGED, AST_MODFLAG_GLOBAL_SYMBOLS, AST_MODFLAG_LOAD_ORDER, AST_MODPRI_REALTIME_DRIVER, AST_MODULE_INFO(), AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, AST_MODULE_SUPPORT_EXTENDED, ASTERISK_GPL_KEY, is_enabled(), load_module(), reload(), statsd_init(), statsd_shutdown(), and unload_module().

397 {
398  switch (aco_process_config(&cfg_info, 1)) {
399  case ACO_PROCESS_OK:
400  break;
403  case ACO_PROCESS_ERROR:
404  default:
406  }
407 
408  if (is_enabled()) {
409  if (statsd_init()) {
411  }
412  } else {
413  statsd_shutdown();
414  }
416 }
static void statsd_shutdown(void)
Definition: res_statsd.c:323
static char is_enabled(void)
Helper function to check if module is enabled.
Definition: res_statsd.c:288
enum aco_process_status aco_process_config(struct aco_info *info, int reload)
Process a config info via the options registered with an aco_info.
The config had not been edited and no changes applied.
Their was an error and no changes were applied.
The config was processed and applied.
Module has failed to load, may be in an inconsistent state.
Definition: module.h:78
static int statsd_init(void)
Definition: res_statsd.c:294

◆ statsd_init()

static int statsd_init ( void  )
static

Definition at line 294 of file res_statsd.c.

References ao2_cleanup, ao2_global_obj_ref, ast_assert, ast_debug, AST_SOCKADDR_STR_DEFAULT, ast_sockaddr_stringify_fmt(), AST_YESNO, conf_server(), is_enabled(), RAII_VAR, and socket_fd.

Referenced by load_module(), and reload_module().

295 {
297  char *server;
298  struct ast_sockaddr statsd_server;
299 
301 
302  ast_debug(3, "Configuring StatsD client.\n");
303 
304  if (socket_fd == -1) {
305  ast_debug(3, "Creating StatsD socket.\n");
306  socket_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
307  if (socket_fd == -1) {
308  perror("Error creating StatsD socket");
309  return -1;
310  }
311  }
312 
313  conf_server(cfg, &statsd_server);
314  server = ast_sockaddr_stringify_fmt(&statsd_server,
316  ast_debug(3, " StatsD server = %s.\n", server);
317  ast_debug(3, " add newline = %s\n", AST_YESNO(cfg->global->add_newline));
318  ast_debug(3, " prefix = %s\n", cfg->global->prefix);
319 
320  return 0;
321 }
static char is_enabled(void)
Helper function to check if module is enabled.
Definition: res_statsd.c:288
#define ao2_global_obj_ref(holder)
Definition: astobj2.h:925
#define ast_assert(a)
Definition: utils.h:695
Socket address structure.
Definition: netsock2.h:97
#define AST_SOCKADDR_STR_DEFAULT
Definition: netsock2.h:207
All configuration options for statsd client.
Definition: res_statsd.c:95
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:911
char * ast_sockaddr_stringify_fmt(const struct ast_sockaddr *addr, int format)
Convert a socket address to a string.
Definition: netsock2.c:65
#define AST_YESNO(x)
return Yes or No depending on the argument.
Definition: strings.h:139
static int socket_fd
Definition: res_statsd.c:80
#define ao2_cleanup(obj)
Definition: astobj2.h:1958
static void conf_server(const struct conf *cfg, struct ast_sockaddr *addr)
Definition: res_statsd.c:103

◆ statsd_shutdown()

static void statsd_shutdown ( void  )
static

Definition at line 323 of file res_statsd.c.

References ast_debug, and socket_fd.

Referenced by reload_module(), and unload_module().

324 {
325  ast_debug(3, "Shutting down StatsD client.\n");
326  if (socket_fd != -1) {
327  close(socket_fd);
328  socket_fd = -1;
329  }
330 }
#define ast_debug(level,...)
Log a DEBUG message.
Definition: logger.h:452
static int socket_fd
Definition: res_statsd.c:80

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 332 of file res_statsd.c.

References aco_info_destroy(), ao2_global_obj_release, and statsd_shutdown().

Referenced by load_module(), and reload_module().

333 {
334  statsd_shutdown();
335  aco_info_destroy(&cfg_info);
337  return 0;
338 }
static void statsd_shutdown(void)
Definition: res_statsd.c:323
void aco_info_destroy(struct aco_info *info)
Destroy an initialized aco_info struct.
#define ao2_global_obj_release(holder)
Definition: astobj2.h:865

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_GLOBAL_SYMBOLS | AST_MODFLAG_LOAD_ORDER , .description = "StatsD client support" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_EXTENDED, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_REALTIME_DRIVER + 5, }
static

Definition at line 427 of file res_statsd.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 427 of file res_statsd.c.

◆ conf_file

struct aco_file conf_file
static

The conf file that's processed for the module.

Definition at line 277 of file res_statsd.c.

◆ global_option

struct aco_type global_option
static

Mapping of the statsd conf struct's globals to the general context in the config file.

Definition at line 243 of file res_statsd.c.

◆ global_options

struct aco_type* global_options[] = ACO_TYPES(&global_option)
static

Definition at line 251 of file res_statsd.c.

◆ socket_fd

int socket_fd = -1
static

Socket for sending statd messages

Definition at line 80 of file res_statsd.c.

Referenced by ast_statsd_log_string(), statsd_init(), and statsd_shutdown().

◆ statsd_buf

struct ast_threadstorage statsd_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_statsd_buf , .custom_init = NULL , }
static

Definition at line 174 of file res_statsd.c.

Referenced by ast_statsd_log_full_va(), and ast_statsd_log_string_va().