Skip to content

Commit 10c9602

Browse files
committed
[OMON-443] Make derived metric tests deterministic (#240)
1 parent f1f5062 commit 10c9602

File tree

1 file changed

+93
-72
lines changed

1 file changed

+93
-72
lines changed

test/testDerived.cxx

Lines changed: 93 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
#include "../src/VariantVisitorAdd.h"
1414
#include "../src/VariantVisitorRate.h"
1515
#include <chrono>
16-
#include <thread>
1716
#include <vector>
1817
#include <iostream>
1918

@@ -28,100 +27,134 @@ namespace monitoring
2827
namespace Test
2928
{
3029

31-
BOOST_AUTO_TEST_CASE(derivedRateInt)
30+
using namespace o2::monitoring;
31+
32+
struct ResultsKv {
33+
unsigned short int value;
34+
unsigned short int result;
35+
};
36+
37+
BOOST_AUTO_TEST_CASE(testDerivedRateForInts)
3238
{
33-
struct RateResults {
34-
int value;
35-
int rate;
36-
};
37-
std::vector<RateResults> results = {{10, 0}, {20, 100}, {30, 100}, {50, 200}, {60, 100}, {65, 50}, {70, 50}, {80, 100}, {90, 100}, {100, 100}};
38-
o2::monitoring::DerivedMetrics derivedHandler;
39+
auto timestamp = std::chrono::system_clock::now();
40+
std::vector<ResultsKv> valResKv = {{10, 0}, {20, 10}, {30, 10}, {50, 20}, {60, 10}, {65, 5}, {70, 5}, {80, 10}, {90, 10}};
41+
DerivedMetrics derivedHandler;
3942
std::string name("metricInt");
4043

41-
for (auto const result : results) {
44+
for (auto const valRes : valResKv) {
4245
try {
43-
std::this_thread::sleep_for(std::chrono::milliseconds(100));
44-
o2::monitoring::Metric metric(result.value, name);
46+
Metric metric(name, Metric::DefaultVerbosity, timestamp);
47+
metric.addValue(valRes.value, "value");
4548
derivedHandler.process(metric, DerivedMetricMode::RATE);
4649
BOOST_CHECK_EQUAL(metric.getName(), "metricInt");
4750
BOOST_CHECK_EQUAL(metric.getValues().back().first, "value_rate");
48-
BOOST_WARN_CLOSE(std::get<double>(metric.getValues().back().second), result.rate, 1.0);
51+
BOOST_CHECK_EQUAL(std::get<double>(metric.getValues().back().second), valRes.result);
52+
timestamp += std::chrono::seconds(1);
4953
} catch (MonitoringException& e) {
5054
BOOST_CHECK_EQUAL(e.what(), std::string("Not enough values"));
5155
}
5256
}
5357
}
5458

55-
BOOST_AUTO_TEST_CASE(derivedRateInt_newRun)
59+
BOOST_AUTO_TEST_CASE(testDerivedRateForIntsAndResetValue)
5660
{
57-
struct RateResults {
58-
int value;
59-
int rate;
60-
};
61-
std::vector<RateResults> results = {{10, 0}, {20, 100}, {30, 100}, {50, 200}, {0, 0}, {10, 100}, {20, 100}, {30, 100}, {50, 200}};
62-
o2::monitoring::DerivedMetrics derivedHandler;
61+
std::vector<ResultsKv> valResKv = {{10, 0}, {20, 10}, {30, 10}, {50, 20}, {0, 0}, {10, 10}, {20, 10}, {30, 10}, {50, 20}};
62+
DerivedMetrics derivedHandler;
6363
std::string name("metricInt");
64+
auto timestamp = std::chrono::system_clock::now();
6465

65-
for (auto const result : results) {
66+
for (auto const valRes : valResKv) {
6667
try {
67-
std::this_thread::sleep_for(std::chrono::milliseconds(100));
68-
o2::monitoring::Metric metric(result.value, name);
68+
Metric metric(name, Metric::DefaultVerbosity, timestamp);
69+
metric.addValue(valRes.value, "value");
6970
derivedHandler.process(metric, DerivedMetricMode::RATE);
7071
BOOST_CHECK_EQUAL(metric.getName(), "metricInt");
7172
BOOST_CHECK_EQUAL(metric.getValues().back().first, "value_rate");
72-
BOOST_WARN_CLOSE(std::get<double>(metric.getValues().back().second), result.rate, 1.0);
73+
BOOST_CHECK_EQUAL(std::get<double>(metric.getValues().back().second), valRes.result);
74+
timestamp += std::chrono::seconds(1);
7375
} catch (MonitoringException& e) {
7476
BOOST_CHECK_EQUAL(e.what(), std::string("Not enough values"));
7577
}
7678
}
7779
}
7880

79-
BOOST_AUTO_TEST_CASE(derivedRateDouble)
81+
struct ResultsKvDouble {
82+
double value;
83+
double result;
84+
};
85+
86+
BOOST_AUTO_TEST_CASE(testDerivedRateForDoubles)
8087
{
81-
struct RateResults {
82-
double value;
83-
double rate;
84-
};
85-
std::vector<RateResults> results = {{1.2, 0}, {11.2, 100}, {21.2, 100}, {41.2, 200}, {51.2, 100}, {61, 98}};
86-
std::vector<RateResults> resultsTagged = {{0.5, 0}, {5.5, 50}, {10.5, 50}, {20.5, 100}, {40.5, 200}, {45.5, 50}};
88+
std::vector<ResultsKvDouble> valResKv = {{1.2, 0}, {11.2, 10}, {21.2, 10}, {41.2, 20}, {51.2, 10}, {61, 9.8}};
8789
o2::monitoring::DerivedMetrics derivedHandler;
8890
std::string name("metricDouble");
89-
for (std::size_t i = 0; i < results.size(); i++) {
91+
auto timestamp = std::chrono::system_clock::now();
92+
93+
for (auto const valRes : valResKv) {
9094
try {
91-
std::this_thread::sleep_for(std::chrono::milliseconds(100));
92-
o2::monitoring::Metric metric(results[i].value, name);
93-
o2::monitoring::Metric metricTagged = Metric{resultsTagged[i].value, name}.addTag(o2::monitoring::tags::Key::Subsystem, o2::monitoring::tags::Value::Readout);
95+
Metric metric(name, Metric::DefaultVerbosity, timestamp);
96+
metric.addValue(valRes.value, "value");
9497
derivedHandler.process(metric, DerivedMetricMode::RATE);
95-
derivedHandler.process(metricTagged, DerivedMetricMode::RATE);
9698
BOOST_CHECK_EQUAL(metric.getName(), "metricDouble");
97-
BOOST_WARN_CLOSE(std::get<double>(metric.getValues().back().second), results[i].rate, 1.0);
99+
BOOST_CHECK_CLOSE(std::get<double>(metric.getValues().back().second), valRes.result, 0.1);
98100
BOOST_CHECK_EQUAL(metric.getValues().back().first, "value_rate");
99-
BOOST_WARN_CLOSE(std::get<double>(metricTagged.getValues().back().second), resultsTagged[i].rate, 1.0);
100-
BOOST_CHECK_EQUAL(metricTagged.getValues().back().first, "value_rate");
101+
timestamp += std::chrono::seconds(1);
101102
} catch (MonitoringException& e) {
102103
BOOST_CHECK_EQUAL(e.what(), std::string("Not enough values"));
103104
}
104105
}
105106
}
106107

107-
BOOST_AUTO_TEST_CASE(derivedRateUint64_t)
108+
BOOST_AUTO_TEST_CASE(testDerivedRateForDoublesWhenUsingTags)
108109
{
109-
struct RateResults {
110-
uint64_t value;
111-
uint64_t rate;
112-
};
113-
std::vector<RateResults> results = {{165535, 0}, {165545, 100}, {165555, 100}, {165575, 200}, {165585, 100}, {165590, 50}};
110+
std::vector<ResultsKvDouble> valResKv1 = {{1.2, 0}, {11.2, 10}, {21.2, 10}, {41.2, 20}, {51.2, 10}, {61, 9.8}};
111+
std::vector<ResultsKvDouble> valResKv2 = {{0.5, 0}, {5.5, 5}, {10.5, 5}, {20.5, 10}, {40.5, 20}, {45.5, 5}};
114112
o2::monitoring::DerivedMetrics derivedHandler;
113+
std::string name("metricDouble");
114+
auto timestamp = std::chrono::system_clock::now();
115+
116+
for (std::size_t i = 0; i < valResKv1.size(); i++) {
117+
try {
118+
Metric metric1(name, Metric::DefaultVerbosity, timestamp);
119+
metric1.addValue(valResKv1[i].value, "value");
120+
121+
Metric metric2(name, Metric::DefaultVerbosity, timestamp);
122+
metric2.addValue(valResKv2[i].value, "value");
123+
metric2.addTag(o2::monitoring::tags::Key::Subsystem, o2::monitoring::tags::Value::Readout);
124+
125+
derivedHandler.process(metric1, DerivedMetricMode::RATE);
126+
derivedHandler.process(metric2, DerivedMetricMode::RATE);
127+
128+
BOOST_CHECK_CLOSE(std::get<double>(metric1.getValues().back().second), valResKv1[i].result, 0.1);
129+
BOOST_CHECK_CLOSE(std::get<double>(metric2.getValues().back().second), valResKv2[i].result, 0.1);
130+
timestamp += std::chrono::seconds(1);
131+
} catch (MonitoringException& e) {
132+
BOOST_CHECK_EQUAL(e.what(), std::string("Not enough values"));
133+
}
134+
}
135+
}
136+
137+
struct ResultsKvUint64_t {
138+
uint64_t value;
139+
uint64_t result;
140+
};
141+
142+
BOOST_AUTO_TEST_CASE(testDerivedRateForUint64_t)
143+
{
144+
std::vector<ResultsKvUint64_t> valResKv = {{165535, 0}, {165545, 10}, {165555, 10}, {165575, 20}, {165585, 10}, {165590, 5}};
145+
DerivedMetrics derivedHandler;
115146
std::string name("metricUint64_t");
147+
auto timestamp = std::chrono::system_clock::now();
116148

117-
for (auto const result : results) {
149+
for (auto const valRes : valResKv) {
118150
try {
119-
std::this_thread::sleep_for(std::chrono::milliseconds(100));
120-
o2::monitoring::Metric metric(result.value, name);
151+
Metric metric(name, Metric::DefaultVerbosity, timestamp);
152+
metric.addValue(valRes.value, "value");
121153
derivedHandler.process(metric, DerivedMetricMode::RATE);
122154
BOOST_CHECK_EQUAL(metric.getName(), "metricUint64_t");
123155
BOOST_CHECK_EQUAL(metric.getValues().back().first, "value_rate");
124-
BOOST_WARN_CLOSE(std::get<double>(metric.getValues().back().second), result.rate, 1.0);
156+
BOOST_CHECK_EQUAL(std::get<double>(metric.getValues().back().second), valRes.result);
157+
timestamp += std::chrono::seconds(1);
125158
} catch (MonitoringException& e) {
126159
BOOST_CHECK_EQUAL(e.what(), std::string("Not enough values"));
127160
}
@@ -149,51 +182,39 @@ BOOST_AUTO_TEST_CASE(divisionByZero)
149182

150183
BOOST_AUTO_TEST_CASE(derivedIncrementInt)
151184
{
152-
struct IncrementResults {
153-
int value;
154-
int increment;
155-
};
156-
std::vector<IncrementResults> results = {{10, 10}, {20, 30}, {30, 60}, {50, 110}, {60, 170}, {65, 235}, {70, 305}, {80, 385}, {90, 475}, {100, 575}};
157-
o2::monitoring::DerivedMetrics derivedHandler;
185+
std::vector<ResultsKv> results = {{10, 10}, {20, 30}, {30, 60}, {50, 110}, {60, 170}, {65, 235}, {70, 305}, {80, 385}, {90, 475}, {100, 575}};
186+
DerivedMetrics derivedHandler;
158187
std::string name("metricInt");
159188
for (auto const result : results) {
160-
o2::monitoring::Metric metric(result.value, name);
189+
Metric metric(result.value, name);
161190
derivedHandler.process(metric, DerivedMetricMode::INCREMENT);
162-
BOOST_CHECK_EQUAL(std::get<int>(metric.getValues().back().second), result.increment);
191+
BOOST_CHECK_EQUAL(std::get<int>(metric.getValues().back().second), result.result);
163192
BOOST_CHECK_EQUAL(metric.getValues().back().first, "value_increment");
164193
}
165194
}
166195

167196
BOOST_AUTO_TEST_CASE(derivedIncrementUint64_t)
168197
{
169-
struct IncrementResults {
170-
uint64_t value;
171-
uint64_t rate;
172-
};
173-
std::vector<IncrementResults> results = {{5, 5}, {165535, 165540}, {15, 165555}, {50, 165605}, {165590, 331195}};
174-
o2::monitoring::DerivedMetrics derivedHandler;
198+
std::vector<ResultsKvUint64_t> results = {{5, 5}, {165535, 165540}, {15, 165555}, {50, 165605}, {165590, 331195}};
199+
DerivedMetrics derivedHandler;
175200
std::string name("metricUint64_t");
176201
for (auto const result : results) {
177-
o2::monitoring::Metric metric(result.value, name);
202+
Metric metric(result.value, name);
178203
derivedHandler.process(metric, DerivedMetricMode::INCREMENT);
179-
BOOST_CHECK_EQUAL(std::get<uint64_t>(metric.getValues().back().second), result.rate);
204+
BOOST_CHECK_EQUAL(std::get<uint64_t>(metric.getValues().back().second), result.result);
180205
BOOST_CHECK_EQUAL(metric.getValues().back().first, "value_increment");
181206
}
182207
}
183208

184209
BOOST_AUTO_TEST_CASE(derivedIncrementDouble)
185210
{
186-
struct IncrementResults {
187-
double value;
188-
double rate;
189-
};
190-
std::vector<IncrementResults> results = {{1.2, 1.2}, {11.2, 12.4}, {21.2, 33.6}, {41.2, 74.8}, {51.2, 126}, {61, 187}};
191-
o2::monitoring::DerivedMetrics derivedHandler;
211+
std::vector<ResultsKvDouble> results = {{1.2, 1.2}, {11.2, 12.4}, {21.2, 33.6}, {41.2, 74.8}, {51.2, 126}, {61, 187}};
212+
DerivedMetrics derivedHandler;
192213
std::string name("metricDouble");
193214
for (auto const result : results) {
194-
o2::monitoring::Metric metric(result.value, name);
215+
Metric metric(result.value, name);
195216
derivedHandler.process(metric, DerivedMetricMode::INCREMENT);
196-
BOOST_CHECK_CLOSE(std::get<double>(metric.getValues().back().second), result.rate, 0.01);
217+
BOOST_CHECK_CLOSE(std::get<double>(metric.getValues().back().second), result.result, 0.01);
197218
BOOST_CHECK_EQUAL(metric.getValues().back().first, "value_increment");
198219
}
199220
}

0 commit comments

Comments
 (0)