]> git.proxmox.com Git - ceph.git/blob - ceph/src/jaegertracing/opentelemetry-cpp/examples/prometheus/main.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / jaegertracing / opentelemetry-cpp / examples / prometheus / main.cc
1 // Copyright The OpenTelemetry Authors
2 // SPDX-License-Identifier: Apache-2.0
3
4 #ifndef ENABLE_METRICS_PREVIEW
5 # include <memory>
6 # include <thread>
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"
14
15 # ifdef BAZEL_BUILD
16 # include "examples/common/metrics_foo_library/foo_library.h"
17 # else
18 # include "metrics_foo_library/foo_library.h"
19 # endif
20
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;
26
27 namespace
28 {
29
30 void initMetrics(const std::string &name, const std::string &addr)
31 {
32 metrics_exporter::PrometheusExporterOptions opts;
33 if (!addr.empty())
34 {
35 opts.url = addr;
36 }
37 std::puts("PrometheusExporter example program running ...");
38
39 std::unique_ptr<metrics_sdk::MetricExporter> exporter{
40 new metrics_exporter::PrometheusExporter(opts)};
41
42 std::string version{"1.2.0"};
43 std::string schema{"https://opentelemetry.io/schemas/1.2.0"};
44
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));
54
55 // counter view
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));
64
65 // histogram 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);
76 }
77 } // namespace
78
79 int main(int argc, char **argv)
80 {
81 std::string example_type;
82 std::string addr{"localhost:8080"};
83 if (argc == 1)
84 {
85 std::puts("usage: $prometheus_example <example type> <url>");
86 }
87
88 if (argc >= 2)
89 {
90 example_type = argv[1];
91 }
92 if (argc > 2)
93 {
94 addr = argv[2];
95 }
96
97 std::string name{"prometheus_metric_example"};
98 initMetrics(name, addr);
99
100 if (example_type == "counter")
101 {
102 foo_library::counter_example(name);
103 }
104 else if (example_type == "histogram")
105 {
106 foo_library::histogram_example(name);
107 }
108 else
109 {
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();
114 }
115 }
116 #else
117 int main() {}
118 #endif