MT#55283 collect sampled interface stats

Change-Id: I3884a75469b463a1287a77c9b8a3b408246652e6
pull/1614/head
Richard Fuchs 2 years ago
parent ea9bddbd26
commit fbf7550f86

@ -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); 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) { 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) { 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); 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); ssrc_sender_report(other_media, &ssr, &rtpe_now);
for (GList *k = srrs.head; k; k = k->next) { for (GList *k = srrs.head; k; k = k->next) {
struct ssrc_receiver_report *srr = k->data; 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) { while (srrs.length) {

@ -351,7 +351,7 @@ void ssrc_sender_report(struct call_media *m, const struct ssrc_sender_report *s
mutex_unlock(&e->lock); mutex_unlock(&e->lock);
obj_put(e); 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) 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", 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, .packetloss = (unsigned int) rr->fraction_lost * 100 / 256,
}; };
RTPE_STATS_SAMPLE(jitter, jitter); RTPE_SAMPLE_SFD(jitter, jitter, sfd);
RTPE_STATS_SAMPLE(rtt_e2e, rtt_end2end); RTPE_SAMPLE_SFD(rtt_e2e, rtt_end2end, sfd);
RTPE_STATS_SAMPLE(rtt_dsct, rtt); RTPE_SAMPLE_SFD(rtt_dsct, rtt, sfd);
RTPE_STATS_SAMPLE(packetloss, ssb->packetloss); RTPE_SAMPLE_SFD(packetloss, ssb->packetloss, sfd);
other_e->packets_lost = rr->packets_lost; other_e->packets_lost = rr->packets_lost;
mos_calc(ssb); mos_calc(ssb);
if (ssb->mos) { if (ssb->mos) {
ilog(LOG_DEBUG, "Calculated MOS from RR for %s%x%s is %.1f", FMT_M(rr->from), ilog(LOG_DEBUG, "Calculated MOS from RR for %s%x%s is %.1f", FMT_M(rr->from),
(double) ssb->mos / 10.0); (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 // 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; 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);
} }
} }

@ -0,0 +1,6 @@
F(mos)
F(jitter)
F(rtt_e2e)
F(rtt_dsct)
F(packetloss)
F(jitter_measured)

@ -115,6 +115,16 @@ struct interface_counter_stats {
#include "interface_counter_stats_fields.inc" #include "interface_counter_stats_fields.inc"
#undef F #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 local_intf {
struct intf_spec *spec; struct intf_spec *spec;
struct intf_address advertised_address; struct intf_address advertised_address;
@ -125,6 +135,7 @@ struct local_intf {
struct interface_counter_stats_dir stats_in, struct interface_counter_stats_dir stats_in,
stats_out; stats_out;
struct interface_counter_stats stats; struct interface_counter_stats stats;
struct interface_sampled_stats sampled_stats;
}; };
struct intf_list { struct intf_list {
struct local_intf *local_intf; struct local_intf *local_intf;

@ -19,6 +19,7 @@ struct rtp_payload_type;
struct ssrc_entry; struct ssrc_entry;
struct ssrc_entry_call; struct ssrc_entry_call;
enum ssrc_dir; 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_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 *); const struct timeval *);
void ssrc_receiver_rr_time(struct call_media *m, const struct ssrc_xr_rr_time *rr, void ssrc_receiver_rr_time(struct call_media *m, const struct ssrc_xr_rr_time *rr,
const struct timeval *); const struct timeval *);

@ -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); \ RTPE_GAUGE_SET_MIN_MAX(field, rtpe_sampled_graphite_min_max, num); \
} while (0) } while (0)
// TODO: ^ skip doing this for graphite if it's not actually enabled // 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; // total, cumulative, master
extern struct global_stats_counter rtpe_stats_rate; // per-second, calculated once per timer run extern struct global_stats_counter rtpe_stats_rate; // per-second, calculated once per timer run

Loading…
Cancel
Save