mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 12:16:00 +00:00
Merge "res_pjsip/contacts/statsd: Make contact lifecycle events more consistent"
This commit is contained in:
@@ -317,14 +317,6 @@ int ast_sip_location_update_contact(struct ast_sip_contact *contact)
|
|||||||
|
|
||||||
int ast_sip_location_delete_contact(struct ast_sip_contact *contact)
|
int ast_sip_location_delete_contact(struct ast_sip_contact *contact)
|
||||||
{
|
{
|
||||||
void *contact_status_obj;
|
|
||||||
|
|
||||||
contact_status_obj = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), CONTACT_STATUS, ast_sorcery_object_get_id(contact));
|
|
||||||
if (contact_status_obj) {
|
|
||||||
ast_sorcery_delete(ast_sip_get_sorcery(), contact_status_obj);
|
|
||||||
ao2_ref(contact_status_obj, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ast_sorcery_delete(ast_sip_get_sorcery(), contact);
|
return ast_sorcery_delete(ast_sip_get_sorcery(), contact);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -389,7 +381,7 @@ static int permanent_uri_handler(const struct aco_option *opt, struct ast_variab
|
|||||||
struct ast_sip_contact *contact;
|
struct ast_sip_contact *contact;
|
||||||
struct ast_sip_contact_status *status;
|
struct ast_sip_contact_status *status;
|
||||||
char hash[33];
|
char hash[33];
|
||||||
char contact_id[strlen(aor_id) + sizeof(hash) + 2 + 1];
|
char contact_id[strlen(aor_id) + sizeof(hash) + 2];
|
||||||
|
|
||||||
if (!aor->permanent_contacts) {
|
if (!aor->permanent_contacts) {
|
||||||
aor->permanent_contacts = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_NOLOCK,
|
aor->permanent_contacts = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_NOLOCK,
|
||||||
@@ -406,6 +398,8 @@ static int permanent_uri_handler(const struct aco_option *opt, struct ast_variab
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ast_string_field_set(contact, uri, contact_uri);
|
||||||
|
|
||||||
status = ast_res_pjsip_find_or_create_contact_status(contact);
|
status = ast_res_pjsip_find_or_create_contact_status(contact);
|
||||||
if (!status) {
|
if (!status) {
|
||||||
ao2_ref(contact, -1);
|
ao2_ref(contact, -1);
|
||||||
@@ -413,7 +407,6 @@ static int permanent_uri_handler(const struct aco_option *opt, struct ast_variab
|
|||||||
}
|
}
|
||||||
ao2_ref(status, -1);
|
ao2_ref(status, -1);
|
||||||
|
|
||||||
ast_string_field_set(contact, uri, contact_uri);
|
|
||||||
ao2_link(aor->permanent_contacts, contact);
|
ao2_link(aor->permanent_contacts, contact);
|
||||||
ao2_ref(contact, -1);
|
ao2_ref(contact, -1);
|
||||||
}
|
}
|
||||||
@@ -1031,7 +1024,7 @@ int ast_sip_initialize_sorcery_location(void)
|
|||||||
* Note that this must done here, as contacts will create the contact_status
|
* Note that this must done here, as contacts will create the contact_status
|
||||||
* object before PJSIP options handling is initialized.
|
* object before PJSIP options handling is initialized.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < REMOVED; i++) {
|
for (i = 0; i <= REMOVED; i++) {
|
||||||
ast_statsd_log_full_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE, 0, 1.0, ast_sip_get_contact_status_label(i));
|
ast_statsd_log_full_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE, 0, 1.0, ast_sip_get_contact_status_label(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -20,6 +20,7 @@
|
|||||||
#include "asterisk/sorcery.h"
|
#include "asterisk/sorcery.h"
|
||||||
#include "asterisk/callerid.h"
|
#include "asterisk/callerid.h"
|
||||||
#include "asterisk/test.h"
|
#include "asterisk/test.h"
|
||||||
|
#include "asterisk/statsd.h"
|
||||||
|
|
||||||
/*! \brief Number of buckets for persistent endpoint information */
|
/*! \brief Number of buckets for persistent endpoint information */
|
||||||
#define PERSISTENT_BUCKETS 53
|
#define PERSISTENT_BUCKETS 53
|
||||||
@@ -161,20 +162,21 @@ static void persistent_endpoint_contact_deleted_observer(const void *object)
|
|||||||
const struct ast_sip_contact *contact = object;
|
const struct ast_sip_contact *contact = object;
|
||||||
struct ast_sip_contact_status *contact_status;
|
struct ast_sip_contact_status *contact_status;
|
||||||
|
|
||||||
contact_status = ast_sorcery_alloc(ast_sip_get_sorcery(), CONTACT_STATUS,
|
contact_status = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), CONTACT_STATUS, ast_sorcery_object_get_id(contact));
|
||||||
ast_sorcery_object_get_id(contact));
|
|
||||||
if (!contact_status) {
|
if (!contact_status) {
|
||||||
ast_log(LOG_ERROR, "Unable to create ast_sip_contact_status for contact %s/%s\n",
|
ast_log(LOG_ERROR, "Unable to create ast_sip_contact_status for contact %s/%s\n",
|
||||||
contact->aor, contact->uri);
|
contact->aor, contact->uri);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ast_string_field_set(contact_status, uri, contact->uri);
|
|
||||||
|
|
||||||
contact_status->status = REMOVED;
|
|
||||||
|
|
||||||
ast_verb(1, "Contact %s/%s has been deleted\n", contact->aor, contact->uri);
|
ast_verb(1, "Contact %s/%s has been deleted\n", contact->aor, contact->uri);
|
||||||
|
ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
|
||||||
|
"-1", 1.0, ast_sip_get_contact_status_label(contact_status->status));
|
||||||
|
ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
|
||||||
|
"+1", 1.0, ast_sip_get_contact_status_label(REMOVED));
|
||||||
|
|
||||||
ao2_callback(persistent_endpoints, OBJ_NODATA, persistent_endpoint_update_state, contact_status);
|
ao2_callback(persistent_endpoints, OBJ_NODATA, persistent_endpoint_update_state, contact_status);
|
||||||
|
ast_sorcery_delete(ast_sip_get_sorcery(), contact_status);
|
||||||
ao2_cleanup(contact_status);
|
ao2_cleanup(contact_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,24 +196,31 @@ static void persistent_endpoint_contact_status_observer(const void *object)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (contact_status->status == contact_status->last_status) {
|
if (contact_status->status != contact_status->last_status) {
|
||||||
ast_debug(3, "Contact %s/%s status didn't change: %s, RTT: %.3f msec\n",
|
|
||||||
contact_status->aor, contact_status->uri, ast_sip_get_contact_status_label(contact_status->status),
|
|
||||||
contact_status->rtt / 1000.0);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
ast_verb(1, "Contact %s/%s is now %s. RTT: %.3f msec\n", contact_status->aor, contact_status->uri,
|
ast_verb(1, "Contact %s/%s is now %s. RTT: %.3f msec\n", contact_status->aor, contact_status->uri,
|
||||||
ast_sip_get_contact_status_label(contact_status->status),
|
ast_sip_get_contact_status_label(contact_status->status),
|
||||||
contact_status->rtt / 1000.0);
|
contact_status->rtt / 1000.0);
|
||||||
|
|
||||||
|
ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
|
||||||
|
"-1", 1.0, ast_sip_get_contact_status_label(contact_status->last_status));
|
||||||
|
ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
|
||||||
|
"+1", 1.0, ast_sip_get_contact_status_label(contact_status->status));
|
||||||
|
|
||||||
|
ast_test_suite_event_notify("AOR_CONTACT_UPDATE",
|
||||||
|
"Contact: %s\r\n"
|
||||||
|
"Status: %s",
|
||||||
|
ast_sorcery_object_get_id(contact_status),
|
||||||
|
ast_sip_get_contact_status_label(contact_status->status));
|
||||||
|
|
||||||
|
ao2_callback(persistent_endpoints, OBJ_NODATA, persistent_endpoint_update_state, contact_status);
|
||||||
|
} else {
|
||||||
|
ast_debug(3, "Contact %s/%s status didn't change: %s, RTT: %.3f msec\n",
|
||||||
|
contact_status->aor, contact_status->uri, ast_sip_get_contact_status_label(contact_status->status),
|
||||||
|
contact_status->rtt / 1000.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ast_test_suite_event_notify("AOR_CONTACT_UPDATE",
|
ast_statsd_log_full_va("PJSIP.contacts.%s.rtt", AST_STATSD_TIMER,
|
||||||
"Contact: %s\r\n"
|
contact_status->status != AVAILABLE ? -1 : contact_status->rtt / 1000, 1.0, ast_sorcery_object_get_id(contact_status));
|
||||||
"Status: %s",
|
|
||||||
ast_sorcery_object_get_id(contact_status),
|
|
||||||
ast_sip_get_contact_status_label(contact_status->status));
|
|
||||||
|
|
||||||
ao2_callback(persistent_endpoints, OBJ_NODATA, persistent_endpoint_update_state, contact_status);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Observer for contacts so state can be updated on respective endpoints */
|
/*! \brief Observer for contacts so state can be updated on respective endpoints */
|
||||||
|
@@ -174,22 +174,13 @@ static void update_contact_status(const struct ast_sip_contact *contact,
|
|||||||
ast_string_field_set(update, uri, contact->uri);
|
ast_string_field_set(update, uri, contact->uri);
|
||||||
update->last_status = status->status;
|
update->last_status = status->status;
|
||||||
update->status = value;
|
update->status = value;
|
||||||
if (update->last_status != update->status) {
|
|
||||||
ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
|
|
||||||
"-1", 1.0, ast_sip_get_contact_status_label(update->last_status));
|
|
||||||
ast_statsd_log_string_va("PJSIP.contacts.states.%s", AST_STATSD_GAUGE,
|
|
||||||
"+1", 1.0, ast_sip_get_contact_status_label(update->status));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if the contact is available calculate the rtt as
|
/* if the contact is available calculate the rtt as
|
||||||
the diff between the last start time and "now" */
|
the diff between the last start time and "now" */
|
||||||
update->rtt = update->status == AVAILABLE && status->rtt_start.tv_sec > 0 ?
|
update->rtt = update->status == AVAILABLE && status->rtt_start.tv_sec > 0 ?
|
||||||
ast_tvdiff_us(ast_tvnow(), status->rtt_start) : 0;
|
ast_tvdiff_us(ast_tvnow(), status->rtt_start) : 0;
|
||||||
|
|
||||||
update->rtt_start = ast_tv(0, 0);
|
update->rtt_start = ast_tv(0, 0);
|
||||||
|
|
||||||
ast_statsd_log_full_va("PJSIP.contacts.%s.rtt", AST_STATSD_TIMER,
|
|
||||||
update->rtt / 1000, 1.0, ast_sorcery_object_get_id(update));
|
|
||||||
ast_test_suite_event_notify("AOR_CONTACT_QUALIFY_RESULT",
|
ast_test_suite_event_notify("AOR_CONTACT_QUALIFY_RESULT",
|
||||||
"Contact: %s\r\n"
|
"Contact: %s\r\n"
|
||||||
"Status: %s\r\n"
|
"Status: %s\r\n"
|
||||||
|
Reference in New Issue
Block a user