Asterisk - The Open Source Telephony Project GIT-master-a63eec2
Loading...
Searching...
No Matches
Functions | Variables
res_chan_stats.c File Reference
#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/stasis_channels.h"
#include "asterisk/stasis_message_router.h"
#include "asterisk/statsd.h"
#include "asterisk/time.h"
Include dependency graph for res_chan_stats.c:

Go to the source code of this file.

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static void default_route (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 Router callback for any message that doesn't otherwise have a route.
 
static int load_module (void)
 
static void statsmaker (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 Subscription callback for all channel messages.
 
static int unload_module (void)
 
static void updates (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 Router callback for ast_channel_snapshot_update messages.
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Example of how to use Stasis" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_EXTENDED, .load = load_module, .unload = unload_module, .requires = "res_statsd" }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct stasis_message_routerrouter
 
static struct stasis_subscriptionsub
 Statsd channel stats. Exmaple of how to subscribe to Stasis events.
 

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 168 of file res_chan_stats.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 168 of file res_chan_stats.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 168 of file res_chan_stats.c.

◆ default_route()

static void default_route ( void *  data,
struct stasis_subscription sub,
struct stasis_message message 
)
static

Router callback for any message that doesn't otherwise have a route.

Parameters
dataData pointer given when added to router.
subThis subscription.
messageThe message itself.

Definition at line 121 of file res_chan_stats.c.

123{
125 /* Much like with the regular subscription, you may need to
126 * perform some cleanup when done with a message router. You
127 * can look for the final message in the default route.
128 */
129 return;
130 }
131}
static struct stasis_subscription * sub
Statsd channel stats. Exmaple of how to subscribe to Stasis events.
int stasis_subscription_final_message(struct stasis_subscription *sub, struct stasis_message *msg)
Determine whether a message is the final message to be received on a subscription.
Definition stasis.c:1241

References stasis_subscription_final_message(), and sub.

Referenced by load_module().

◆ load_module()

static int load_module ( void  )
static

Definition at line 142 of file res_chan_stats.c.

143{
144 /* You can create a message router to route messages by type */
147 if (!router) {
149 }
151 updates, NULL);
153
154 /* Or a subscription to receive all of the messages from a topic */
156 if (!sub) {
159 }
161}
struct stasis_topic * ast_channel_topic_all(void)
A topic which publishes the events for all channels.
struct stasis_message_type * ast_channel_snapshot_type(void)
Message type for ast_channel_snapshot_update.
@ AST_MODULE_LOAD_SUCCESS
Definition module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition module.h:78
static void default_route(void *data, struct stasis_subscription *sub, struct stasis_message *message)
Router callback for any message that doesn't otherwise have a route.
static struct stasis_message_router * router
static void statsmaker(void *data, struct stasis_subscription *sub, struct stasis_message *message)
Subscription callback for all channel messages.
static void updates(void *data, struct stasis_subscription *sub, struct stasis_message *message)
Router callback for ast_channel_snapshot_update messages.
static int unload_module(void)
#define NULL
Definition resample.c:96
#define stasis_subscribe(topic, callback, data)
Definition stasis.h:649
#define stasis_message_router_create(topic)
Create a new message router object.
int stasis_message_router_add(struct stasis_message_router *router, struct stasis_message_type *message_type, stasis_subscription_cb callback, void *data)
Add a route to a message router.
int stasis_message_router_set_default(struct stasis_message_router *router, stasis_subscription_cb callback, void *data)
Sets the default route of a router.

References ast_channel_snapshot_type(), ast_channel_topic_all(), AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, default_route(), NULL, router, stasis_message_router_add(), stasis_message_router_create, stasis_message_router_set_default(), stasis_subscribe, statsmaker(), sub, unload_module(), and updates().

◆ statsmaker()

static void statsmaker ( void *  data,
struct stasis_subscription sub,
struct stasis_message message 
)
static

Subscription callback for all channel messages.

Parameters
dataData pointer given when creating the subscription.
subThis subscription.
messageThe message itself.

Definition at line 54 of file res_chan_stats.c.

56{
57 RAII_VAR(struct ast_str *, metric, NULL, ast_free);
58
60 /* Normally, data points to an object that must be cleaned up.
61 * The final message is an unsubscribe notification that's
62 * guaranteed to be the last message this subscription receives.
63 * This would be a safe place to kick off any needed cleanup.
64 */
65 return;
66 }
67
68 /* For no good reason, count message types */
69 metric = ast_str_create(80);
70 if (metric) {
71 ast_str_set(&metric, 0, "stasis.message.%s",
74 }
75}
#define ast_free(a)
Definition astmm.h:180
const char * stasis_message_type_name(const struct stasis_message_type *type)
Gets the name of a given message type.
#define AST_STATSD_METER
Definition statsd.h:48
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.
Definition res_statsd.c:251
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition strings.h:659
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition strings.h:1113
char *attribute_pure ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition strings.h:761
Support for dynamic strings.
Definition strings.h:623
#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:978

References ast_free, ast_statsd_log(), AST_STATSD_METER, ast_str_buffer(), ast_str_create, ast_str_set(), NULL, RAII_VAR, stasis_message_type_name(), stasis_subscription_final_message(), and sub.

Referenced by load_module().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 133 of file res_chan_stats.c.

134{
136 sub = NULL;
138 router = NULL;
139 return 0;
140}
struct stasis_subscription * stasis_unsubscribe_and_join(struct stasis_subscription *subscription)
Cancel a subscription, blocking until the last message is processed.
Definition stasis.c:1201
void stasis_message_router_unsubscribe_and_join(struct stasis_message_router *router)
Unsubscribe the router from the upstream topic, blocking until the final message has been processed.

References NULL, router, stasis_message_router_unsubscribe_and_join(), stasis_unsubscribe_and_join(), and sub.

Referenced by load_module().

◆ updates()

static void updates ( void *  data,
struct stasis_subscription sub,
struct stasis_message message 
)
static

Router callback for ast_channel_snapshot_update messages.

Parameters
dataData pointer given when added to router.
subThis subscription.
messageThe message itself.

Definition at line 83 of file res_chan_stats.c.

85{
86 /* Since this came from a message router, we know the type of the
87 * message. We can cast the data without checking its type.
88 */
90
91 /* There are three types of channel snapshot updates.
92 * !old && new -> Initial channel creation
93 * old && new -> Updated channel snapshot
94 * old && dead -> Final channel snapshot
95 */
96
97 if (!update->old_snapshot && update->new_snapshot) {
98 /* Initial channel snapshot; count a channel creation */
99 ast_statsd_log_string("channels.count", AST_STATSD_GAUGE, "+1", 1.0);
100 } else if (update->old_snapshot && ast_test_flag(&update->new_snapshot->flags, AST_FLAG_DEAD)) {
101 /* Channel is gone. Compute the age of the channel and post
102 * that, as well as decrementing the channel count.
103 */
104 int64_t age;
105
107 update->new_snapshot->base->creationtime);
108 ast_statsd_log("channels.calltime", AST_STATSD_TIMER, age);
109
110 /* And decrement the channel count */
111 ast_statsd_log_string("channels.count", AST_STATSD_GAUGE, "-1", 1.0);
112 }
113}
@ AST_FLAG_DEAD
Definition channel.h:1065
static void update(int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, struct g726_state *state_ptr)
Definition codec_g726.c:367
void * stasis_message_data(const struct stasis_message *msg)
Get the data contained in a message.
const struct timeval * stasis_message_timestamp(const struct stasis_message *msg)
Get the time when a message was created.
#define AST_STATSD_TIMER
Definition statsd.h:41
#define AST_STATSD_GAUGE
Support for publishing to a statsd server.
Definition statsd.h:32
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:136
Structure representing a change of snapshot of channel state.
int64_t ast_tvdiff_ms(struct timeval end, struct timeval start)
Computes the difference (in milliseconds) between two struct timeval instances.
Definition time.h:107
#define ast_test_flag(p, flag)
Definition utils.h:63

