diff --git a/scripts/base/frameworks/sumstats/non-cluster.bro b/scripts/base/frameworks/sumstats/non-cluster.bro index 97e1817598..9cf4041fc0 100644 --- a/scripts/base/frameworks/sumstats/non-cluster.bro +++ b/scripts/base/frameworks/sumstats/non-cluster.bro @@ -2,23 +2,47 @@ module SumStats; +event SumStats::process_epoch_result(ss: SumStat, now: time, data: ResultTable) + { + # TODO: is this the right processing group size? + local i = 50; + for ( key in data ) + { + ss$epoch_result(now, key, data[key]); + delete data[key]; + + if ( |data| == 0 ) + { + if ( ss?$epoch_finished ) + ss$epoch_finished(now); + + # Now that no data is left we can finish. + return; + } + + i = i-1; + if ( i == 0 ) + { + # TODO: is this the right interval? + schedule 0.01 secs { process_epoch_result(ss, now, data) }; + break; + } + } + } + event SumStats::finish_epoch(ss: SumStat) { if ( ss$name in result_store ) { - local now = network_time(); - if ( ss?$epoch_result ) { local data = result_store[ss$name]; - # TODO: don't block here. - for ( key in data ) - ss$epoch_result(now, key, data[key]); + event SumStats::process_epoch_result(ss, network_time(), data); } - if ( ss?$epoch_finished ) - ss$epoch_finished(now); - + # We can reset here because we know that the reference + # to the data will be maintained by the process_epoch_result + # event. reset(ss); } diff --git a/testing/btest/Baseline/scripts.base.frameworks.sumstats.basic/.stdout b/testing/btest/Baseline/scripts.base.frameworks.sumstats.basic/standalone..stdout similarity index 100% rename from testing/btest/Baseline/scripts.base.frameworks.sumstats.basic/.stdout rename to testing/btest/Baseline/scripts.base.frameworks.sumstats.basic/standalone..stdout diff --git a/testing/btest/scripts/base/frameworks/sumstats/basic.bro b/testing/btest/scripts/base/frameworks/sumstats/basic.bro index fb1254baca..6b153dfe39 100644 --- a/testing/btest/scripts/base/frameworks/sumstats/basic.bro +++ b/testing/btest/scripts/base/frameworks/sumstats/basic.bro @@ -1,5 +1,8 @@ -# @TEST-EXEC: bro %INPUT -# @TEST-EXEC: btest-diff .stdout +# @TEST-EXEC: btest-bg-run standalone bro %INPUT +# @TEST-EXEC: btest-bg-wait 5 +# @TEST-EXEC: btest-diff standalone/.stdout + +redef exit_only_after_terminate=T; event bro_init() &priority=5 { @@ -19,8 +22,9 @@ event bro_init() &priority=5 { local r = result["test.metric"]; print fmt("Host: %s - num:%d - sum:%.1f - var:%.1f - avg:%.1f - max:%.1f - min:%.1f - std_dev:%.1f - unique:%d - hllunique:%d", key$host, r$num, r$sum, r$variance, r$average, r$max, r$min, r$std_dev, r$unique, r$hll_unique); + terminate(); } - ]); + ]) SumStats::observe("test.metric", [$host=1.2.3.4], [$num=5]); SumStats::observe("test.metric", [$host=1.2.3.4], [$num=22]);