mirror of https://gerrit.osmocom.org/libosmocore
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
This commit is contained in:
parent
e90c7176be
commit
6a5940740a
|
@ -20,3 +20,4 @@ libosmocore osmo_stat_item API breakage: remove functions osmo_stat_item_get_ne
|
|||
libosmocore osmo_stat_item_value API breakage: struct definition removed, because no known users exist / no users should exist.
|
||||
libosmocore osmo_stat_item ABI breakage: struct osmo_stat_item made opaque.
|
||||
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.
|
||||
|
|
12
src/stats.c
12
src/stats.c
|
@ -700,15 +700,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,
|
||||
|
|
|
@ -443,10 +443,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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue