]> git.proxmox.com Git - ceph.git/blob - ceph/src/jaegertracing/opentelemetry-cpp/exporters/ostream/test/ostream_metrics_test.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / jaegertracing / opentelemetry-cpp / exporters / ostream / test / ostream_metrics_test.cc
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
3
4 #include <gtest/gtest.h>
5 #ifdef ENABLE_METRICS_PREVIEW
6
7 # include "opentelemetry/exporters/ostream/metrics_exporter.h"
8 # include "opentelemetry/sdk/_metrics/aggregator/counter_aggregator.h"
9 # include "opentelemetry/sdk/_metrics/aggregator/exact_aggregator.h"
10 # include "opentelemetry/sdk/_metrics/aggregator/gauge_aggregator.h"
11 # include "opentelemetry/sdk/_metrics/aggregator/min_max_sum_count_aggregator.h"
12 # include "opentelemetry/sdk/_metrics/aggregator/sketch_aggregator.h"
13 # include "opentelemetry/sdk/_metrics/exporter.h"
14 # include "opentelemetry/sdk/_metrics/record.h"
15
16 # include <iostream>
17
18 namespace metric_sdk = opentelemetry::sdk::metrics;
19 namespace metrics_api = opentelemetry::metrics;
20 namespace nostd = opentelemetry::nostd;
21 namespace exportermetrics = opentelemetry::exporter::metrics;
22
23 TEST(OStreamMetricsExporter, PrintCounter)
24 {
25 auto exporter =
26 std::unique_ptr<metric_sdk::MetricsExporter>(new exportermetrics::OStreamMetricsExporter);
27
28 auto aggregator = std::shared_ptr<metric_sdk::Aggregator<double>>(
29 new metric_sdk::CounterAggregator<double>(metrics_api::InstrumentKind::Counter));
30
31 aggregator->update(5.5);
32 aggregator->checkpoint();
33
34 metric_sdk::Record r("name", "description", "labels", aggregator);
35 std::vector<metric_sdk::Record> records;
36 records.push_back(r);
37
38 // Create stringstream to redirect to
39 std::stringstream stdoutOutput;
40
41 // Save cout's buffer here
42 std::streambuf *sbuf = std::cout.rdbuf();
43
44 // Redirect cout to our stringstream buffer
45 std::cout.rdbuf(stdoutOutput.rdbuf());
46
47 exporter->Export(records);
48
49 std::cout.rdbuf(sbuf);
50
51 std::string expectedOutput =
52 "{\n"
53 " name : name\n"
54 " description : description\n"
55 " labels : labels\n"
56 " sum : 5.5\n"
57 "}\n";
58
59 ASSERT_EQ(stdoutOutput.str(), expectedOutput);
60 }
61
62 TEST(OStreamMetricsExporter, PrintMinMaxSumCount)
63 {
64 auto exporter =
65 std::unique_ptr<metric_sdk::MetricsExporter>(new exportermetrics::OStreamMetricsExporter);
66
67 auto aggregator = std::shared_ptr<metric_sdk::Aggregator<int>>(
68 new metric_sdk::MinMaxSumCountAggregator<int>(metrics_api::InstrumentKind::Counter));
69
70 aggregator->update(1);
71 aggregator->update(2);
72 aggregator->checkpoint();
73
74 metric_sdk::Record r("name", "description", "labels", aggregator);
75 std::vector<metric_sdk::Record> records;
76 records.push_back(r);
77
78 // Create stringstream to redirect to
79 std::stringstream stdoutOutput;
80
81 // Save cout's buffer here
82 std::streambuf *sbuf = std::cout.rdbuf();
83
84 // Redirect cout to our stringstream buffer
85 std::cout.rdbuf(stdoutOutput.rdbuf());
86
87 exporter->Export(records);
88
89 std::cout.rdbuf(sbuf);
90
91 std::string expectedOutput =
92 "{\n"
93 " name : name\n"
94 " description : description\n"
95 " labels : labels\n"
96 " min : 1\n"
97 " max : 2\n"
98 " sum : 3\n"
99 " count : 2\n"
100 "}\n";
101
102 ASSERT_EQ(stdoutOutput.str(), expectedOutput);
103 }
104
105 TEST(OStreamMetricsExporter, PrintGauge)
106 {
107 auto exporter =
108 std::unique_ptr<metric_sdk::MetricsExporter>(new exportermetrics::OStreamMetricsExporter);
109
110 auto aggregator = std::shared_ptr<metric_sdk::Aggregator<short>>(
111 new metric_sdk::GaugeAggregator<short>(metrics_api::InstrumentKind::Counter));
112
113 aggregator->update(1);
114 aggregator->update(9);
115 aggregator->checkpoint();
116
117 metric_sdk::Record r("name", "description", "labels", aggregator);
118 std::vector<metric_sdk::Record> records;
119 records.push_back(r);
120
121 // Create stringstream to redirect to
122 std::stringstream stdoutOutput;
123
124 // Save cout's buffer here
125 std::streambuf *sbuf = std::cout.rdbuf();
126
127 // Redirect cout to our stringstream buffer
128 std::cout.rdbuf(stdoutOutput.rdbuf());
129
130 exporter->Export(records);
131
132 std::cout.rdbuf(sbuf);
133
134 std::string expectedOutput =
135 "{\n"
136 " name : name\n"
137 " description : description\n"
138 " labels : labels\n"
139 " last value : 9\n"
140 " timestamp : " +
141 std::to_string(aggregator->get_checkpoint_timestamp().time_since_epoch().count()) +
142 "\n"
143 "}\n";
144
145 ASSERT_EQ(stdoutOutput.str(), expectedOutput);
146 }
147
148 TEST(OStreamMetricsExporter, PrintExact)
149 {
150 auto exporter =
151 std::unique_ptr<metric_sdk::MetricsExporter>(new exportermetrics::OStreamMetricsExporter);
152
153 auto aggregator = std::shared_ptr<metric_sdk::Aggregator<short>>(
154 new metric_sdk::ExactAggregator<short>(metrics_api::InstrumentKind::Counter, true));
155
156 auto aggregator2 = std::shared_ptr<metric_sdk::Aggregator<short>>(
157 new metric_sdk::ExactAggregator<short>(metrics_api::InstrumentKind::Counter, false));
158
159 for (int i = 0; i < 10; i++)
160 {
161 aggregator->update(i);
162 aggregator2->update(i);
163 }
164 aggregator->checkpoint();
165 aggregator2->checkpoint();
166
167 metric_sdk::Record r("name", "description", "labels", aggregator);
168 metric_sdk::Record r2("name", "description", "labels", aggregator2);
169 std::vector<metric_sdk::Record> records;
170 records.push_back(r);
171 records.push_back(r2);
172
173 // Create stringstream to redirect to
174 std::stringstream stdoutOutput;
175
176 // Save cout's buffer here
177 std::streambuf *sbuf = std::cout.rdbuf();
178
179 // Redirect cout to our stringstream buffer
180 std::cout.rdbuf(stdoutOutput.rdbuf());
181
182 exporter->Export(records);
183
184 std::cout.rdbuf(sbuf);
185
186 std::string expectedOutput =
187 "{\n"
188 " name : name\n"
189 " description : description\n"
190 " labels : labels\n"
191 " quantiles : [0: 0, .25: 3, .50: 5, .75: 7, 1: 9]\n"
192 "}\n"
193 "{\n"
194 " name : name\n"
195 " description : description\n"
196 " labels : labels\n"
197 " values : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n"
198 "}\n";
199
200 ASSERT_EQ(stdoutOutput.str(), expectedOutput);
201 }
202
203 TEST(OStreamMetricsExporter, PrintHistogram)
204 {
205 auto exporter =
206 std::unique_ptr<metric_sdk::MetricsExporter>(new exportermetrics::OStreamMetricsExporter);
207
208 std::vector<double> boundaries{10, 20, 30, 40, 50};
209 auto aggregator = std::shared_ptr<metric_sdk::Aggregator<float>>(
210 new metric_sdk::HistogramAggregator<float>(metrics_api::InstrumentKind::Counter, boundaries));
211
212 for (float i = 0; i < 60; i++)
213 {
214 aggregator->update(i);
215 }
216 aggregator->checkpoint();
217
218 metric_sdk::Record r("name", "description", "labels", aggregator);
219 std::vector<metric_sdk::Record> records;
220 records.push_back(r);
221
222 // Create stringstream to redirect to
223 std::stringstream stdoutOutput;
224
225 // Save cout's buffer here
226 std::streambuf *sbuf = std::cout.rdbuf();
227
228 // Redirect cout to our stringstream buffer
229 std::cout.rdbuf(stdoutOutput.rdbuf());
230
231 exporter->Export(records);
232
233 std::cout.rdbuf(sbuf);
234
235 std::string expectedOutput =
236 "{\n"
237 " name : name\n"
238 " description : description\n"
239 " labels : labels\n"
240 " buckets : [10, 20, 30, 40, 50]\n"
241 " counts : [10, 10, 10, 10, 10, 10]\n"
242 "}\n";
243
244 ASSERT_EQ(stdoutOutput.str(), expectedOutput);
245 }
246
247 TEST(OStreamMetricsExporter, PrintSketch)
248 {
249 auto exporter =
250 std::unique_ptr<metric_sdk::MetricsExporter>(new exportermetrics::OStreamMetricsExporter);
251
252 std::vector<double> boundaries{1, 3, 5, 7, 9};
253 auto aggregator = std::shared_ptr<metric_sdk::Aggregator<int>>(
254 new metric_sdk::SketchAggregator<int>(metrics_api::InstrumentKind::Counter, .000005));
255
256 for (int i = 0; i < 10; i++)
257 {
258 aggregator->update(i);
259 }
260 aggregator->checkpoint();
261
262 metric_sdk::Record r("name", "description", "labels", aggregator);
263 std::vector<metric_sdk::Record> records;
264 records.push_back(r);
265
266 // Create stringstream to redirect to
267 std::stringstream stdoutOutput;
268
269 // Save cout's buffer here
270 std::streambuf *sbuf = std::cout.rdbuf();
271
272 // Redirect cout to our stringstream buffer
273 std::cout.rdbuf(stdoutOutput.rdbuf());
274
275 exporter->Export(records);
276
277 std::cout.rdbuf(sbuf);
278
279 std::string expectedOutput =
280 "{\n"
281 " name : name\n"
282 " description : description\n"
283 " labels : labels\n"
284 " buckets : [0, 0.999995, 2, 3.00001, 4, 4.99999, 5.99997, 7.00003, 8.00003, 9]\n"
285 " counts : [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]\n"
286 "}\n";
287
288 ASSERT_EQ(stdoutOutput.str(), expectedOutput);
289 }
290 #else
291 TEST(OStreamMetricsExporter, DummyTest)
292 {
293 // empty
294 }
295 #endif