Skip to content

Commit b03d915

Browse files
felipesantoskethandmd
authored andcommitted
add prom, otlp exporter and example
1 parent 338cce4 commit b03d915

File tree

6 files changed

+177
-6
lines changed

6 files changed

+177
-6
lines changed

examples/common/metrics_foo_library/foo_library.cc

+20-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <cmath>
88
#include <map>
99
#include <thread>
10+
#include <iostream>
1011
#include <utility>
1112
#include <vector>
1213

@@ -24,6 +25,7 @@
2425
#include "opentelemetry/semconv/http_metrics.h"
2526
#include "opentelemetry/semconv/incubating/container_metrics.h"
2627
#include "opentelemetry/semconv/incubating/system_metrics.h"
28+
#include "opentelemetry/sdk/metrics/view/view_factory.h"
2729

2830
namespace metrics_api = opentelemetry::metrics;
2931

@@ -100,7 +102,24 @@ void foo_library::histogram_example(const std::string &name)
100102
std::string histogram_name = name + "_histogram";
101103
auto provider = metrics_api::Provider::GetMeterProvider();
102104
opentelemetry::nostd::shared_ptr<metrics_api::Meter> meter = provider->GetMeter(name, "1.2.0");
103-
auto histogram_counter = meter->CreateDoubleHistogram(histogram_name, "des", "unit");
105+
auto histogram_counter = meter->CreateDoubleHistogram(histogram_name, "des", "histogram-unit");
106+
auto context = opentelemetry::context::Context{};
107+
for (uint32_t i = 0; i < 20; ++i)
108+
{
109+
double val = (rand() % 700) + 1.1;
110+
std::map<std::string, std::string> labels = get_random_attr();
111+
auto labelkv = opentelemetry::common::KeyValueIterableView<decltype(labels)>{labels};
112+
histogram_counter->Record(val, labelkv, context);
113+
std::this_thread::sleep_for(std::chrono::milliseconds(250));
114+
}
115+
}
116+
117+
void foo_library::histogram_exp_example(const std::string &name)
118+
{
119+
std::string histogram_name = name + "_exponential_histogram";
120+
auto provider = metrics_api::Provider::GetMeterProvider();
121+
opentelemetry::nostd::shared_ptr<metrics_api::Meter> meter = provider->GetMeter(name, "1.2.0");
122+
auto histogram_counter = meter->CreateDoubleHistogram(histogram_name, "des", "histogram-unit");
104123
auto context = opentelemetry::context::Context{};
105124
for (uint32_t i = 0; i < 20; ++i)
106125
{

examples/common/metrics_foo_library/foo_library.h

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class foo_library
1010
public:
1111
static void counter_example(const std::string &name);
1212
static void histogram_example(const std::string &name);
13+
static void histogram_exp_example(const std::string &name);
1314
static void observable_counter_example(const std::string &name);
1415
#if OPENTELEMETRY_ABI_VERSION_NO >= 2
1516
static void gauge_example(const std::string &name);

examples/otlp/grpc_metric_main.cc

+77-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
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"
@@ -11,6 +14,9 @@
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/view_factory.h"
19+
#include "opentelemetry/sdk/metrics/view/meter_selector_factory.h"
1420

1521
#include <memory>
1622
#include <thread>
@@ -55,6 +61,61 @@ void InitMetrics()
5561
metric_sdk::Provider::SetMeterProvider(provider);
5662
}
5763

64+
void InitMetrics(std::string &name)
65+
{
66+
auto exporter = otlp_exporter::OtlpGrpcMetricExporterFactory::Create(exporter_options);
67+
68+
std::string version{"1.2.0"};
69+
std::string schema{"https://opentelemetry.io/schemas/1.2.0"};
70+
71+
// Initialize and set the global MeterProvider
72+
metric_sdk::PeriodicExportingMetricReaderOptions reader_options;
73+
reader_options.export_interval_millis = std::chrono::milliseconds(1000);
74+
reader_options.export_timeout_millis = std::chrono::milliseconds(500);
75+
76+
auto reader =
77+
metric_sdk::PeriodicExportingMetricReaderFactory::Create(std::move(exporter), reader_options);
78+
79+
auto context = metric_sdk::MeterContextFactory::Create();
80+
context->AddMetricReader(std::move(reader));
81+
82+
auto provider = metric_sdk::MeterProviderFactory::Create(std::move(context));
83+
84+
// auto provider = opentelemetry::sdk::metrics::MeterProviderFactory::Create();
85+
86+
// std::shared_ptr<opentelemetry::metrics::MeterProvider> provider(std::move(u_provider));
87+
88+
// histogram view
89+
std::string histogram_name = name + "_histogram";
90+
std::string unit = "unit";
91+
92+
auto histogram_instrument_selector = metric_sdk::InstrumentSelectorFactory::Create(
93+
metric_sdk::InstrumentType::kHistogram, histogram_name, unit);
94+
95+
auto histogram_meter_selector = metric_sdk::MeterSelectorFactory::Create(name, version, schema);
96+
97+
auto histogram_aggregation_config = std::unique_ptr<metric_sdk::Base2ExponentialHistogramAggregationConfig>(
98+
new metric_sdk::Base2ExponentialHistogramAggregationConfig);
99+
100+
histogram_aggregation_config->max_scale_ = 3;
101+
102+
// histogram_aggregation_config->boundaries_ = std::vector<double>{
103+
// 0.0, 50.0, 100.0, 250.0, 500.0, 750.0, 1000.0, 2500.0, 5000.0, 10000.0, 20000.0};
104+
105+
std::shared_ptr<metric_sdk::AggregationConfig> aggregation_config(
106+
std::move(histogram_aggregation_config));
107+
108+
auto histogram_view = metric_sdk::ViewFactory::Create(
109+
name, "description", unit, metric_sdk::AggregationType::kBase2ExponentialHistogram, aggregation_config);
110+
111+
provider->AddView(std::move(histogram_instrument_selector), std::move(histogram_meter_selector),
112+
std::move(histogram_view));
113+
114+
std::shared_ptr<opentelemetry::metrics::MeterProvider> api_provider(std::move(provider));
115+
116+
metric_sdk::Provider::SetMeterProvider(api_provider);
117+
}
118+
58119
void CleanupMetrics()
59120
{
60121
std::shared_ptr<metrics_api::MeterProvider> none;
@@ -78,10 +139,19 @@ int main(int argc, char *argv[])
78139
}
79140
}
80141
}
142+
std::cout << "Using endpoint: " << exporter_options.endpoint << std::endl;
143+
std::cout << "Using example type: " << example_type << std::endl;
144+
std::cout << "Using cacert path: " << exporter_options.ssl_credentials_cacert_path << std::endl;
145+
std::cout << "Using ssl credentials: " << exporter_options.use_ssl_credentials << std::endl;
146+
81147
// Removing this line will leave the default noop MetricProvider in place.
82-
InitMetrics();
148+
83149
std::string name{"otlp_grpc_metric_example"};
84150

