1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
4 #ifndef ENABLE_METRICS_PREVIEW
7 # include "opentelemetry/exporters/prometheus/exporter.h"
8 # include "opentelemetry/metrics/provider.h"
9 # include "opentelemetry/sdk/metrics/aggregation/default_aggregation.h"
10 # include "opentelemetry/sdk/metrics/aggregation/histogram_aggregation.h"
11 # include "opentelemetry/sdk/metrics/export/periodic_exporting_metric_reader.h"
12 # include "opentelemetry/sdk/metrics/meter.h"
13 # include "opentelemetry/sdk/metrics/meter_provider.h"
16 # include "examples/common/metrics_foo_library/foo_library.h"
18 # include "metrics_foo_library/foo_library.h"
21 namespace metrics_sdk
= opentelemetry::sdk::metrics
;
22 namespace nostd
= opentelemetry::nostd
;
23 namespace common
= opentelemetry::common
;
24 namespace metrics_exporter
= opentelemetry::exporter::metrics
;
25 namespace metrics_api
= opentelemetry::metrics
;
30 void initMetrics(const std::string
&name
, const std::string
&addr
)
32 metrics_exporter::PrometheusExporterOptions opts
;
37 std::puts("PrometheusExporter example program running ...");
39 std::unique_ptr
<metrics_sdk::MetricExporter
> exporter
{
40 new metrics_exporter::PrometheusExporter(opts
)};
42 std::string version
{"1.2.0"};
43 std::string schema
{"https://opentelemetry.io/schemas/1.2.0"};
45 // Initialize and set the global MeterProvider
46 metrics_sdk::PeriodicExportingMetricReaderOptions options
;
47 options
.export_interval_millis
= std::chrono::milliseconds(1000);
48 options
.export_timeout_millis
= std::chrono::milliseconds(500);
49 std::unique_ptr
<metrics_sdk::MetricReader
> reader
{
50 new metrics_sdk::PeriodicExportingMetricReader(std::move(exporter
), options
)};
51 auto provider
= std::shared_ptr
<metrics_api::MeterProvider
>(new metrics_sdk::MeterProvider());
52 auto p
= std::static_pointer_cast
<metrics_sdk::MeterProvider
>(provider
);
53 p
->AddMetricReader(std::move(reader
));
56 std::string counter_name
= name
+ "_counter";
57 std::unique_ptr
<metrics_sdk::InstrumentSelector
> instrument_selector
{
58 new metrics_sdk::InstrumentSelector(metrics_sdk::InstrumentType::kCounter
, counter_name
)};
59 std::unique_ptr
<metrics_sdk::MeterSelector
> meter_selector
{
60 new metrics_sdk::MeterSelector(name
, version
, schema
)};
61 std::unique_ptr
<metrics_sdk::View
> sum_view
{
62 new metrics_sdk::View
{name
, "description", metrics_sdk::AggregationType::kSum
}};
63 p
->AddView(std::move(instrument_selector
), std::move(meter_selector
), std::move(sum_view
));
66 std::string histogram_name
= name
+ "_histogram";
67 std::unique_ptr
<metrics_sdk::InstrumentSelector
> histogram_instrument_selector
{
68 new metrics_sdk::InstrumentSelector(metrics_sdk::InstrumentType::kHistogram
, histogram_name
)};
69 std::unique_ptr
<metrics_sdk::MeterSelector
> histogram_meter_selector
{
70 new metrics_sdk::MeterSelector(name
, version
, schema
)};
71 std::unique_ptr
<metrics_sdk::View
> histogram_view
{
72 new metrics_sdk::View
{name
, "description", metrics_sdk::AggregationType::kHistogram
}};
73 p
->AddView(std::move(histogram_instrument_selector
), std::move(histogram_meter_selector
),
74 std::move(histogram_view
));
75 metrics_api::Provider::SetMeterProvider(provider
);
79 int main(int argc
, char **argv
)
81 std::string example_type
;
82 std::string addr
{"localhost:8080"};
85 std::puts("usage: $prometheus_example <example type> <url>");
90 example_type
= argv
[1];
97 std::string name
{"prometheus_metric_example"};
98 initMetrics(name
, addr
);
100 if (example_type
== "counter")
102 foo_library::counter_example(name
);
104 else if (example_type
== "histogram")
106 foo_library::histogram_example(name
);
110 std::thread counter_example
{&foo_library::counter_example
, name
};
111 std::thread histogram_example
{&foo_library::histogram_example
, name
};
112 counter_example
.join();
113 histogram_example
.join();