Count packets received when there was no ICE ping

This commit is contained in:
Richard Russo 2024-02-27 14:44:14 -08:00
parent 56b2658b7f
commit f5bc420a2e
5 changed files with 50 additions and 21 deletions

View File

@ -3720,25 +3720,28 @@ void turn_report_allocation_delete(void *a, SOCKET_TYPE socket_type, int family)
}
#endif
{
// Signal change to add metrics
if (ss->realm_options.name[0]) {
// Set prometheus traffic metrics
prom_set_finished_traffic(ss->realm_options.name, (const char *)ss->username,
(unsigned long)(ss->t_received_packets), (unsigned long)(ss->t_received_bytes),
(unsigned long)(ss->t_sent_packets), (unsigned long)(ss->t_sent_bytes), false);
(unsigned long)(ss->t_sent_packets), (unsigned long)(ss->t_sent_bytes),
(unsigned long)ss->t_before_ping_packets, false);
prom_set_finished_traffic(
ss->realm_options.name, (const char *)ss->username, (unsigned long)(ss->t_peer_received_packets),
(unsigned long)(ss->t_peer_received_bytes), (unsigned long)(ss->t_peer_sent_packets),
(unsigned long)(ss->t_peer_sent_bytes), true);
(unsigned long)(ss->t_peer_sent_bytes), 0, true);
} else {
// Set prometheus traffic metrics
prom_set_finished_traffic(NULL, (const char *)ss->username, (unsigned long)(ss->t_received_packets),
(unsigned long)(ss->t_received_bytes), (unsigned long)(ss->t_sent_packets),
(unsigned long)(ss->t_sent_bytes), false);
(unsigned long)(ss->t_sent_bytes), (unsigned long)ss->t_before_ping_packets,
false);
prom_set_finished_traffic(NULL, (const char *)ss->username, (unsigned long)(ss->t_peer_received_packets),
(unsigned long)(ss->t_peer_received_bytes),
(unsigned long)(ss->t_peer_sent_packets), (unsigned long)(ss->t_peer_sent_bytes),
true);
0, true);
}
turn_time_t ct = get_turn_server_time(server) - ss->start_time;
const uint32_t byte_to_kilobit = 125;

View File