151+
InitMetrics(name);
152+
153+
//InitMetrics();
154+
85155
if (example_type == "counter")
86156
{
87157
foo_library::counter_example(name);
@@ -93,6 +163,8 @@ int main(int argc, char *argv[])
93163
else if (example_type == "histogram")
94164
{
95165
foo_library::histogram_example(name);
166+
} else if (example_type == "exponential_histogram") {
167+
foo_library::histogram_exp_example(name);
96168
}
97169
#if OPENTELEMETRY_ABI_VERSION_NO >= 2
98170
else if (example_type == "gauge")
@@ -102,15 +174,15 @@ int main(int argc, char *argv[])
102174
#endif
103175
else
104176
{
105-
std::thread counter_example{&foo_library::counter_example, name};
106-
std::thread observable_counter_example{&foo_library::observable_counter_example, name};
177+
//std::thread counter_example{&foo_library::counter_example, name};
178+
// std::thread observable_counter_example{&foo_library::observable_counter_example, name};
107179
std::thread histogram_example{&foo_library::histogram_example, name};
108180
#if OPENTELEMETRY_ABI_VERSION_NO >= 2
109181
std::thread gauge_example{&foo_library::gauge_example, name};
110182
#endif
111183

112-
counter_example.join();
113-
observable_counter_example.join();
184+
// counter_example.join();
185+
// observable_counter_example.join();
114186
histogram_example.join();
115187
#if OPENTELEMETRY_ABI_VERSION_NO >= 2
116188
gauge_example.join();

exporters/otlp/include/opentelemetry/exporters/otlp/otlp_metric_utils.h

+3
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ class OtlpMetricUtils
5555
static void ConvertHistogramMetric(const opentelemetry::sdk::metrics::MetricData &metric_data,
5656
proto::metrics::v1::Histogram *const histogram) noexcept;
5757

58+
static void ConvertExponentialHistogramMetric(const opentelemetry::sdk::metrics::MetricData &metric_data,
59+
proto::metrics::v1::ExponentialHistogram *const histogram) noexcept;
60+
5861
static void ConvertGaugeMetric(const opentelemetry::sdk::metrics::MetricData &metric_data,
5962
proto::metrics::v1::Gauge *const gauge) noexcept;
6063

exporters/otlp/src/otlp_metric_utils.cc

+72
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@ metric_sdk::AggregationType OtlpMetricUtils::GetAggregationType(
6363
{
6464
return metric_sdk::AggregationType::kHistogram;
6565
}
66+
else if (nostd::holds_alternative<sdk::metrics::Base2ExponentialHistogramPointData>(
67+
point_data_with_attributes.point_data))
68+
{
69+
return metric_sdk::AggregationType::kBase2ExponentialHistogram;
70+
}
6671
else if (nostd::holds_alternative<sdk::metrics::LastValuePointData>(
6772
point_data_with_attributes.point_data))
6873
{
@@ -177,6 +182,69 @@ void OtlpMetricUtils::ConvertHistogramMetric(
177182
}
178183
}
179184

185+
void OtlpMetricUtils::ConvertExponentialHistogramMetric(
186+
const metric_sdk::MetricData &metric_data,
187+
proto::metrics::v1::ExponentialHistogram *const histogram) noexcept
188+
{
189+
histogram->set_aggregation_temporality(
190+
GetProtoAggregationTemporality(metric_data.aggregation_temporality));
191+
auto start_ts = metric_data.start_ts.time_since_epoch().count();
192+
auto ts = metric_data.end_ts.time_since_epoch().count();
193+
for (auto &point_data_with_attributes : metric_data.point_data_attr_)
194+
{
195+
proto::metrics::v1::ExponentialHistogramDataPoint *proto_histogram_point_data =
196+
histogram->add_data_points();
197+
proto_histogram_point_data->set_start_time_unix_nano(start_ts);
198+
proto_histogram_point_data->set_time_unix_nano(ts);
199+
auto histogram_data =
200+
nostd::get<sdk::metrics::Base2ExponentialHistogramPointData>(point_data_with_attributes.point_data);
201+
// sum
202+
proto_histogram_point_data->set_sum(histogram_data.sum_);
203+
proto_histogram_point_data->set_count(histogram_data.count_);
204+
if (histogram_data.record_min_max_)
205+
{
206+
proto_histogram_point_data->set_min(histogram_data.min_);
207+
proto_histogram_point_data->set_max(histogram_data.max_);
208+
}
209+
// negative buckets
210+
if(!histogram_data.negative_buckets_.Empty())
211+
{
212+
auto negative_buckets = proto_histogram_point_data->mutable_negative();
213+
negative_buckets->set_offset(histogram_data.negative_buckets_.StartIndex());
214+
215+
for( auto index = histogram_data.negative_buckets_.StartIndex();
216+
index <= histogram_data.negative_buckets_.EndIndex(); ++index)
217+
{
218+
negative_buckets->add_bucket_counts(histogram_data.negative_buckets_.Get(index));
219+
}
220+
}
221+
// positive buckets
222+
if(!histogram_data.positive_buckets_.Empty())
223+
{
224+
auto positive_buckets = proto_histogram_point_data->mutable_positive();
225+
positive_buckets->set_offset(histogram_data.positive_buckets_.StartIndex());
226+
227+
for( auto index = histogram_data.positive_buckets_.StartIndex();
228+
index <= histogram_data.positive_buckets_.EndIndex(); ++index)
229+
{
230+
positive_buckets->add_bucket_counts(histogram_data.positive_buckets_.Get(index));
231+
}
232+
}
233+
proto_histogram_point_data->set_scale(histogram_data.scale_);
234+
proto_histogram_point_data->set_zero_count(histogram_data.zero_count_);
235+
236+
237+
238+
// attributes
239+
for (auto &kv_attr : point_data_with_attributes.attributes)
240+
{
241+
OtlpPopulateAttributeUtils::PopulateAttribute(proto_histogram_point_data->add_attributes(),
242+
kv_attr.first, kv_attr.second);
243+
}
244+
}
245+
}
246+
247+
180248
void OtlpMetricUtils::ConvertGaugeMetric(const opentelemetry::sdk::metrics::MetricData &metric_data,
181249
proto::metrics::v1::Gauge *const gauge) noexcept
182250
{
@@ -225,6 +293,10 @@ void OtlpMetricUtils::PopulateInstrumentInfoMetrics(
225293
ConvertHistogramMetric(metric_data, metric->mutable_histogram());
226294
break;
227295
}
296+
case metric_sdk::AggregationType::kBase2ExponentialHistogram: {
297+
ConvertExponentialHistogramMetric(metric_data, metric->mutable_exponential_histogram());
298+
break;
299+
}
228300
case metric_sdk::AggregationType::kLastValue: {
229301
ConvertGaugeMetric(metric_data, metric->mutable_gauge());
230302
break;

exporters/prometheus/src/exporter_utils.cc

+4
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,10 @@ metric_sdk::AggregationType PrometheusExporterUtils::getAggregationType(
562562
{
563563
return metric_sdk::AggregationType::kHistogram;
564564
}
565+
else if (nostd::holds_alternative<sdk::metrics::Base2ExponentialHistogramPointData>(point_type))
566+
{
567+
return metric_sdk::AggregationType::kBase2ExponentialHistogram;
568+
}
565569
else if (nostd::holds_alternative<sdk::metrics::LastValuePointData>(point_type))
566570
{
567571
return metric_sdk::AggregationType::kLastValue;

0 commit comments

Comments
 (0)