From 49cf58e1516edc104842d49cea48786ffcbebfc1 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Tue, 14 Sep 2021 21:49:00 +0200 Subject: refactor stat_item: report only changed values Change the functionality of skipping unchanged values: instead of looking up whether new values have been set on a stat item, rather remember the last reported value and skip reporting identical values. stats_test.c shows that previously, a stat item reported a value of 10 again, even though the previous report had already sent a value of 10. That's just because the value 10 was explicitly set again, internally. From a perspective of preserving all data points, it could make sense to send consecutive identical values. But since we already collapse all data points per reporting period into a max, that is pointless. Related: SYS#5542 Change-Id: I8f4cf34dfed17e0879716fa2cbeee137c158978b --- TODO-RELEASE | 1 + src/stats.c | 12 ++++-------- tests/stats/stats_test.c | 4 ++-- tests/stats/stats_test.err | 6 ++---- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/TODO-RELEASE b/TODO-RELEASE index 855ceaa0..45371db5 100644 --- a/TODO-RELEASE +++ b/TODO-RELEASE @@ -17,3 +17,4 @@ libosmocore struct rate_ctr_group, osmo_stat_item_group_desc ABI breakage du libosmgsm kdf functions New API libosmocore osmo_stat_item API change and ABI breakage due to new struct members; some osmo_stat_item API deprecated. libosmocore osmo_stat_item No FIFO buffer of values used anymore, the "skipped values" error is no longer possible. +libosmocore stats reporting for osmo_stat_item, values are now never repeated from one stats report to the next. diff --git a/src/stats.c b/src/stats.c index f9a3bbcc..41b2a6a3 100644 --- a/src/stats.c +++ b/src/stats.c @@ -698,15 +698,11 @@ static int osmo_stat_item_handler( if (!srep->running) continue; - /* If no new stat values have been set in the current reporting period, skip resending the value. - * However, if the previously sent value is not the same as the current value, then do send the changed - * value (while n == 0, the last value from the previous reporting period is in item->value.max == .last - * == .min, which was put in new_value above). - * Also if the stats reporter is set to resend all values, also do resend the current value regardless - * of repetitions. + /* If the previously reported value is the same as the current value, skip resending the value. + * However, if the stats reporter is set to resend all values, do resend the current value regardless of + * repetitions. */ - if ((!item->value.n && new_value == prev_reported_value) - && !srep->force_single_flush) + if (new_value == prev_reported_value && !srep->force_single_flush) continue; if (!osmo_stats_reporter_check_config(srep, diff --git a/tests/stats/stats_test.c b/tests/stats/stats_test.c index 23025d16..48318a51 100644 --- a/tests/stats/stats_test.c +++ b/tests/stats/stats_test.c @@ -449,10 +449,10 @@ static void test_reporting() osmo_stat_item_set(osmo_stat_item_group_get_item(statg1, TEST_A_ITEM), 10); do_report(0, 2); - fprintf(stderr, "report (group 1, item 1 update twice):\n"); + fprintf(stderr, "report (group 1, item 1 update twice, with same value):\n"); osmo_stat_item_set(osmo_stat_item_group_get_item(statg1, TEST_A_ITEM), 10); osmo_stat_item_set(osmo_stat_item_group_get_item(statg1, TEST_A_ITEM), 10); - do_report(0, 2); + do_report(0, 0); fprintf(stderr, "report (group 1, item 1 update twice, check max):\n"); osmo_stat_item_set(osmo_stat_item_group_get_item(statg1, TEST_A_ITEM), 20); diff --git a/tests/stats/stats_test.err b/tests/stats/stats_test.err index a890e0fa..1e604d19 100644 --- a/tests/stats/stats_test.err +++ b/tests/stats/stats_test.err @@ -114,10 +114,8 @@ report (group 1, item 1 update): test2: item p= g=test.one i=1 n=item.a v=10 u=ma test1: item p= g=test.one i=1 n=item.a v=10 u=ma reported: 0 counter vals, 2 stat item vals -report (group 1, item 1 update twice): - test2: item p= g=test.one i=1 n=item.a v=10 u=ma - test1: item p= g=test.one i=1 n=item.a v=10 u=ma -reported: 0 counter vals, 2 stat item vals +report (group 1, item 1 update twice, with same value): +reported: 0 counter vals, 0 stat item vals report (group 1, item 1 update twice, check max): test2: item p= g=test.one i=1 n=item.a v=20 u=ma test1: item p= g=test.one i=1 n=item.a v=20 u=ma -- cgit v1.2.3