Project
Loading...
Searching...
No Matches
test_ResourcesMonitoringHelpers.cxx
Go to the documentation of this file.
1// Copyright 2019-2025 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
12#include "../src/ResourcesMonitoringHelper.h"
15
16#include <catch_amalgamated.hpp>
17#include <regex>
18#include <sstream>
19#include <iostream>
20
21TEST_CASE("StreamMetrics")
22{
23 using namespace o2::framework;
24 std::vector<DeviceSpec> specs{
26 .name = "someDevice",
27 .id = "someDevice",
28 .inputChannels = {},
29 .outputChannels = {},
30 .arguments = {},
31 .options = {},
32 .services = {},
33 .algorithm = AlgorithmSpec{},
34 .inputs = {},
35 .outputs = {},
36 .forwards = {},
37 .rank = 0,
38 .nSlots = 0,
39 .inputTimesliceId = 0,
40 .maxInputTimeslices = 0,
41 .completionPolicy = CompletionPolicy{},
42 .dispatchPolicy = DispatchPolicy{},
43 .callbacksPolicy = CallbacksPolicy{},
44 .sendingPolicy = SendingPolicy{},
45 .resourcePolicy = ResourcePolicy{},
46 .resource = {},
47 .resourceMonitoringInterval = 10,
48 .labels = {},
49 .metadata = {}},
51 .name = "anotherDevice",
52 .id = "anotherDevice",
53 .inputChannels = {},
54 .outputChannels = {},
55 .arguments = {},
56 .options = {},
57 .services = {},
58 .algorithm = AlgorithmSpec{},
59 .inputs = {},
60 .outputs = {},
61 .forwards = {},
62 .rank = 0,
63 .nSlots = 0,
64 .inputTimesliceId = 0,
65 .maxInputTimeslices = 0,
66 .completionPolicy = CompletionPolicy{},
67 .dispatchPolicy = DispatchPolicy{},
68 .callbacksPolicy = CallbacksPolicy{},
69 .sendingPolicy = SendingPolicy{},
70 .resourcePolicy = ResourcePolicy{},
71 .resource = {},
72 .resourceMonitoringInterval = 10,
73 .labels = {},
74 .metadata = {}},
75
76 };
77
78 // This is the device metrics
79 std::vector<DeviceMetricsInfo> metrics;
80 metrics.resize(2);
81 {
82 DeviceMetricsInfo& info = metrics[0];
83 auto bkey = DeviceMetricsHelper::createNumericMetric<int>(info, "bkey");
84 REQUIRE(info.metricLabels.size() == 1);
85 REQUIRE(info.metricPrefixes.size() == 1);
86 auto akey = DeviceMetricsHelper::createNumericMetric<float>(info, "akey");
87 REQUIRE(info.metricLabels.size() == 2);
88 REQUIRE(info.metricPrefixes.size() == 2);
89 auto ckey = DeviceMetricsHelper::createNumericMetric<uint64_t>(info, "ckey");
90 REQUIRE(info.metricLabels.size() == 3);
91 REQUIRE(info.metricPrefixes.size() == 3);
92 REQUIRE(DeviceMetricsHelper::metricIdxByName("akey", info) == 1);
93 REQUIRE(DeviceMetricsHelper::metricIdxByName("bkey", info) == 0);
94 REQUIRE(DeviceMetricsHelper::metricIdxByName("ckey", info) == 2);
95 REQUIRE(info.changed.size() == 3);
96 REQUIRE(info.changed.at(0) == false);
97 size_t t = 1000;
98 ckey(info, 0, t++);
99 ckey(info, 1, t++);
100 ckey(info, 2, t++);
101 ckey(info, 3, t++);
102 ckey(info, 4, t++);
103 ckey(info, 5, t++);
104 }
105 // Metrics for the second device
106 {
107 DeviceMetricsInfo& info = metrics[1];
108 auto bkey = DeviceMetricsHelper::createNumericMetric<int>(info, "bkey");
109 REQUIRE(info.metricLabels.size() == 1);
110 REQUIRE(info.metricPrefixes.size() == 1);
111 auto akey = DeviceMetricsHelper::createNumericMetric<float>(info, "akey");
112 REQUIRE(info.metricLabels.size() == 2);
113 REQUIRE(info.metricPrefixes.size() == 2);
114 auto ckey = DeviceMetricsHelper::createNumericMetric<uint64_t>(info, "ckey");
115 REQUIRE(info.metricLabels.size() == 3);
116 REQUIRE(info.metricPrefixes.size() == 3);
117 REQUIRE(DeviceMetricsHelper::metricIdxByName("akey", info) == 1);
118 REQUIRE(DeviceMetricsHelper::metricIdxByName("bkey", info) == 0);
119 REQUIRE(DeviceMetricsHelper::metricIdxByName("ckey", info) == 2);
120 REQUIRE(info.changed.size() == 3);
121 REQUIRE(info.changed.at(0) == false);
122 size_t t = 1000;
123 bkey(info, 0, t++);
124 bkey(info, 1, t++);
125 bkey(info, 2, t++);
126 bkey(info, 3, t++);
127 bkey(info, 4, t++);
128 bkey(info, 5, t++);
129 }
130
131 // This is the driver metrics
132 DeviceMetricsInfo driverMetrics;
133 auto dbkey = DeviceMetricsHelper::createNumericMetric<int>(driverMetrics, "bkey");
134 REQUIRE(driverMetrics.metricLabels.size() == 1);
135 REQUIRE(driverMetrics.metricPrefixes.size() == 1);
136 auto dakey = DeviceMetricsHelper::createNumericMetric<float>(driverMetrics, "akey");
137 REQUIRE(driverMetrics.metricLabels.size() == 2);
138 REQUIRE(driverMetrics.metricPrefixes.size() == 2);
139 auto dckey = DeviceMetricsHelper::createNumericMetric<uint64_t>(driverMetrics, "ckey");
140 REQUIRE(driverMetrics.metricLabels.size() == 3);
141 REQUIRE(driverMetrics.metricPrefixes.size() == 3);
142 REQUIRE(DeviceMetricsHelper::metricIdxByName("akey", driverMetrics) == 1);
143 REQUIRE(DeviceMetricsHelper::metricIdxByName("bkey", driverMetrics) == 0);
144 REQUIRE(DeviceMetricsHelper::metricIdxByName("ckey", driverMetrics) == 2);
145 REQUIRE(driverMetrics.changed.size() == 3);
146 REQUIRE(driverMetrics.changed.at(0) == false);
147 size_t t = 2000;
148 dbkey(driverMetrics, 0, t++);
149 dbkey(driverMetrics, 1, t++);
150 dbkey(driverMetrics, 2, t++);
151 dbkey(driverMetrics, 3, t++);
152 dbkey(driverMetrics, 4, t++);
153 dbkey(driverMetrics, 5, t++);
154
155 dbkey(driverMetrics, 0, t++);
156 dbkey(driverMetrics, 1, t++);
157
158 dckey(driverMetrics, 0, t++);
159
160 std::stringstream streamer;
161 std::vector<std::regex> performanceMetrics{
162 std::regex("bkey"),
163 std::regex("ckey"),
164 };
165
166 ResourcesMonitoringHelper::dumpMetricsToJSON(metrics,
167 driverMetrics, specs, performanceMetrics,
168 streamer);
169 std::string streamed = streamer.str();
170 std::string expected = R"JSON({
171 "someDevice": {
172 "ckey": [
173 {
174 "timestamp": "1000",
175 "value": "0"
176 },
177 {
178 "timestamp": "1001",
179 "value": "1"
180 },
181 {
182 "timestamp": "1002",
183 "value": "2"
184 },
185 {
186 "timestamp": "1003",
187 "value": "3"
188 },
189 {
190 "timestamp": "1004",
191 "value": "4"
192 },
193 {
194 "timestamp": "1005",
195 "value": "5"
196 }
197 ]
198 },
199 "anotherDevice": {
200 "bkey": [
201 {
202 "timestamp": "1000",
203 "value": "0"
204 },
205 {
206 "timestamp": "1001",
207 "value": "1"
208 },
209 {
210 "timestamp": "1002",
211 "value": "2"
212 },
213 {
214 "timestamp": "1003",
215 "value": "3"
216 },
217 {
218 "timestamp": "1004",
219 "value": "4"
220 },
221 {
222 "timestamp": "1005",
223 "value": "5"
224 }
225 ]
226 },
227 "driver": {
228 "bkey": [
229 {
230 "timestamp": "2000",
231 "value": "0"
232 },
233 {
234 "timestamp": "2001",
235 "value": "1"
236 },
237 {
238 "timestamp": "2002",
239 "value": "2"
240 },
241 {
242 "timestamp": "2003",
243 "value": "3"
244 },
245 {
246 "timestamp": "2004",
247 "value": "4"
248 },
249 {
250 "timestamp": "2005",
251 "value": "5"
252 },
253 {
254 "timestamp": "2006",
255 "value": "0"
256 },
257 {
258 "timestamp": "2007",
259 "value": "1"
260 }
261 ],
262 "ckey": [
263 {
264 "timestamp": "2008",
265 "value": "0"
266 }
267 ]
268 }
269}
270)JSON";
271 REQUIRE(std::regex_replace(streamed, std::regex(R"(\s+)"), "") == std::regex_replace(expected, std::regex(R"(\s+)"), ""));
272}
GLsizei GLenum const void GLuint GLsizei GLfloat * metrics
Definition glcorearb.h:5500
Defining PrimaryVertex explicitly as messageable.
std::vector< MetricPrefix > metricPrefixes
std::vector< MetricLabel > metricLabels
std::string name
The name of the associated DataProcessorSpec.
Definition DeviceSpec.h:50
std::map< std::string, ID > expected
TEST_CASE("StreamMetrics")