11// Copyright The OpenTelemetry Authors
22// SPDX-License-Identifier: Apache-2.0
33
4+ #include " grpcpp/grpcpp.h"
5+ #include " opentelemetry/exporters/otlp/otlp_grpc_exporter.h"
6+
47#include " opentelemetry/exporters/otlp/otlp_grpc_metric_exporter_factory.h"
58#include " opentelemetry/metrics/provider.h"
69#include " opentelemetry/sdk/metrics/aggregation/default_aggregation.h"
1114#include " opentelemetry/sdk/metrics/meter_provider.h"
1215#include " opentelemetry/sdk/metrics/meter_provider_factory.h"
1316#include " opentelemetry/sdk/metrics/provider.h"
17+ #include " opentelemetry/sdk/metrics/view/instrument_selector_factory.h"
18+ #include " opentelemetry/sdk/metrics/view/meter_selector_factory.h"
19+ #include " opentelemetry/sdk/metrics/view/view_factory.h"
1420
1521#include < memory>
1622#include < thread>
@@ -31,7 +37,7 @@ namespace
3137
3238otlp_exporter::OtlpGrpcMetricExporterOptions exporter_options;
3339
34- void InitMetrics ()
40+ void InitMetrics (std::string &name )
3541{
3642 auto exporter = otlp_exporter::OtlpGrpcMetricExporterFactory::Create (exporter_options);
3743
@@ -49,10 +55,34 @@ void InitMetrics()
4955 auto context = metric_sdk::MeterContextFactory::Create ();
5056 context->AddMetricReader (std::move (reader));
5157
52- auto u_provider = metric_sdk::MeterProviderFactory::Create (std::move (context));
53- std::shared_ptr<opentelemetry::metrics::MeterProvider> provider (std::move (u_provider));
58+ auto provider = metric_sdk::MeterProviderFactory::Create (std::move (context));
59+
60+ // histogram view
61+ std::string histogram_name = name + " _exponential_histogram" ;
62+ std::string unit = " histogram-unit" ;
63+
64+ auto histogram_instrument_selector = metric_sdk::InstrumentSelectorFactory::Create (
65+ metric_sdk::InstrumentType::kHistogram , histogram_name, unit);
66+
67+ auto histogram_meter_selector = metric_sdk::MeterSelectorFactory::Create (name, version, schema);
68+
69+ auto histogram_aggregation_config =
70+ std::unique_ptr<metric_sdk::Base2ExponentialHistogramAggregationConfig>(
71+ new metric_sdk::Base2ExponentialHistogramAggregationConfig);
72+
73+ std::shared_ptr<metric_sdk::AggregationConfig> aggregation_config (
74+ std::move (histogram_aggregation_config));
75+
76+ auto histogram_view = metric_sdk::ViewFactory::Create (
77+ name, " des" , unit, metric_sdk::AggregationType::kBase2ExponentialHistogram ,
78+ aggregation_config);
5479
55- metric_sdk::Provider::SetMeterProvider (provider);
80+ provider->AddView (std::move (histogram_instrument_selector), std::move (histogram_meter_selector),
81+ std::move (histogram_view));
82+
83+ std::shared_ptr<opentelemetry::metrics::MeterProvider> api_provider (std::move (provider));
84+
85+ metric_sdk::Provider::SetMeterProvider (api_provider);
5686}
5787
5888void CleanupMetrics ()
@@ -78,10 +108,17 @@ int main(int argc, char *argv[])
78108 }
79109 }
80110 }
111+ std::cout << " Using endpoint: " << exporter_options.endpoint << std::endl;
112+ std::cout << " Using example type: " << example_type << std::endl;
113+ std::cout << " Using cacert path: " << exporter_options.ssl_credentials_cacert_path << std::endl;
114+ std::cout << " Using ssl credentials: " << exporter_options.use_ssl_credentials << std::endl;
115+
81116 // Removing this line will leave the default noop MetricProvider in place.
82- InitMetrics ();
117+
83118 std::string name{" otlp_grpc_metric_example" };
84119
120+ InitMetrics (name);
121+
85122 if (example_type == " counter" )
86123 {
87124 foo_library::counter_example (name);
@@ -94,6 +131,10 @@ int main(int argc, char *argv[])
94131 {
95132 foo_library::histogram_example (name);
96133 }
134+ else if (example_type == " exponential_histogram" )
135+ {
136+ foo_library::histogram_exp_example (name);
137+ }
97138#if OPENTELEMETRY_ABI_VERSION_NO >= 2
98139 else if (example_type == " gauge" )
99140 {
@@ -105,13 +146,15 @@ int main(int argc, char *argv[])
105146 std::thread counter_example{&foo_library::counter_example, name};
106147 std::thread observable_counter_example{&foo_library::observable_counter_example, name};
107148 std::thread histogram_example{&foo_library::histogram_example, name};
149+ std::thread histogram_exp_example{&foo_library::histogram_exp_example, name};
108150#if OPENTELEMETRY_ABI_VERSION_NO >= 2
109151 std::thread gauge_example{&foo_library::gauge_example, name};
110152#endif
111153
112154 counter_example.join ();
113155 observable_counter_example.join ();
114156 histogram_example.join ();
157+ histogram_exp_example.join ();
115158#if OPENTELEMETRY_ABI_VERSION_NO >= 2
116159 gauge_example.join ();
117160#endif
0 commit comments