36 stats.registerMetric({.name =
"dummy_metric", .metricId =
DummyMetric});
38 REQUIRE_THROWS(stats.registerMetric({.name =
"dummy_metric", .metricId = DummyMetric2}));
40 REQUIRE_THROWS(stats.registerMetric({.name =
"dummy_metric2", .metricId = DummyMetric}));
42 REQUIRE_THROWS(stats.registerMetric({.name =
"", .metricId = ZeroSize}));
44 stats.registerMetric({.name =
"dummy_metric2", .metricId =
DummyMetric2});
45 REQUIRE(stats.metricsNames[
DummyMetric] ==
"dummy_metric");
46 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Add, 1});
47 REQUIRE_THROWS(stats.updateStats({Missing, DataProcessingStats::Op::Add, 1}));
48 REQUIRE(stats.nextCmd.load() == 1);
49 REQUIRE(stats.updatedMetricsLapse.load() == 1);
50 REQUIRE(stats.pushedMetricsLapse == 0);
51 REQUIRE(stats.publishedMetricsLapse == 0);
56 stats.processCommandQueue();
57 REQUIRE(stats.updatedMetricsLapse.load() == 1);
58 REQUIRE(stats.pushedMetricsLapse == 1);
59 REQUIRE(stats.publishedMetricsLapse == 0);
60 REQUIRE(stats.nextCmd.load() == 0);
65 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Add, 1});
66 REQUIRE(stats.nextCmd.load() == 1);
72 stats.processCommandQueue();
78 std::vector<std::string> updated;
80 updated.emplace_back(spec.
name);
83 stats.flushChangedMetrics(simpleFlush);
84 REQUIRE(stats.updatedMetricsLapse.load() == 2);
85 REQUIRE(stats.pushedMetricsLapse == 2);
86 REQUIRE(stats.publishedMetricsLapse == 1);
87 REQUIRE(updated.size() == 1);
88 REQUIRE(updated[0] ==
"dummy_metric");
89 stats.flushChangedMetrics(simpleFlush);
92 REQUIRE(updated.size() == 1);
93 REQUIRE(updated[0] ==
"dummy_metric");
94 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Sub, 1});
95 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Add, 2});
96 REQUIRE(stats.nextCmd.load() == 2);
97 stats.processCommandQueue();
98 REQUIRE(stats.updatedMetricsLapse.load() == 4);
99 REQUIRE(stats.pushedMetricsLapse == 4);
100 REQUIRE(stats.publishedMetricsLapse == 1);
101 REQUIRE(stats.nextCmd.load() == 0);
105 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Add, 2});
106 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Set, 1});
107 REQUIRE(stats.updatedMetricsLapse.load() == 6);
108 REQUIRE(stats.pushedMetricsLapse == 4);
109 REQUIRE(stats.publishedMetricsLapse == 1);
110 stats.processCommandQueue();
111 REQUIRE(stats.updatedMetricsLapse.load() == 6);
112 REQUIRE(stats.pushedMetricsLapse == 6);
113 REQUIRE(stats.publishedMetricsLapse == 1);
116 stats.flushChangedMetrics(simpleFlush);
121 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Set, 1});
122 stats.processCommandQueue();
123 REQUIRE(stats.updatedMetricsLapse.load() == 7);
124 REQUIRE(stats.pushedMetricsLapse == 6);
125 REQUIRE(stats.publishedMetricsLapse == 2);
129 REQUIRE(stats.nextCmd.load() == 0);
130 for (
size_t i = 0;
i < 65; ++
i) {
131 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Add, 1});
133 REQUIRE(stats.nextCmd.load() == 1);
136 stats.processCommandQueue();
137 stats.flushChangedMetrics(simpleFlush);
141 SECTION(
"Test all operations")
143 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Set, 100});
144 stats.processCommandQueue();
146 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Add, 1});
147 stats.processCommandQueue();
149 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Add, 3});
150 stats.processCommandQueue();
152 stats.flushChangedMetrics(simpleFlush);
153 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Add, 0});
154 stats.processCommandQueue();
158 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Sub, 1});
159 stats.processCommandQueue();
161 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Sub, 2});
162 stats.processCommandQueue();
164 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Min, 102});
165 stats.processCommandQueue();
167 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Min, 10});
168 stats.processCommandQueue();
170 stats.updateStats({
DummyMetric, DataProcessingStats::Op::SetIfPositive, 11});
171 stats.processCommandQueue();
173 stats.updateStats({
DummyMetric, DataProcessingStats::Op::SetIfPositive, -10});
174 stats.processCommandQueue();
213 auto realtimeConfigurator = [](int64_t& base, int64_t&
offset) {
217 auto cpuTimeConfigurator = [](int64_t base, int64_t
offset) -> int64_t {
218 static int count = 0;
219 int64_t
value[] = {0, 1000, 2000, 5000, 10000};
226 stats.registerMetric({.name =
"dummy_metric", .metricId =
DummyMetric, .kind = DataProcessingStats::Kind::Rate});
227 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 0);
228 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 0);
230 stats.updateStats({
DummyMetric, DataProcessingStats::Op::InstantaneousRate, 2000});
231 stats.processCommandQueue();
232 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 1000);
233 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 0);
235 stats.updateStats({
DummyMetric, DataProcessingStats::Op::InstantaneousRate, 2000});
236 stats.processCommandQueue();
237 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 1000);
238 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 0);
240 stats.updateStats({
DummyMetric, DataProcessingStats::Op::InstantaneousRate, 6000});
241 stats.processCommandQueue();
242 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 1000);
243 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 0);
246 stats.updateStats({
DummyMetric, DataProcessingStats::Op::InstantaneousRate, 5000});
247 stats.processCommandQueue();
248 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 1000);
249 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 0);
256 auto realtimeConfigurator = [](int64_t& base, int64_t&
offset) {
261 auto cpuTimeConfigurator = [&
count](int64_t base, int64_t
offset) -> int64_t {
262 int64_t
value[] = {0, 1000, 2000, 5000, 10000};
269 stats.registerMetric({.name =
"dummy_metric", .metricId =
DummyMetric, .kind = DataProcessingStats::Kind::Rate});
270 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 1000);
271 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 1000);
274 stats.updateStats({
DummyMetric, DataProcessingStats::Op::CumulativeRate, 2000});
275 stats.processCommandQueue();
276 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 1000);
277 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 1000);
280 stats.updateStats({
DummyMetric, DataProcessingStats::Op::CumulativeRate, 2000});
281 stats.processCommandQueue();
282 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 1000);
283 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 1000);
286 stats.updateStats({
DummyMetric, DataProcessingStats::Op::CumulativeRate, 6000});
287 stats.processCommandQueue();
288 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 1000);
289 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 1000);
292 stats.updateStats({
DummyMetric, DataProcessingStats::Op::CumulativeRate, 1000});
293 stats.processCommandQueue();
294 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 1000);
295 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 1000);
301 auto realtimeTimestamp = [](int64_t& base, int64_t&
offset) {
306 auto cpuTimeTimestamp = [&
count](int64_t base, int64_t
offset) -> int64_t {
307 int64_t
value[] = {0, 1000, 1001, 2001, 2002, 3000, 5000, 10000, 11000, 12000};
314 stats.registerMetric({.name =
"dummy_metric", .metricId =
DummyMetric, .minPublishInterval = 5000});
315 stats.registerMetric({.name =
"dummy_metric2", .metricId =
DummyMetric2, .minPublishInterval = 2000});
316 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 1000);
317 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 1000);
320 std::vector<std::string> updated;
322 updated.emplace_back(spec.
name);
326 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Set, 2000});
327 stats.updateStats({
DummyMetric2, DataProcessingStats::Op::Set, 1000});
328 REQUIRE(stats.updateInfos[0].timestamp == 1000);
329 REQUIRE(stats.updateInfos[1].timestamp == 2000);
330 stats.processCommandQueue();
333 stats.flushChangedMetrics(simpleFlush);
335 REQUIRE(updated.empty());
336 stats.flushChangedMetrics(simpleFlush);
338 REQUIRE(updated.size() == 1);
340 stats.flushChangedMetrics(simpleFlush);
341 REQUIRE(updated.size() == 1);
346 auto realtimeTimestamp = [](int64_t& base, int64_t&
offset) {
351 static int64_t timestamps[] = {0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 19000, 20000};
352 auto cpuTimeTimestamp = [&
count](int64_t base, int64_t
offset) -> int64_t {
359 stats.registerMetric({.name =
"dummy_metric", .metricId =
DummyMetric, .minPublishInterval = 3000, .maxRefreshLatency = 9000});
360 REQUIRE(stats.updateInfos[
DummyMetric].timestamp == 1000);
361 REQUIRE(stats.updateInfos[
DummyMetric].lastPublished == 1000);
364 std::vector<std::string> updated;
366 updated.emplace_back(spec.
name);
370 stats.updateStats({
DummyMetric, DataProcessingStats::Op::Set, 1000});
371 REQUIRE(stats.updateInfos[0].timestamp == 1000);
372 stats.flushChangedMetrics(simpleFlush);
374 REQUIRE(updated.empty());
375 stats.processCommandQueue();
376 stats.flushChangedMetrics(simpleFlush);
378 CHECK(updated.size() == 1);
379 stats.processCommandQueue();
380 stats.flushChangedMetrics(simpleFlush);
382 CHECK(updated.size() == 1);
383 stats.processCommandQueue();
384 stats.flushChangedMetrics(simpleFlush);
386 CHECK(updated.size() == 1);
387 stats.processCommandQueue();
388 stats.flushChangedMetrics(simpleFlush);
390 CHECK(updated.size() == 1);
391 stats.processCommandQueue();
392 stats.flushChangedMetrics(simpleFlush);
393 CHECK(updated.size() == 1);
395 stats.processCommandQueue();
396 stats.flushChangedMetrics(simpleFlush);
397 CHECK(updated.size() == 1);
399 stats.processCommandQueue();
400 stats.flushChangedMetrics(simpleFlush);
401 REQUIRE(updated.size() == 2);
402 REQUIRE(
count == 10);