@ -37,10 +37,11 @@ prom_counter_t *turn_total_sessions;
prom_gauge_t *turn_total_allocations;
// Signal change to add rtt metrics
// Signal change to add metrics
prom_counter_t *turn_rtt_client[8];
prom_counter_t *turn_rtt_peer[8];
prom_counter_t *turn_rtt_combined[8];
prom_counter_t *turn_with_no_ping_rcvp;
#if MHD_VERSION >= 0x00097002
#define MHD_RESULT enum MHD_Result
@ -151,7 +152,7 @@ void start_prometheus_server(void) {
turn_total_allocations = prom_collector_registry_must_register_metric(
prom_gauge_new("turn_total_allocations", "Represents current allocations number", 2, total_allocations_labels));
// Signal change to add rtt metrics
// Signal change to add metrics
// Create round trip time pseudo-histogram metrics
// values must be kept in sync with observation function below
@ -206,6 +207,9 @@ void start_prometheus_server(void) {
turn_rtt_combined[7] = prom_collector_registry_must_register_metric(
prom_counter_new("turn_rtt_combined_more", "Represents combined round trip time of channel", 0, NULL));
turn_with_no_ping_rcvp = prom_collector_registry_must_register_metric(prom_counter_new(
"turn_with_no_ping_rcvp", "Count of packets received for TURN where no ICE ping has been observed", 0, NULL));
// some flags appeared first in microhttpd v0.9.53
unsigned int flags = 0;
#if MHD_VERSION >= 0x00095300
@ -265,8 +269,9 @@ void start_prometheus_server(void) {
return;
}
// Signal change to add metrics
void prom_set_finished_traffic(const char *realm, const char *user, unsigned long rsvp, unsigned long rsvb,
unsigned long sentp, unsigned long sentb, bool peer) {
unsigned long sentp, unsigned long sentb, unsigned long without_pingp, bool peer) {
if (turn_params.prometheus == 1) {
const char *label[] = {realm, NULL};
@ -295,6 +300,10 @@ void prom_set_finished_traffic(const char *realm, const char *user, unsigned lon
prom_counter_add(turn_total_traffic_sentp, sentp, NULL);
prom_counter_add(turn_total_traffic_sentb, sentb, NULL);
}
// Signal change to add metrics
if (without_pingp) {
prom_counter_add(turn_with_no_ping_rcvp, without_pingp, NULL);
}
}
}
@ -348,7 +357,7 @@ int is_ipv6_enabled(void) {
return ret;
}
// Signal change to add rtt metrics
// Signal change to add metrics
void prom_observe_rtt(prom_counter_t *counter[8], int microseconds) {
if (microseconds <= 25000) {
prom_counter_add(counter[0], 1, NULL);
@ -400,13 +409,14 @@ void start_prometheus_server(void) {
}
void prom_set_finished_traffic(const char *realm, const char *user, unsigned long rsvp, unsigned long rsvb,
unsigned long sentp, unsigned long sentb, bool peer) {
unsigned long sentp, unsigned long sentb, unsigned long without_pingp, bool peer) {
UNUSED_ARG(realm);
UNUSED_ARG(user);
UNUSED_ARG(rsvp);
UNUSED_ARG(rsvb);
UNUSED_ARG(sentp);
UNUSED_ARG(sentb);
UNUSED_ARG(without_pingp);
UNUSED_ARG(peer);
}

View File

@ -52,10 +52,11 @@ extern prom_counter_t *turn_total_traffic_peer_sentb;
extern prom_gauge_t *turn_total_allocations_number;
// Signal change to add rtt metrics
// Signal change to add metrics
extern prom_counter_t *turn_rtt_client[8];
extern prom_counter_t *turn_rtt_peer[8];
extern prom_counter_t *turn_rtt_combined[8];
extern prom_counter_t *turn_with_no_ping_rcvp;
#define TURN_ALLOC_STR_MAX_SIZE (20)
@ -65,8 +66,9 @@ extern "C" {
void start_prometheus_server(void);
// Signal change to add metrics
void prom_set_finished_traffic(const char *realm, const char *user, unsigned long rsvp, unsigned long rsvb,
unsigned long sentp, unsigned long sentb, bool peer);
unsigned long sentp, unsigned long sentb, unsigned long without_pingp, bool peer);
void prom_inc_allocation(SOCKET_TYPE type, int addr_family);
void prom_dec_allocation(SOCKET_TYPE type, int addr_family, unsigned long duration, unsigned long sent_rate_kbps);
@ -77,7 +79,7 @@ void prom_inc_stun_binding_request(void);
void prom_inc_stun_binding_response(void);
void prom_inc_stun_binding_error(void);
// Signal change to add rtt metrics
// Signal change to add metrics
void prom_observe_rtt(prom_counter_t *counter[8], int microseconds);
void prom_observe_rtt_client(int microseconds);
void prom_observe_rtt_peer(int microseconds);
@ -87,8 +89,9 @@ void prom_observe_rtt_combined(int microseconds);
void start_prometheus_server(void);
// Signal change to add metrics
void prom_set_finished_traffic(const char *realm, const char *user, unsigned long rsvp, unsigned long rsvb,
unsigned long sentp, unsigned long sentb, bool peer);
unsigned long sentp, unsigned long sentb, unsigned long without_pingp, bool peer);
void prom_inc_allocation(SOCKET_TYPE type);
void prom_dec_allocation(SOCKET_TYPE type);

View File

@ -2938,13 +2938,13 @@ static int handle_turn_binding(turn_turnserver *server, ts_ur_super_session *ss,
return 0;
}
// Signal change to add rtt metrics
// Signal change to add metrics
/////////////// inspect relayed packets, they might be ICE binds ///////////////
static void inspect_binds(turn_turnserver *server, ioa_net_data *in_buffer, turn_permission_info *tinfo, int from_peer,
int is_channel) {
static int inspect_binds(turn_turnserver *server, ioa_net_data *in_buffer, turn_permission_info *tinfo, int from_peer,
int is_channel) {
if (!in_buffer || !tinfo || !(from_peer == 0 || from_peer == 1)) {
return;
return 0;
}
size_t len = ioa_network_buffer_get_size(in_buffer->nbh);
uint8_t *buf = ioa_network_buffer_data(in_buffer->nbh);
@ -2968,7 +2968,7 @@ static void inspect_binds(turn_turnserver *server, ioa_net_data *in_buffer, turn
}
if (tinfo->pings[from_client].ts.tv_sec == 0) {
return;
return 0;
}
stun_tid tid;
@ -3030,7 +3030,12 @@ static void inspect_binds(turn_turnserver *server, ioa_net_data *in_buffer, turn
tinfo->pings[from_client].ts.tv_sec = 0;
}
}
} else {
if (tinfo->pings[0].lastrttus == 0 && tinfo->pings[1].lastrttus == 0) {
return 1;
}
}
return 0;
}
static int handle_turn_send(turn_turnserver *server, ts_ur_super_session *ss, int *err_code, const uint8_t **reason,
@ -3119,7 +3124,9 @@ static int handle_turn_send(turn_turnserver *server, ts_ur_super_session *ss, in
ioa_network_buffer_set_size(nbh, len);
}
// Signal change to add rtt metrics
inspect_binds(server, in_buffer, tinfo, 0, 0);
if (inspect_binds(server, in_buffer, tinfo, 0, 0)) {
++(ss->t_before_ping_packets);
}
ioa_network_buffer_header_init(nbh);
int skip = 0;
@ -4185,7 +4192,9 @@ static int write_to_peerchannel(ts_ur_super_session *ss, uint16_t chnum, ioa_net
// Signal change to add rtt metrics
turn_turnserver *server = (turn_turnserver *)ss->server;
turn_permission_info *tinfo = (turn_permission_info *)(chn->owner);
inspect_binds(server, in_buffer, tinfo, 0, 1);
if (inspect_binds(server, in_buffer, tinfo, 0, 1)) {
++(ss->t_before_ping_packets);
}
ioa_network_buffer_header_init(nbh);
@ -4907,7 +4916,9 @@ static void peer_input_handler(ioa_socket_handle s, int event_type, ioa_net_data
if (tinfo) {
chnum = get_turn_channel_number(tinfo, &(in_buffer->src_addr));
// Signal change to add rtt metrics
inspect_binds(server, in_buffer, tinfo, 1, chnum != 0);
if (inspect_binds(server, in_buffer, tinfo, 1, chnum != 0)) {
++(ss->t_before_ping_packets);
}
} else if (!(server->server_relay)) {
return;
}

View File

@ -119,6 +119,8 @@ struct _ts_ur_super_session {
char s_mobile_id[33];
/* Bandwidth */
band_limit_t bps;
// Signal change to add metrics
uint64_t t_before_ping_packets;
};
////// Session info for statistics //////