diff --git a/CHANGELOG.md b/CHANGELOG.md index deb72afad1..71e358a95a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,9 @@ Increment the: * [CONFIGURATION] File configuration - tls [#3726](https://github.com/open-telemetry/opentelemetry-cpp/pull/3726) +* [CONFIGURATION] File configuration - console metric exporter + [#3734](https://github.com/open-telemetry/opentelemetry-cpp/pull/3734) + New Features: * [CONFIGURATION] Implement declarative configuration (config.yaml) diff --git a/exporters/ostream/src/console_push_metric_builder.cc b/exporters/ostream/src/console_push_metric_builder.cc index ca87561755..5569d7345b 100644 --- a/exporters/ostream/src/console_push_metric_builder.cc +++ b/exporters/ostream/src/console_push_metric_builder.cc @@ -1,14 +1,18 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +#include #include #include #include "opentelemetry/exporters/ostream/console_push_metric_builder.h" #include "opentelemetry/exporters/ostream/metric_exporter_factory.h" +#include "opentelemetry/sdk/common/global_log_handler.h" #include "opentelemetry/sdk/configuration/console_push_metric_exporter_builder.h" #include "opentelemetry/sdk/configuration/console_push_metric_exporter_configuration.h" #include "opentelemetry/sdk/configuration/registry.h" +#include "opentelemetry/sdk/configuration/temporality_preference.h" +#include "opentelemetry/sdk/metrics/instruments.h" #include "opentelemetry/sdk/metrics/push_metric_exporter.h" #include "opentelemetry/version.h" @@ -25,10 +29,30 @@ void ConsolePushMetricBuilder::Register(opentelemetry::sdk::configuration::Regis } std::unique_ptr ConsolePushMetricBuilder::Build( - const opentelemetry::sdk::configuration::ConsolePushMetricExporterConfiguration * /* model */) - const + const opentelemetry::sdk::configuration::ConsolePushMetricExporterConfiguration *model) const { - return OStreamMetricExporterFactory::Create(); + sdk::metrics::AggregationTemporality aggregation_temporality; + + switch (model->temporality_preference) + { + case opentelemetry::sdk::configuration::TemporalityPreference::delta: + aggregation_temporality = sdk::metrics::AggregationTemporality::kDelta; + break; + case opentelemetry::sdk::configuration::TemporalityPreference::low_memory: + /* + * FIXME: OStreamMetricExporter does not support "low_memory" + * temporality + */ + OTEL_INTERNAL_LOG_WARN("[Console Exporter] TemporalityPreference::low_memory not supported"); + aggregation_temporality = sdk::metrics::AggregationTemporality::kCumulative; + break; + case opentelemetry::sdk::configuration::TemporalityPreference::cumulative: + default: + aggregation_temporality = sdk::metrics::AggregationTemporality::kCumulative; + break; + }; + + return OStreamMetricExporterFactory::Create(std::cout, aggregation_temporality); } } // namespace metrics diff --git a/install/test/src/test_exporters_ostream_builder.cc b/install/test/src/test_exporters_ostream_builder.cc index 657da73749..c1ac7219ce 100644 --- a/install/test/src/test_exporters_ostream_builder.cc +++ b/install/test/src/test_exporters_ostream_builder.cc @@ -19,7 +19,14 @@ TEST(ExportersOstreamBuilderInstall, ConsolePushMetricBuilder) { auto builder = std::make_unique(); ASSERT_TRUE(builder != nullptr); - auto exporter = builder->Build(nullptr); + + opentelemetry::sdk::configuration::ConsolePushMetricExporterConfiguration model; + model.temporality_preference = + opentelemetry::sdk::configuration::TemporalityPreference::cumulative; + model.default_histogram_aggregation = + opentelemetry::sdk::configuration::DefaultHistogramAggregation::explicit_bucket_histogram; + + auto exporter = builder->Build(&model); ASSERT_TRUE(exporter != nullptr); } diff --git a/sdk/include/opentelemetry/sdk/configuration/console_push_metric_exporter_configuration.h b/sdk/include/opentelemetry/sdk/configuration/console_push_metric_exporter_configuration.h index e36e3a961f..8755b31e9a 100644 --- a/sdk/include/opentelemetry/sdk/configuration/console_push_metric_exporter_configuration.h +++ b/sdk/include/opentelemetry/sdk/configuration/console_push_metric_exporter_configuration.h @@ -3,9 +3,11 @@ #pragma once +#include "opentelemetry/sdk/configuration/default_histogram_aggregation.h" #include "opentelemetry/sdk/configuration/headers_configuration.h" #include "opentelemetry/sdk/configuration/push_metric_exporter_configuration.h" #include "opentelemetry/sdk/configuration/push_metric_exporter_configuration_visitor.h" +#include "opentelemetry/sdk/configuration/temporality_preference.h" #include "opentelemetry/version.h" OPENTELEMETRY_BEGIN_NAMESPACE @@ -14,8 +16,8 @@ namespace sdk namespace configuration { -// YAML-SCHEMA: schema/common.json -// YAML-NODE: Console +// YAML-SCHEMA: schema/meter_provider.json +// YAML-NODE: ConsoleMetricExporter class ConsolePushMetricExporterConfiguration : public PushMetricExporterConfiguration { public: @@ -23,6 +25,10 @@ class ConsolePushMetricExporterConfiguration : public PushMetricExporterConfigur { visitor->VisitConsole(this); } + + TemporalityPreference temporality_preference{TemporalityPreference::cumulative}; + DefaultHistogramAggregation default_histogram_aggregation{ + DefaultHistogramAggregation::explicit_bucket_histogram}; }; } // namespace configuration diff --git a/sdk/src/configuration/configuration_parser.cc b/sdk/src/configuration/configuration_parser.cc index bb4ea76d80..8b0f0d4794 100644 --- a/sdk/src/configuration/configuration_parser.cc +++ b/sdk/src/configuration/configuration_parser.cc @@ -256,8 +256,8 @@ ConfigurationParser::ParseOtlpHttpLogRecordExporterConfiguration( model->compression = node->GetString("compression", ""); model->timeout = node->GetInteger("timeout", 10000); - std::string encoding = node->GetString("encoding", "protobuf"); - model->encoding = ParseOtlpHttpEncoding(node, encoding); + const std::string encoding = node->GetString("encoding", "protobuf"); + model->encoding = ParseOtlpHttpEncoding(node, encoding); return model; } @@ -565,16 +565,17 @@ ConfigurationParser::ParseOtlpHttpPushMetricExporterConfiguration( model->compression = node->GetString("compression", ""); model->timeout = node->GetInteger("timeout", 10000); - std::string temporality_preference = node->GetString("temporality_preference", "cumulative"); - model->temporality_preference = ParseTemporalityPreference(node, temporality_preference); + const std::string temporality_preference = + node->GetString("temporality_preference", "cumulative"); + model->temporality_preference = ParseTemporalityPreference(node, temporality_preference); - std::string default_histogram_aggregation = + const std::string default_histogram_aggregation = node->GetString("default_histogram_aggregation", "explicit_bucket_histogram"); model->default_histogram_aggregation = ParseDefaultHistogramAggregation(node, default_histogram_aggregation); - std::string encoding = node->GetString("encoding", "protobuf"); - model->encoding = ParseOtlpHttpEncoding(node, encoding); + const std::string encoding = node->GetString("encoding", "protobuf"); + model->encoding = ParseOtlpHttpEncoding(node, encoding); return model; } @@ -604,10 +605,11 @@ ConfigurationParser::ParseOtlpGrpcPushMetricExporterConfiguration( model->compression = node->GetString("compression", ""); model->timeout = node->GetInteger("timeout", 10000); - std::string temporality_preference = node->GetString("temporality_preference", "cumulative"); - model->temporality_preference = ParseTemporalityPreference(node, temporality_preference); + const std::string temporality_preference = + node->GetString("temporality_preference", "cumulative"); + model->temporality_preference = ParseTemporalityPreference(node, temporality_preference); - std::string default_histogram_aggregation = + const std::string default_histogram_aggregation = node->GetString("default_histogram_aggregation", "explicit_bucket_histogram"); model->default_histogram_aggregation = ParseDefaultHistogramAggregation(node, default_histogram_aggregation); @@ -624,10 +626,11 @@ ConfigurationParser::ParseOtlpFilePushMetricExporterConfiguration( model->output_stream = node->GetString("output_stream", ""); - std::string temporality_preference = node->GetString("temporality_preference", "cumulative"); - model->temporality_preference = ParseTemporalityPreference(node, temporality_preference); + const std::string temporality_preference = + node->GetString("temporality_preference", "cumulative"); + model->temporality_preference = ParseTemporalityPreference(node, temporality_preference); - std::string default_histogram_aggregation = + const std::string default_histogram_aggregation = node->GetString("default_histogram_aggregation", "explicit_bucket_histogram"); model->default_histogram_aggregation = ParseDefaultHistogramAggregation(node, default_histogram_aggregation); @@ -637,11 +640,18 @@ ConfigurationParser::ParseOtlpFilePushMetricExporterConfiguration( std::unique_ptr ConfigurationParser::ParseConsolePushMetricExporterConfiguration( - const std::unique_ptr & /* node */) const + const std::unique_ptr &node) const { auto model = std::make_unique(); - // FIXME-CONFIG: https://github.com/open-telemetry/opentelemetry-configuration/issues/242 + const std::string temporality_preference = + node->GetString("temporality_preference", "cumulative"); + model->temporality_preference = ParseTemporalityPreference(node, temporality_preference); + + const std::string default_histogram_aggregation = + node->GetString("default_histogram_aggregation", "explicit_bucket_histogram"); + model->default_histogram_aggregation = + ParseDefaultHistogramAggregation(node, default_histogram_aggregation); return model; } @@ -1479,8 +1489,8 @@ ConfigurationParser::ParseOtlpHttpSpanExporterConfiguration( model->compression = node->GetString("compression", ""); model->timeout = node->GetInteger("timeout", 10000); - std::string encoding = node->GetString("encoding", "protobuf"); - model->encoding = ParseOtlpHttpEncoding(node, encoding); + const std::string encoding = node->GetString("encoding", "protobuf"); + model->encoding = ParseOtlpHttpEncoding(node, encoding); return model; }