From 11da4a4abde8fa3db07492e7f6695667fe4c4be9 Mon Sep 17 00:00:00 2001 From: Oliver Smith Date: Thu, 19 Aug 2021 11:58:09 +0200 Subject: stats: send real last value if no new values come Background: * Individual values can be added to osmo_stat_item.values at any time. * Stats are reported at a fixed interval (see vty 'stats interval'), e.g. every 10 seconds. * In order to report a new stat value, we use the maximum of all osmo_stat_item.values added since the last report. * By default, we do not send new stat values if they did not change (see vty 'config-stats' -> 'flush-period' default of 0). Fix the following bug: * If 'flush-period' is 0, and no new osmo_stat_item.values are coming in, the last value that gets reported is not necessarily the last entry in osmo_stat_item.values. * For attached reporters (statsd), it could then be that the given stat stays at the wrong value for a long stretch of time (think of several hours/days/forever). Explanation of how the test shows that it is fixed: * stats get reported (value is irrelevant) * osmo_stat_item gets a new value: 20 * osmo_stat_item gets a new value: 10 * stats get reported (value: 20, the maximum of both new values) * osmo_stat_item gets no new values * stats get reported (value: 10, this is new because of the bug fix, the real last value in osmo_stat_item, different from the 20 sent earlier, without the fix it would not send anything here and the last sent value would be 20) * osmo_stat_item gets no new values * stats get reported (nothing gets sent, since the real last value was already sent and 'flush-period' is 0) Fixes: OS#5215 Change-Id: Ibeefd0e3d1dbe4be454ff05a21df4848b2abfabe --- src/stats.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src/stats.c') diff --git a/src/stats.c b/src/stats.c index 411ecff9..f06515dd 100644 --- a/src/stats.c +++ b/src/stats.c @@ -715,6 +715,11 @@ static int osmo_stat_item_handler( if (!have_value) { /* Send the last value in case a flush is requested */ value = osmo_stat_item_get_last(item); + + /* Also send it in case a different max value was sent + * previously (OS#5215) */ + if (!item->stats_last_sent_was_max) + have_value = 1; } else { int32_t next_val; /* If we have multiple values only send the max */ @@ -722,6 +727,8 @@ static int osmo_stat_item_handler( value = OSMO_MAX(value, next_val); } + item->stats_last_sent_was_max = (osmo_stat_item_get_last(item) == value); + llist_for_each_entry(srep, &osmo_stats_reporter_list, list) { if (!srep->running) continue; -- cgit v1.2.3