From 8b79a6074f3b720f8ddde220f6bc4b016dc79d6e Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Wed, 29 Dec 2021 11:03:50 -0500 Subject: [PATCH] TT#156052 add call duration stddev metric Change-Id: Idb8cf304323ba33e1cdbd4dbe343dc508041cc93 --- daemon/statistics.c | 18 ++++++---- include/counter_stats_fields.inc | 1 + t/test-stats.c | 56 ++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/daemon/statistics.c b/daemon/statistics.c index 75949cd1e..f9da9c3f9 100644 --- a/daemon/statistics.c +++ b/daemon/statistics.c @@ -177,6 +177,8 @@ void statistics_update_oneway(struct call* c) { c->destroyed = rtpe_now; long long duration = timeval_diff(&c->destroyed, &c->created); RTPE_STATS_ADD(call_duration, duration); + duration /= 1000; // millisecond precision for the squared value to avoid overflows + RTPE_STATS_ADD(call_duration2, duration * duration); } if (ml->term_reason==FINAL_TIMEOUT) @@ -328,7 +330,6 @@ void statistics_update_oneway(struct call* c) { GQueue *statistics_gather_metrics(void) { GQueue *ret = g_queue_new(); - struct timeval avg; double calls_dur_iv; uint64_t cur_sessions, num_sessions, min_sess_iv, max_sess_iv; @@ -390,8 +391,7 @@ GQueue *statistics_gather_metrics(void) { num_sessions = atomic64_get(&rtpe_stats_cumulative.managed_sess); uint64_t total_duration = atomic64_get(&rtpe_stats_cumulative.call_duration); - long long avg_us = num_sessions ? total_duration / num_sessions : 0; - timeval_from_us(&avg, avg_us); + uint64_t avg_us = num_sessions ? total_duration / num_sessions : 0; HEADER("}", ""); HEADER("totalstatistics", "Total statistics (does not include current running sessions):"); @@ -464,13 +464,19 @@ GQueue *statistics_gather_metrics(void) { PROM("zero_packet_streams_total", "counter"); METRIC("onewaystreams", "Total number of 1-way streams", UINT64F, UINT64F,atomic64_get(&rtpe_stats_cumulative.oneway_stream_sess)); PROM("one_way_sessions_total", "counter"); - METRICva("avgcallduration", "Average call duration", "%" TIME_T_INT_FMT ".%06" TIME_T_INT_FMT, "%" TIME_T_INT_FMT ".%06" TIME_T_INT_FMT " seconds", avg.tv_sec, avg.tv_usec); + METRICva("avgcallduration", "Average call duration", "%.6f", "%.6f seconds", (double) avg_us / 1000000.0); PROM("call_duration_avg", "gauge"); - calls_dur_iv = (double) total_duration / 1000000.0; - METRICva("totalcallsduration", "Total calls duration", "%.6f", "%.6f seconds", calls_dur_iv); + METRICva("totalcallsduration", "Total calls duration", "%.6f", "%.6f seconds", (double) total_duration / 1000000.0); PROM("call_duration_total", "counter"); + total_duration = atomic64_get(&rtpe_stats_cumulative.call_duration2); + METRICva("totalcallsduration2", "Total calls duration squared", "%.6f", "%.6f seconds squared", (double) total_duration / 1000000.0); + PROM("call_duration2_total", "counter"); + + double variance = num_sessions ? fabs((double) total_duration / (double) num_sessions - ((double) avg_us / 1000.0) * ((double) avg_us / 1000.0)) : 0.0; + METRICva("totalcallsduration_stddev", "Total calls duration standard deviation", "%.6f", "%.6f seconds", sqrt(variance) / 1000.0); + calls_dur_iv = (double) atomic64_get_na(&rtpe_stats_graphite_interval.total_calls_duration_intv) / 1000000.0; min_sess_iv = atomic64_get(&rtpe_stats_gauge_graphite_min_max_interval.min.total_sessions); max_sess_iv = atomic64_get(&rtpe_stats_gauge_graphite_min_max_interval.max.total_sessions); diff --git a/include/counter_stats_fields.inc b/include/counter_stats_fields.inc index 48ab64058..5f7cb93b2 100644 --- a/include/counter_stats_fields.inc +++ b/include/counter_stats_fields.inc @@ -17,6 +17,7 @@ F(forced_term_sess) F(nopacket_relayed_sess) F(oneway_stream_sess) F(call_duration) +F(call_duration2) F(total_calls_duration_intv) F(mos) F(mos2) diff --git a/t/test-stats.c b/t/test-stats.c index 4215d6921..1adb5baf3 100644 --- a/t/test-stats.c +++ b/t/test-stats.c @@ -434,6 +434,14 @@ int main(void) { "totalcallsduration\n" "0.000000 seconds\n" "0.000000\n" + "Total calls duration squared\n" + "totalcallsduration2\n" + "0.000000 seconds squared\n" + "0.000000\n" + "Total calls duration standard deviation\n" + "totalcallsduration_stddev\n" + "0.000000 seconds\n" + "0.000000\n" "\n" "\n" "}\n" @@ -1303,6 +1311,14 @@ int main(void) { "totalcallsduration\n" "0.000000 seconds\n" "0.000000\n" + "Total calls duration squared\n" + "totalcallsduration2\n" + "0.000000 seconds squared\n" + "0.000000\n" + "Total calls duration standard deviation\n" + "totalcallsduration_stddev\n" + "0.000000 seconds\n" + "0.000000\n" "\n" "\n" "}\n" @@ -2169,6 +2185,14 @@ int main(void) { "totalcallsduration\n" "0.000000 seconds\n" "0.000000\n" + "Total calls duration squared\n" + "totalcallsduration2\n" + "0.000000 seconds squared\n" + "0.000000\n" + "Total calls duration standard deviation\n" + "totalcallsduration_stddev\n" + "0.000000 seconds\n" + "0.000000\n" "\n" "\n" "}\n" @@ -3048,6 +3072,14 @@ int main(void) { "totalcallsduration\n" "0.000000 seconds\n" "0.000000\n" + "Total calls duration squared\n" + "totalcallsduration2\n" + "0.000000 seconds squared\n" + "0.000000\n" + "Total calls duration standard deviation\n" + "totalcallsduration_stddev\n" + "0.000000 seconds\n" + "0.000000\n" "\n" "\n" "}\n" @@ -3922,6 +3954,14 @@ int main(void) { "totalcallsduration\n" "0.000000 seconds\n" "0.000000\n" + "Total calls duration squared\n" + "totalcallsduration2\n" + "0.000000 seconds squared\n" + "0.000000\n" + "Total calls duration standard deviation\n" + "totalcallsduration_stddev\n" + "0.000000 seconds\n" + "0.000000\n" "\n" "\n" "}\n" @@ -4791,6 +4831,14 @@ int main(void) { "totalcallsduration\n" "0.000000 seconds\n" "0.000000\n" + "Total calls duration squared\n" + "totalcallsduration2\n" + "0.000000 seconds squared\n" + "0.000000\n" + "Total calls duration standard deviation\n" + "totalcallsduration_stddev\n" + "0.000000 seconds\n" + "0.000000\n" "\n" "\n" "}\n" @@ -5662,6 +5710,14 @@ int main(void) { "totalcallsduration\n" "186.000000 seconds\n" "186.000000\n" + "Total calls duration squared\n" + "totalcallsduration2\n" + "22298.000000 seconds squared\n" + "22298.000000\n" + "Total calls duration standard deviation\n" + "totalcallsduration_stddev\n" + "50.000000 seconds\n" + "50.000000\n" "\n" "\n" "}\n"