1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
4 #include <gtest/gtest.h>
5 #ifdef ENABLE_METRICS_PREVIEW
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"
18 namespace metric_sdk
= opentelemetry::sdk::metrics
;
19 namespace metrics_api
= opentelemetry::metrics
;
20 namespace nostd
= opentelemetry::nostd
;
21 namespace exportermetrics
= opentelemetry::exporter::metrics
;
23 TEST(OStreamMetricsExporter
, PrintCounter
)
26 std::unique_ptr
<metric_sdk::MetricsExporter
>(new exportermetrics::OStreamMetricsExporter
);
28 auto aggregator
= std::shared_ptr
<metric_sdk::Aggregator
<double>>(
29 new metric_sdk::CounterAggregator
<double>(metrics_api::InstrumentKind::Counter
));
31 aggregator
->update(5.5);
32 aggregator
->checkpoint();
34 metric_sdk::Record
r("name", "description", "labels", aggregator
);
35 std::vector
<metric_sdk::Record
> records
;
38 // Create stringstream to redirect to
39 std::stringstream stdoutOutput
;
41 // Save cout's buffer here
42 std::streambuf
*sbuf
= std::cout
.rdbuf();
44 // Redirect cout to our stringstream buffer
45 std::cout
.rdbuf(stdoutOutput
.rdbuf());
47 exporter
->Export(records
);
49 std::cout
.rdbuf(sbuf
);
51 std::string expectedOutput
=
54 " description : description\n"
59 ASSERT_EQ(stdoutOutput
.str(), expectedOutput
);
62 TEST(OStreamMetricsExporter
, PrintMinMaxSumCount
)
65 std::unique_ptr
<metric_sdk::MetricsExporter
>(new exportermetrics::OStreamMetricsExporter
);
67 auto aggregator
= std::shared_ptr
<metric_sdk::Aggregator
<int>>(
68 new metric_sdk::MinMaxSumCountAggregator
<int>(metrics_api::InstrumentKind::Counter
));
70 aggregator
->update(1);
71 aggregator
->update(2);
72 aggregator
->checkpoint();
74 metric_sdk::Record
r("name", "description", "labels", aggregator
);
75 std::vector
<metric_sdk::Record
> records
;
78 // Create stringstream to redirect to
79 std::stringstream stdoutOutput
;
81 // Save cout's buffer here
82 std::streambuf
*sbuf
= std::cout
.rdbuf();
84 // Redirect cout to our stringstream buffer
85 std::cout
.rdbuf(stdoutOutput
.rdbuf());
87 exporter
->Export(records
);
89 std::cout
.rdbuf(sbuf
);
91 std::string expectedOutput
=
94 " description : description\n"
102 ASSERT_EQ(stdoutOutput
.str(), expectedOutput
);
105 TEST(OStreamMetricsExporter
, PrintGauge
)
108 std::unique_ptr
<metric_sdk::MetricsExporter
>(new exportermetrics::OStreamMetricsExporter
);
110 auto aggregator
= std::shared_ptr
<metric_sdk::Aggregator
<short>>(
111 new metric_sdk::GaugeAggregator
<short>(metrics_api::InstrumentKind::Counter
));
113 aggregator
->update(1);
114 aggregator
->update(9);
115 aggregator
->checkpoint();
117 metric_sdk::Record
r("name", "description", "labels", aggregator
);
118 std::vector
<metric_sdk::Record
> records
;
119 records
.push_back(r
);
121 // Create stringstream to redirect to
122 std::stringstream stdoutOutput
;
124 // Save cout's buffer here
125 std::streambuf
*sbuf
= std::cout
.rdbuf();
127 // Redirect cout to our stringstream buffer
128 std::cout
.rdbuf(stdoutOutput
.rdbuf());
130 exporter
->Export(records
);
132 std::cout
.rdbuf(sbuf
);
134 std::string expectedOutput
=
137 " description : description\n"
141 std::to_string(aggregator
->get_checkpoint_timestamp().time_since_epoch().count()) +
145 ASSERT_EQ(stdoutOutput
.str(), expectedOutput
);
148 TEST(OStreamMetricsExporter
, PrintExact
)
151 std::unique_ptr
<metric_sdk::MetricsExporter
>(new exportermetrics::OStreamMetricsExporter
);
153 auto aggregator
= std::shared_ptr
<metric_sdk::Aggregator
<short>>(
154 new metric_sdk::ExactAggregator
<short>(metrics_api::InstrumentKind::Counter
, true));
156 auto aggregator2
= std::shared_ptr
<metric_sdk::Aggregator
<short>>(
157 new metric_sdk::ExactAggregator
<short>(metrics_api::InstrumentKind::Counter
, false));
159 for (int i
= 0; i
< 10; i
++)
161 aggregator
->update(i
);
162 aggregator2
->update(i
);
164 aggregator
->checkpoint();
165 aggregator2
->checkpoint();
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
);
173 // Create stringstream to redirect to
174 std::stringstream stdoutOutput
;
176 // Save cout's buffer here
177 std::streambuf
*sbuf
= std::cout
.rdbuf();
179 // Redirect cout to our stringstream buffer
180 std::cout
.rdbuf(stdoutOutput
.rdbuf());
182 exporter
->Export(records
);
184 std::cout
.rdbuf(sbuf
);
186 std::string expectedOutput
=
189 " description : description\n"
191 " quantiles : [0: 0, .25: 3, .50: 5, .75: 7, 1: 9]\n"
195 " description : description\n"
197 " values : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n"
200 ASSERT_EQ(stdoutOutput
.str(), expectedOutput
);
203 TEST(OStreamMetricsExporter
, PrintHistogram
)
206 std::unique_ptr
<metric_sdk::MetricsExporter
>(new exportermetrics::OStreamMetricsExporter
);
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
));
212 for (float i
= 0; i
< 60; i
++)
214 aggregator
->update(i
);
216 aggregator
->checkpoint();
218 metric_sdk::Record
r("name", "description", "labels", aggregator
);
219 std::vector
<metric_sdk::Record
> records
;
220 records
.push_back(r
);
222 // Create stringstream to redirect to
223 std::stringstream stdoutOutput
;
225 // Save cout's buffer here
226 std::streambuf
*sbuf
= std::cout
.rdbuf();
228 // Redirect cout to our stringstream buffer
229 std::cout
.rdbuf(stdoutOutput
.rdbuf());
231 exporter
->Export(records
);
233 std::cout
.rdbuf(sbuf
);
235 std::string expectedOutput
=
238 " description : description\n"
240 " buckets : [10, 20, 30, 40, 50]\n"
241 " counts : [10, 10, 10, 10, 10, 10]\n"
244 ASSERT_EQ(stdoutOutput
.str(), expectedOutput
);
247 TEST(OStreamMetricsExporter
, PrintSketch
)
250 std::unique_ptr
<metric_sdk::MetricsExporter
>(new exportermetrics::OStreamMetricsExporter
);
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));
256 for (int i
= 0; i
< 10; i
++)
258 aggregator
->update(i
);
260 aggregator
->checkpoint();
262 metric_sdk::Record
r("name", "description", "labels", aggregator
);
263 std::vector
<metric_sdk::Record
> records
;
264 records
.push_back(r
);
266 // Create stringstream to redirect to
267 std::stringstream stdoutOutput
;
269 // Save cout's buffer here
270 std::streambuf
*sbuf
= std::cout
.rdbuf();
272 // Redirect cout to our stringstream buffer
273 std::cout
.rdbuf(stdoutOutput
.rdbuf());
275 exporter
->Export(records
);
277 std::cout
.rdbuf(sbuf
);
279 std::string expectedOutput
=
282 " description : description\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"
288 ASSERT_EQ(stdoutOutput
.str(), expectedOutput
);
291 TEST(OStreamMetricsExporter
, DummyTest
)