References AST_FLAG_DEAD, AST_STATSD_GAUGE, ast_statsd_log(), ast_statsd_log_string(), AST_STATSD_TIMER, ast_test_flag, ast_tvdiff_ms(), stasis_message_data(), stasis_message_timestamp(), and update().

Referenced by load_module().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Example of how to use Stasis" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_EXTENDED, .load = load_module, .unload = unload_module, .requires = "res_statsd" }
static

Definition at line 168 of file res_chan_stats.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 168 of file res_chan_stats.c.

◆ router

struct stasis_message_router* router
static

◆ sub

struct stasis_subscription* sub
static

Statsd channel stats. Exmaple of how to subscribe to Stasis events.

This module subscribes to the channel caching topic and issues statsd stats based on the received messages.

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

Regular Stasis subscription

Definition at line 44 of file res_chan_stats.c.

Referenced by add_mwi_datastore(), allocate_body_part(), allocate_subscription(), analog_dial_digits(), analog_get_sub_fd(), analog_new_ast_channel(), analog_play_tone(), analog_set_inthreeway(), analog_set_linear_mode(), ao2_weakproxy_subscribe(), ao2_weakproxy_unsubscribe(), ast_channel_connected_line_sub(), ast_channel_redirecting_sub(), ast_mwi_subscribe_pool(), ast_mwi_subscriber_data(), ast_mwi_subscriber_subscription(), ast_mwi_subscriber_topic(), ast_mwi_unsubscribe(), ast_mwi_unsubscribe_and_join(), ast_sip_create_subscription(), ast_sip_subscription_destroy(), ast_sip_subscription_get_body_subtype(), ast_sip_subscription_get_body_type(), ast_sip_subscription_get_dialog(), ast_sip_subscription_get_endpoint(), ast_sip_subscription_get_header(), ast_sip_subscription_get_local_uri(), ast_sip_subscription_get_remote_uri(), ast_sip_subscription_get_resource_name(), ast_sip_subscription_get_serializer(), ast_sip_subscription_get_sip_uri(), ast_sip_subscription_is_terminated(), ast_sip_subscription_notify(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), AST_TEST_DEFINE(), asterisk_publisher_devstate_cb(), asterisk_publisher_mwistate_cb(), bridge_subscription_change_handler(), build_body_part(), build_rlmi_body(), caching_topic_exec(), cel_local_optimization_begin_cb(), cel_local_optimization_end_cb(), channel_to_session(), close_call(), close_client(), consumer_exec(), consumer_exec_sync(), consumer_finalize(), create_unsolicited_mwi_subscriptions(), create_virtual_subscriptions(), default_route(), delete_device(), destroy_subscription(), destroy_subscriptions_task(), device_state_cb(), device_state_subscription_create(), device_state_subscription_destroy(), device_to_json_cb(), discard_call(), dispatch_exec_async(), dispatch_exec_sync(), dispatch_message(), dispatch_message(), endpoint_subscription_change(), exten_state_subscription_destructor(), find_rtp_port(), find_subchannel_by_name(), generate_content_id_hdr(), generate_initial_notify(), generate_list_body(), generic_agent_devstate_cb(), get_exten_state_sub(), get_notify_data(), get_or_create_subscription(), get_sub(), get_sub_holding(), get_subscription(), handle_call_incoming(), handle_call_outgoing(), handle_key_fav(), handle_msg_cb(), handle_validate(), handle_validate(), has_destination_cb(), internal_stasis_subscribe(), is_app_subscribed(), is_subscribed_device_state(), key_call(), key_dial_page(), load_module(), load_module(), load_module(), message_sink_cb(), message_subscription_alloc(), message_subscription_dtor(), message_subscription_hash_cb(), messaging_app_subscribe_endpoint(), messaging_app_unsubscribe_endpoint(), messaging_subscription_cmp(), mwi_create_subscription(), mwi_ds_destroy(), mwi_get_notify_data(), mwi_handle_subscribe(), mwi_handle_unsubscribe(), mwi_on_aor(), mwi_startup_event_cb(), mwi_stasis_cb(), mwi_subscribe_all(), mwi_subscribe_single(), mwi_subscription_alloc(), mwi_subscription_destructor(), mwi_subscription_established(), mwi_subscription_shutdown(), mwi_to_ami(), my_conf_add(), my_conf_del(), my_dial_digits(), my_get_sub_fd(), my_is_dialing(), my_new_analog_ast_channel(), my_play_tone(), my_set_inthreeway(), my_set_linear_mode(), my_wink(), onevent(), park_announce_update_cb(), parker_update_cb(), process_opcode(), publish_msg(), pubsub_on_rx_notify(), queue_bridge_cb(), queue_channel_cb(), rcv_mac_addr(), refer_client_on_evsub_state(), refer_progress_bridge(), refer_progress_notify(), refer_progress_on_evsub_state(), refer_send(), remove_device_state_subscription(), router_dispatch(), send_callerid_screen(), send_device_state(), send_mwi_notify(), send_start_rtp(), send_subscription_subscribe(), send_subscription_unsubscribe(), send_unsolicited_mwi_notify(), send_unsolicited_mwi_notify_to_contact(), set_state_terminated(), shutdown_subscriptions(), start_rtp(), stasis_publish_sync(), stasis_state_add_subscriber(), stasis_state_subscribe_pool(), stasis_state_subscriber_data(), stasis_state_subscriber_id(), stasis_state_subscriber_subscription(), stasis_state_subscriber_topic(), stasis_state_unsubscribe(), stasis_state_unsubscribe_and_join(), stasis_subscription_final_message(), stasis_subscription_is_subscribed(), stasis_subscription_uniqueid(), stasis_unsubscribe(), statsmaker(), sub_cleanup(), sub_hold(), sub_start_silence(), sub_stop_silence(), sub_subscription_change_handler(), sub_unhold(), subscribe_device_state(), subscriber_dtor(), subscript(), subscription_dtor(), subscription_invoke(), subscription_persistence_event_cb(), subscription_shutdown(), subscriptions_create(), subscriptions_create(), to_ami(), topic_add_subscription(), topic_remove_subscription(), transfer_call_step1(), transfer_cancel_step2(), transfer_refer(), unistim_alloc_sub(), unistim_answer(), unistim_call(), unistim_do_senddigit(), unistim_free_sub(), unistim_get_rtp_peer(), unistim_hangup(), unistim_hangup_clean(), unistim_indicate(), unistim_new(), unistim_read(), unistim_request(), unistim_rtp_read(), unistim_set_owner(), unistim_set_rtp_peer(), unistim_show_info(), unistim_sp(), unistim_ss(), unistim_unalloc_sub(), unistim_write(), unload_module(), unsubscribe_device_state(), xfer_client_on_evsub_state(), xmpp_pubsub_devstate_cb(), and xmpp_pubsub_mwi_cb().