diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a1f23a534..9091791ea7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ This component adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.h - Automatically set the `service.instance.id` resource attribute if not provided. - Support for [CoreWCF.Primitives](https://www.nuget.org/packages/CoreWCF.Primitives/) traces instrumentation for versions `1.8.0`+. +- Support for `temporality_preference` in file-based configuration + for Console Metric Exporter. ### Changed diff --git a/docs/file-based-configuration.md b/docs/file-based-configuration.md index 1a39de422f..ac73292f3b 100644 --- a/docs/file-based-configuration.md +++ b/docs/file-based-configuration.md @@ -264,6 +264,10 @@ meter_provider: exporter: # Configure exporter to be console. console: + # Configure temporality preference. + # Values include: cumulative, delta. + # If omitted or null, cumulative is used. + temporality_preference: cumulative # Pull reader for Prometheus - pull: diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs index b3d65a576c..a14b2751fc 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs @@ -139,7 +139,7 @@ private static MeterProviderBuilder SetExporter(this MeterProviderBuilder builde } else if (exporter.Console != null) { - builder = Wrappers.AddConsoleExporter(builder, pluginManager); + builder = Wrappers.AddConsoleExporter(builder, pluginManager, exporter.Console); } } @@ -249,6 +249,17 @@ public static MeterProviderBuilder AddConsoleExporter(MeterProviderBuilder build }); } + [MethodImpl(MethodImplOptions.NoInlining)] + public static MeterProviderBuilder AddConsoleExporter(MeterProviderBuilder builder, PluginManager pluginManager, ConsoleExporterConfig consoleExporterConfig) + { + return builder.AddConsoleExporter((consoleExporterOptions, metricReaderOptions) => + { + metricReaderOptions.TemporalityPreference = consoleExporterConfig.GetTemporalityPreference(); + pluginManager.ConfigureMetricsOptions(consoleExporterOptions); + pluginManager.ConfigureMetricsOptions(metricReaderOptions); + }); + } + [MethodImpl(MethodImplOptions.NoInlining)] public static MeterProviderBuilder AddPrometheusHttpListener(MeterProviderBuilder builder, PluginManager pluginManager) { diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/ConsoleExporterConfig.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/ConsoleExporterConfig.cs new file mode 100644 index 0000000000..88e0298af1 --- /dev/null +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/ConsoleExporterConfig.cs @@ -0,0 +1,30 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +using OpenTelemetry.AutoInstrumentation.Configurations.FileBasedConfiguration.Parser; +using OpenTelemetry.Metrics; +using Vendors.YamlDotNet.Serialization; + +namespace OpenTelemetry.AutoInstrumentation.Configurations.FileBasedConfiguration; + +[EmptyObjectOnEmptyYaml] +internal class ConsoleExporterConfig +{ + /// + /// Gets or sets the temporality preference for the exporter. + /// Values include: cumulative, delta. + /// If omitted or null, cumulative is used. + /// + [YamlMember(Alias = "temporality_preference")] + public string? TemporalityPreference { get; set; } + + public MetricReaderTemporalityPreference GetTemporalityPreference() + { + return TemporalityPreference switch + { + "cumulative" => MetricReaderTemporalityPreference.Cumulative, + "delta" => MetricReaderTemporalityPreference.Delta, + _ => MetricReaderTemporalityPreference.Cumulative + }; + } +} diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/MetricPeriodicExporterConfig.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/MetricPeriodicExporterConfig.cs index 5c09a9d28e..fa87c236f1 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/MetricPeriodicExporterConfig.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/FileBasedConfiguration/MetricPeriodicExporterConfig.cs @@ -1,6 +1,8 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +using OpenTelemetry.AutoInstrumentation.Configurations.FileBasedConfiguration.Parser; +using OpenTelemetry.Metrics; using Vendors.YamlDotNet.Serialization; namespace OpenTelemetry.AutoInstrumentation.Configurations.FileBasedConfiguration; @@ -23,5 +25,5 @@ internal class MetricPeriodicExporterConfig /// Gets or sets the console exporter configuration. /// [YamlMember(Alias = "console")] - public object? Console { get; set; } + public ConsoleExporterConfig? Console { get; set; } } diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestMetricsFile.yaml b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestMetricsFile.yaml index daf3e402d8..ec1d9c8725 100644 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestMetricsFile.yaml +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Files/TestMetricsFile.yaml @@ -17,6 +17,7 @@ meter_provider: - periodic: exporter: console: + temporality_preference: delta - pull: exporter: prometheus: diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/ParserMetricsTests.cs b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/ParserMetricsTests.cs index a21be64897..7345ca9928 100644 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/ParserMetricsTests.cs +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/FileBased/Parser/ParserMetricsTests.cs @@ -44,6 +44,7 @@ public void Parse_FullConfigYaml_ShouldPopulateModelCorrectly() Assert.NotNull(consoleReader); Assert.NotNull(consoleReader.Exporter); Assert.NotNull(consoleReader.Exporter!.Console); + Assert.Equal("delta", consoleReader.Exporter.Console.TemporalityPreference); var prometheusReader = config.MeterProvider.Readers[3].Pull; Assert.NotNull(prometheusReader);