From fbf7550f8682e9b19831bbbb85efe12e45b42f4f Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 2 Feb 2023 12:44:19 -0500 Subject: [PATCH] MT#55283 collect sampled interface stats Change-Id: I3884a75469b463a1287a77c9b8a3b408246652e6 --- daemon/rtcp.c | 4 ++-- daemon/ssrc.c | 14 +++++++------- include/interface_sampled_stats_fields.inc | 6 ++++++ include/media_socket.h | 11 +++++++++++ include/ssrc.h | 3 ++- include/statistics.h | 10 ++++++++++ 6 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 include/interface_sampled_stats_fields.inc diff --git a/daemon/rtcp.c b/daemon/rtcp.c index ee8d2378b..62d8bf766 100644 --- a/daemon/rtcp.c +++ b/daemon/rtcp.c @@ -1277,7 +1277,7 @@ static void mos_sr(struct rtcp_process_ctx *ctx, struct sender_report_packet *sr ssrc_sender_report(ctx->mp->media, &ctx->scratch.sr, &ctx->mp->tv); } static void mos_rr(struct rtcp_process_ctx *ctx, struct report_block *rr) { - ssrc_receiver_report(ctx->mp->media, &ctx->scratch.rr, &ctx->mp->tv); + ssrc_receiver_report(ctx->mp->media, ctx->mp->sfd, &ctx->scratch.rr, &ctx->mp->tv); } static void mos_xr_rr_time(struct rtcp_process_ctx *ctx, const struct xr_rb_rr_time *rr) { ssrc_receiver_rr_time(ctx->mp->media, &ctx->scratch.xr_rr, &ctx->mp->tv); @@ -1623,7 +1623,7 @@ void rtcp_send_report(struct call_media *media, struct ssrc_ctx *ssrc_out) { ssrc_sender_report(other_media, &ssr, &rtpe_now); for (GList *k = srrs.head; k; k = k->next) { struct ssrc_receiver_report *srr = k->data; - ssrc_receiver_report(other_media, srr, &rtpe_now); + ssrc_receiver_report(other_media, sink->selected_sfd, srr, &rtpe_now); } } while (srrs.length) { diff --git a/daemon/ssrc.c b/daemon/ssrc.c index 1c40cc5b8..c1145920a 100644 --- a/daemon/ssrc.c +++ b/daemon/ssrc.c @@ -351,7 +351,7 @@ void ssrc_sender_report(struct call_media *m, const struct ssrc_sender_report *s mutex_unlock(&e->lock); obj_put(e); } -void ssrc_receiver_report(struct call_media *m, const struct ssrc_receiver_report *rr, +void ssrc_receiver_report(struct call_media *m, struct stream_fd *sfd, const struct ssrc_receiver_report *rr, const struct timeval *tv) { ilog(LOG_DEBUG, "RR from %s%x%s about %s%x%s: FL %u TL %u HSR %u J %u LSR %u DLSR %u", @@ -396,17 +396,17 @@ void ssrc_receiver_report(struct call_media *m, const struct ssrc_receiver_repor .packetloss = (unsigned int) rr->fraction_lost * 100 / 256, }; - RTPE_STATS_SAMPLE(jitter, jitter); - RTPE_STATS_SAMPLE(rtt_e2e, rtt_end2end); - RTPE_STATS_SAMPLE(rtt_dsct, rtt); - RTPE_STATS_SAMPLE(packetloss, ssb->packetloss); + RTPE_SAMPLE_SFD(jitter, jitter, sfd); + RTPE_SAMPLE_SFD(rtt_e2e, rtt_end2end, sfd); + RTPE_SAMPLE_SFD(rtt_dsct, rtt, sfd); + RTPE_SAMPLE_SFD(packetloss, ssb->packetloss, sfd); other_e->packets_lost = rr->packets_lost; mos_calc(ssb); if (ssb->mos) { ilog(LOG_DEBUG, "Calculated MOS from RR for %s%x%s is %.1f", FMT_M(rr->from), (double) ssb->mos / 10.0); - RTPE_STATS_SAMPLE(mos, ssb->mos); + RTPE_SAMPLE_SFD(mos, ssb->mos, sfd); } // got a new stats block, add it to reporting ssrc @@ -623,6 +623,6 @@ void ssrc_collect_metrics(struct call_media *media) { e->jitter = e->jitter * 1000 / rpt->clock_rate; } - RTPE_STATS_SAMPLE(jitter_measured, e->jitter); + RTPE_SAMPLE_SFD(jitter_measured, e->jitter, ps->selected_sfd); } } diff --git a/include/interface_sampled_stats_fields.inc b/include/interface_sampled_stats_fields.inc new file mode 100644 index 000000000..baa24ef13 --- /dev/null +++ b/include/interface_sampled_stats_fields.inc @@ -0,0 +1,6 @@ +F(mos) +F(jitter) +F(rtt_e2e) +F(rtt_dsct) +F(packetloss) +F(jitter_measured) diff --git a/include/media_socket.h b/include/media_socket.h index 28dd73454..245dff819 100644 --- a/include/media_socket.h +++ b/include/media_socket.h @@ -115,6 +115,16 @@ struct interface_counter_stats { #include "interface_counter_stats_fields.inc" #undef F }; +struct interface_sampled_stats_fields { +#define F(n) atomic64 n; +#include "interface_sampled_stats_fields.inc" +#undef F +}; +struct interface_sampled_stats { + struct interface_sampled_stats_fields sums; + struct interface_sampled_stats_fields sums_squared; + struct interface_sampled_stats_fields counts; +}; struct local_intf { struct intf_spec *spec; struct intf_address advertised_address; @@ -125,6 +135,7 @@ struct local_intf { struct interface_counter_stats_dir stats_in, stats_out; struct interface_counter_stats stats; + struct interface_sampled_stats sampled_stats; }; struct intf_list { struct local_intf *local_intf; diff --git a/include/ssrc.h b/include/ssrc.h index dec946743..308fe3479 100644 --- a/include/ssrc.h +++ b/include/ssrc.h @@ -19,6 +19,7 @@ struct rtp_payload_type; struct ssrc_entry; struct ssrc_entry_call; enum ssrc_dir; +struct stream_fd; @@ -217,7 +218,7 @@ struct ssrc_ctx *get_ssrc_ctx(uint32_t, struct ssrc_hash *, enum ssrc_dir, void void ssrc_sender_report(struct call_media *, const struct ssrc_sender_report *, const struct timeval *); -void ssrc_receiver_report(struct call_media *, const struct ssrc_receiver_report *, +void ssrc_receiver_report(struct call_media *, struct stream_fd *, const struct ssrc_receiver_report *, const struct timeval *); void ssrc_receiver_rr_time(struct call_media *m, const struct ssrc_xr_rr_time *rr, const struct timeval *); diff --git a/include/statistics.h b/include/statistics.h index 17416fe95..7d56b409a 100644 --- a/include/statistics.h +++ b/include/statistics.h @@ -169,6 +169,16 @@ extern struct global_sampled_min_max rtpe_sampled_min_max; // master lifetime m RTPE_GAUGE_SET_MIN_MAX(field, rtpe_sampled_graphite_min_max, num); \ } while (0) // TODO: ^ skip doing this for graphite if it's not actually enabled +#define RTPE_SAMPLE_SFD(field, num, sfd) \ + do { \ + RTPE_STATS_SAMPLE(field, num); \ + if (sfd) { \ + struct local_intf *__intf = sfd->local_intf; \ + atomic64_add(&__intf->sampled_stats.sums.field, num); \ + atomic64_add(&__intf->sampled_stats.sums_squared.field, num * num); \ + atomic64_inc(&__intf->sampled_stats.counts.field); \ + } \ + } while (0) extern struct global_stats_counter rtpe_stats; // total, cumulative, master extern struct global_stats_counter rtpe_stats_rate; // per-second, calculated once per timer run