aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2021-09-14 21:49:00 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2021-09-20 15:05:51 +0200
commitfcca9fed8656d139a0a982cd998c72c3aeb9b121 (patch)
tree909951e3735436fe44c4b84b28b1e1a06196441a
parent3130dda2dd45326b99c088460449999b0b6e74f4 (diff)
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
-rw-r--r--TODO-RELEASE1
-rw-r--r--src/stats.c12
-rw-r--r--tests/stats/stats_test.c4
-rw-r--r--tests/stats/stats_test.err6
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 f5cf2e8f..261daa56 100644
--- a/tests/stats/stats_test.c
+++ b/tests/stats/stats_test.c
@@ -441,10 +441,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