From bb2542f18305f52331552c9a03ae527aba092b31 Mon Sep 17 00:00:00 2001 From: RassK Date: Mon, 22 Jul 2024 17:29:50 +0300 Subject: [PATCH 1/7] Add signal based otlp configuration --- .../Configurations/Configuration.cs | 52 +++++++++++ .../Configurations/ConfigurationKeys.cs | 6 -- .../EnvironmentConfigurationMetricHelper.cs | 5 +- .../EnvironmentConfigurationTracerHelper.cs | 5 +- .../Configurations/LogSettings.cs | 11 +++ .../Configurations/MetricSettings.cs | 11 +++ .../Configurations/Otlp/OtlpSettings.cs | 87 +++++++++++++++++++ .../Configurations/Otlp/OtlpSignalType.cs | 11 +++ .../Otlp/OtlpSpecConfigDefinitions.cs | 86 ++++++++++++++++++ .../Configurations/Settings.cs | 23 ----- .../Configurations/TracerSettings.cs | 11 +++ .../Logger/LogBuilderExtensions.cs | 5 +- .../Configurations/ConfigurationTests.cs | 31 +++++++ .../Configurations/SettingsTests.cs | 31 +++++-- 14 files changed, 327 insertions(+), 48 deletions(-) create mode 100644 src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs create mode 100644 src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSignalType.cs create mode 100644 src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Configuration.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Configuration.cs index 3fd9b69121..7cc615a95d 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/Configuration.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Configuration.cs @@ -31,6 +31,17 @@ public Configuration(bool failFast, params IConfigurationSource[] sources) .FirstOrDefault(value => !string.IsNullOrEmpty(value)); } + /// + /// Gets the value based on priority. + /// + /// The priority key that is fetched first. + /// The default key performed as a fallback. + /// The value of the setting, or null if not found. + public string? GetString(string priorityKey, string defaultKey) + { + return GetString(priorityKey) ?? GetString(defaultKey); + } + /// /// Gets the value of the first setting found with /// the specified key from the current list of configuration sources. @@ -44,6 +55,17 @@ public Configuration(bool failFast, params IConfigurationSource[] sources) .FirstOrDefault(value => value.HasValue); } + /// + /// Gets the value based on priority. + /// + /// The priority key that is fetched first. + /// The default key performed as a fallback. + /// The value of the setting, or null if not found. + public int? GetInt32(string priorityKey, string defaultKey) + { + return GetInt32(priorityKey) ?? GetInt32(defaultKey); + } + /// /// Gets the value of the first setting found with /// the specified key from the current list of configuration sources. @@ -69,4 +91,34 @@ public Configuration(bool failFast, params IConfigurationSource[] sources) return _sources.Select(source => source.GetBool(key)) .FirstOrDefault(value => value.HasValue); } + + /// + /// Gets the value of the first setting found with + /// the specified key from the current list of configuration sources. + /// Sources are queried in the order in which they were added. + /// + /// The key that identifies the setting. + /// The value of the setting, or null if not found. + public Uri? GetUri(string key) + { + var value = GetString(key); + + if (Uri.TryCreate(value, UriKind.Absolute, out var uri)) + { + return uri; + } + + return null; + } + + /// + /// Gets the value based on priority. + /// + /// The priority key that is fetched first. + /// The default key performed as a fallback. + /// The value of the setting, or null if not found. + public Uri? GetUri(string priorityKey, string defaultKey) + { + return GetUri(priorityKey) ?? GetUri(defaultKey); + } } diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/ConfigurationKeys.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/ConfigurationKeys.cs index 4c1770e3e5..551ac5f161 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/ConfigurationKeys.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/ConfigurationKeys.cs @@ -21,12 +21,6 @@ internal partial class ConfigurationKeys public const string ProfilingEnabled = "CORECLR_ENABLE_PROFILING"; #endif - /// - /// Configuration key for the OTLP protocol to be used. - /// Default is "http/protobuf". - /// - public const string ExporterOtlpProtocol = "OTEL_EXPORTER_OTLP_PROTOCOL"; - /// /// Configuration key for enabling the flushing of telemetry data when an unhandled exception occurs. /// diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs index 81a8d42143..b26258554a 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs @@ -153,10 +153,7 @@ public static MeterProviderBuilder AddOtlpExporter(MeterProviderBuilder builder, { return builder.AddOtlpExporter((options, metricReaderOptions) => { - if (settings.OtlpExportProtocol.HasValue) - { - options.Protocol = settings.OtlpExportProtocol.Value; - } + settings.OtlpSettings?.CopySettingsTo(options); pluginManager.ConfigureMetricsOptions(options); pluginManager.ConfigureMetricsOptions(metricReaderOptions); diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationTracerHelper.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationTracerHelper.cs index ba167a5a5e..da33a94f13 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationTracerHelper.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationTracerHelper.cs @@ -247,10 +247,7 @@ public static TracerProviderBuilder AddOtlpExporter(TracerProviderBuilder builde { return builder.AddOtlpExporter(options => { - if (settings.OtlpExportProtocol.HasValue) - { - options.Protocol = settings.OtlpExportProtocol.Value; - } + settings.OtlpSettings?.CopySettingsTo(options); pluginManager.ConfigureTracesOptions(options); }); diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/LogSettings.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/LogSettings.cs index ba72028638..58963b9328 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/LogSettings.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/LogSettings.cs @@ -1,6 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +using OpenTelemetry.AutoInstrumentation.Configurations.Otlp; using OpenTelemetry.AutoInstrumentation.Logging; namespace OpenTelemetry.AutoInstrumentation.Configurations; @@ -37,10 +38,20 @@ internal class LogSettings : Settings /// public IReadOnlyList EnabledInstrumentations { get; private set; } = new List(); + /// + /// Gets logs OTLP Settings. + /// + public OtlpSettings? OtlpSettings { get; private set; } + protected override void OnLoad(Configuration configuration) { LogsEnabled = configuration.GetBool(ConfigurationKeys.Logs.LogsEnabled) ?? true; LogExporter = ParseLogExporter(configuration); + if (LogExporter == LogExporter.Otlp) + { + OtlpSettings = new OtlpSettings(OtlpSignalType.Logs, configuration); + } + ConsoleExporterEnabled = configuration.GetBool(ConfigurationKeys.Logs.ConsoleExporterEnabled) ?? false; IncludeFormattedMessage = configuration.GetBool(ConfigurationKeys.Logs.IncludeFormattedMessage) ?? false; diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/MetricSettings.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/MetricSettings.cs index 9986fd4917..19df93a995 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/MetricSettings.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/MetricSettings.cs @@ -1,6 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +using OpenTelemetry.AutoInstrumentation.Configurations.Otlp; using OpenTelemetry.AutoInstrumentation.Logging; namespace OpenTelemetry.AutoInstrumentation.Configurations; @@ -37,9 +38,19 @@ internal class MetricSettings : Settings /// public IList Meters { get; } = new List(); + /// + /// Gets metrics OTLP Settings. + /// + public OtlpSettings? OtlpSettings { get; private set; } + protected override void OnLoad(Configuration configuration) { MetricExporter = ParseMetricExporter(configuration); + if (MetricExporter == MetricsExporter.Otlp) + { + OtlpSettings = new OtlpSettings(OtlpSignalType.Metrics, configuration); + } + ConsoleExporterEnabled = configuration.GetBool(ConfigurationKeys.Metrics.ConsoleExporterEnabled) ?? false; var instrumentationEnabledByDefault = diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs new file mode 100644 index 0000000000..b8729e7669 --- /dev/null +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs @@ -0,0 +1,87 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +using OpenTelemetry.Exporter; + +namespace OpenTelemetry.AutoInstrumentation.Configurations.Otlp; + +/// +/// Overrides SDK logic and sets separate values for every signal +/// based on priorities of environment variables. +/// +internal class OtlpSettings +{ + public OtlpSettings(OtlpSignalType signalType, Configuration configuration) + { + Protocol = GetExporterOtlpProtocol(signalType, configuration); + + var (priority, def) = OtlpSpecConfigDefinitions.GetHeadersEnvVars(signalType); + Headers = configuration.GetString(priority, def); + + (priority, def) = OtlpSpecConfigDefinitions.GetTimeoutEnvVars(signalType); + TimeoutMilliseconds = configuration.GetInt32(priority, def); + + (priority, def) = OtlpSpecConfigDefinitions.GetEndpointEnvVars(signalType); + Endpoint = configuration.GetUri(priority, def); + } + + /// + /// Gets the the OTLP transport protocol. Supported values: Grpc and HttpProtobuf. + /// + public OtlpExportProtocol? Protocol { get; private set; } + + /// + /// Gets the optional headers for the connection. + /// + public string? Headers { get; private set; } + + /// + /// Gets the max waiting time (in milliseconds) for the backend to + /// process each batch. Default value: 10000. + /// + public int? TimeoutMilliseconds { get; private set; } + + /// + /// Gets the target to which the exporter is going to send telemetry. + /// + public Uri? Endpoint { get; private set; } + + internal void CopySettingsTo(OtlpExporterOptions options) + { + if (Protocol.HasValue) + { + options.Protocol = Protocol.Value; + } + + if (!string.IsNullOrWhiteSpace(Headers)) + { + options.Headers = Headers; + } + + if (Endpoint is not null) + { + options.Endpoint = Endpoint; + } + + if (TimeoutMilliseconds.HasValue) + { + options.TimeoutMilliseconds = TimeoutMilliseconds.Value; + } + } + + private static OtlpExportProtocol? GetExporterOtlpProtocol(OtlpSignalType signalType, Configuration configuration) + { + // the default in SDK is grpc. http/protobuf should be default for our purposes + var (priority, def) = OtlpSpecConfigDefinitions.GetProtocolEnvVars(signalType); + var exporterOtlpProtocol = configuration.GetString(priority, def); + + if (string.IsNullOrEmpty(exporterOtlpProtocol)) + { + // override settings only for http/protobuf + return OtlpExportProtocol.HttpProtobuf; + } + + // null value here means that it will be handled by OTEL .NET SDK + return null; + } +} diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSignalType.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSignalType.cs new file mode 100644 index 0000000000..1f91bce5f7 --- /dev/null +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSignalType.cs @@ -0,0 +1,11 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +namespace OpenTelemetry.AutoInstrumentation.Configurations.Otlp; + +internal enum OtlpSignalType +{ + Traces, + Metrics, + Logs +} diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs new file mode 100644 index 0000000000..1e9ab603fd --- /dev/null +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs @@ -0,0 +1,86 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +namespace OpenTelemetry.AutoInstrumentation.Configurations.Otlp; + +/// +/// Contains spec environment variable key definitions for OpenTelemetry Protocol (OTLP) exporter. +/// +/// +/// Specification: . +/// +internal static class OtlpSpecConfigDefinitions +{ + public const string DefaultEndpointEnvVarName = "OTEL_EXPORTER_OTLP_ENDPOINT"; + public const string DefaultHeadersEnvVarName = "OTEL_EXPORTER_OTLP_HEADERS"; + public const string DefaultTimeoutEnvVarName = "OTEL_EXPORTER_OTLP_TIMEOUT"; + public const string DefaultProtocolEnvVarName = "OTEL_EXPORTER_OTLP_PROTOCOL"; + + public const string LogsEndpointEnvVarName = "OTEL_EXPORTER_OTLP_LOGS_ENDPOINT"; + public const string LogsHeadersEnvVarName = "OTEL_EXPORTER_OTLP_LOGS_HEADERS"; + public const string LogsTimeoutEnvVarName = "OTEL_EXPORTER_OTLP_LOGS_TIMEOUT"; + public const string LogsProtocolEnvVarName = "OTEL_EXPORTER_OTLP_LOGS_PROTOCOL"; + + public const string MetricsEndpointEnvVarName = "OTEL_EXPORTER_OTLP_METRICS_ENDPOINT"; + public const string MetricsHeadersEnvVarName = "OTEL_EXPORTER_OTLP_METRICS_HEADERS"; + public const string MetricsTimeoutEnvVarName = "OTEL_EXPORTER_OTLP_METRICS_TIMEOUT"; + public const string MetricsProtocolEnvVarName = "OTEL_EXPORTER_OTLP_METRICS_PROTOCOL"; + public const string MetricsTemporalityPreferenceEnvVarName = "OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE"; + + public const string TracesEndpointEnvVarName = "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"; + public const string TracesHeadersEnvVarName = "OTEL_EXPORTER_OTLP_TRACES_HEADERS"; + public const string TracesTimeoutEnvVarName = "OTEL_EXPORTER_OTLP_TRACES_TIMEOUT"; + public const string TracesProtocolEnvVarName = "OTEL_EXPORTER_OTLP_TRACES_PROTOCOL"; + + public static (string PriorityVar, string DefaultVar) GetProtocolEnvVars(OtlpSignalType signal) + { + var special = signal switch + { + OtlpSignalType.Traces => TracesProtocolEnvVarName, + OtlpSignalType.Metrics => MetricsProtocolEnvVarName, + OtlpSignalType.Logs => LogsProtocolEnvVarName, + _ => throw new NotSupportedException() + }; + + return (special, DefaultProtocolEnvVarName); + } + + public static (string PriorityVar, string DefaultVar) GetHeadersEnvVars(OtlpSignalType signal) + { + var special = signal switch + { + OtlpSignalType.Traces => TracesHeadersEnvVarName, + OtlpSignalType.Metrics => MetricsHeadersEnvVarName, + OtlpSignalType.Logs => LogsHeadersEnvVarName, + _ => throw new NotSupportedException() + }; + + return (special, DefaultHeadersEnvVarName); + } + + public static (string PriorityVar, string DefaultVar) GetEndpointEnvVars(OtlpSignalType signal) + { + var special = signal switch + { + OtlpSignalType.Traces => TracesEndpointEnvVarName, + OtlpSignalType.Metrics => MetricsEndpointEnvVarName, + OtlpSignalType.Logs => LogsEndpointEnvVarName, + _ => throw new NotSupportedException() + }; + + return (special, DefaultEndpointEnvVarName); + } + + public static (string PriorityVar, string DefaultVar) GetTimeoutEnvVars(OtlpSignalType signal) + { + var special = signal switch + { + OtlpSignalType.Traces => TracesTimeoutEnvVarName, + OtlpSignalType.Metrics => MetricsTimeoutEnvVarName, + OtlpSignalType.Logs => LogsTimeoutEnvVarName, + _ => throw new NotSupportedException() + }; + + return (special, DefaultTimeoutEnvVarName); + } +} diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Settings.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Settings.cs index 5fc53eb408..eece253424 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/Settings.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Settings.cs @@ -1,8 +1,6 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -using OpenTelemetry.Exporter; - namespace OpenTelemetry.AutoInstrumentation.Configurations; /// @@ -10,11 +8,6 @@ namespace OpenTelemetry.AutoInstrumentation.Configurations; /// internal abstract class Settings { - /// - /// Gets the the OTLP transport protocol. Supported values: Grpc and HttpProtobuf. - /// - public OtlpExportProtocol? OtlpExportProtocol { get; private set; } - public static T FromDefaultSources(bool failFast) where T : Settings, new() { @@ -26,7 +19,6 @@ public static T FromDefaultSources(bool failFast) public void Load(Configuration configuration) { - OtlpExportProtocol = GetExporterOtlpProtocol(configuration); OnLoad(configuration); } @@ -36,19 +28,4 @@ public void Load(Configuration configuration) /// /// The to use when retrieving configuration values. protected abstract void OnLoad(Configuration configuration); - - private static OtlpExportProtocol? GetExporterOtlpProtocol(Configuration configuration) - { - // the default in SDK is grpc. http/protobuf should be default for our purposes - var exporterOtlpProtocol = configuration.GetString(ConfigurationKeys.ExporterOtlpProtocol); - - if (string.IsNullOrEmpty(exporterOtlpProtocol)) - { - // override settings only for http/protobuf - return Exporter.OtlpExportProtocol.HttpProtobuf; - } - - // null value here means that it will be handled by OTEL .NET SDK - return null; - } } diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/TracerSettings.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/TracerSettings.cs index 37bcfbbcdc..cd36e15036 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/TracerSettings.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/TracerSettings.cs @@ -1,6 +1,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 +using OpenTelemetry.AutoInstrumentation.Configurations.Otlp; using OpenTelemetry.AutoInstrumentation.Logging; namespace OpenTelemetry.AutoInstrumentation.Configurations; @@ -52,9 +53,19 @@ internal class TracerSettings : Settings /// public InstrumentationOptions InstrumentationOptions { get; private set; } = new(new Configuration(failFast: false)); + /// + /// Gets tracing OTLP Settings. + /// + public OtlpSettings? OtlpSettings { get; private set; } + protected override void OnLoad(Configuration configuration) { TracesExporter = ParseTracesExporter(configuration); + if (TracesExporter == TracesExporter.Otlp) + { + OtlpSettings = new OtlpSettings(OtlpSignalType.Traces, configuration); + } + ConsoleExporterEnabled = configuration.GetBool(ConfigurationKeys.Traces.ConsoleExporterEnabled) ?? false; var instrumentationEnabledByDefault = diff --git a/src/OpenTelemetry.AutoInstrumentation/Logger/LogBuilderExtensions.cs b/src/OpenTelemetry.AutoInstrumentation/Logger/LogBuilderExtensions.cs index 88cd059a71..58de74fb21 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Logger/LogBuilderExtensions.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Logger/LogBuilderExtensions.cs @@ -85,10 +85,7 @@ private static void AddOpenTelemetryLogs(ILoggingBuilder builder) case LogExporter.Otlp: options.AddOtlpExporter(otlpOptions => { - if (settings.OtlpExportProtocol.HasValue) - { - otlpOptions.Protocol = settings.OtlpExportProtocol.Value; - } + settings.OtlpSettings?.CopySettingsTo(otlpOptions); pluginManager?.ConfigureLogsOptions(otlpOptions); }); diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/ConfigurationTests.cs b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/ConfigurationTests.cs index 9b7b95960a..5368ca61ca 100644 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/ConfigurationTests.cs +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/ConfigurationTests.cs @@ -167,4 +167,35 @@ public void ParseList_ParseNullAsEmpty() list.Should().BeEmpty(); } + + [Fact] + public void GetString_Priority_Exists() + { + var source = new Configuration(false, new NameValueConfigurationSource(false, new NameValueCollection + { + { "PRIORITY_KEY", "priority-value" }, + { "DEFAULT_KEY", "default-value" } + })); + + source.GetString("PRIORITY_KEY", "DEFAULT_KEY").Should().Be("priority-value"); + } + + [Fact] + public void GetString_Priority_NotExists() + { + var source = new Configuration(false, new NameValueConfigurationSource(false, new NameValueCollection + { + { "DEFAULT_KEY", "default-value" } + })); + + source.GetString("PRIORITY_KEY", "DEFAULT_KEY").Should().Be("default-value"); + } + + [Fact] + public void GetString_Priority_Empty() + { + var source = new Configuration(false, new NameValueConfigurationSource(false, new NameValueCollection())); + + source.GetString("PRIORITY_KEY", "DEFAULT_KEY").Should().BeNull(); + } } diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/SettingsTests.cs b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/SettingsTests.cs index e8706ab12e..e825d71ca3 100644 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/SettingsTests.cs +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/SettingsTests.cs @@ -7,6 +7,8 @@ using OpenTelemetry.Exporter; using Xunit; +using AutoOtlpDefinitions = OpenTelemetry.AutoInstrumentation.Configurations.Otlp.OtlpSpecConfigDefinitions; + namespace OpenTelemetry.AutoInstrumentation.Tests.Configurations; // use collection to indicate that tests should not be run @@ -35,7 +37,6 @@ internal void GeneralSettings_DefaultValues() settings.Plugins.Should().BeEmpty(); settings.EnabledResourceDetectors.Should().NotBeEmpty(); settings.FlushOnUnhandledException.Should().BeFalse(); - settings.OtlpExportProtocol.Should().Be(OtlpExportProtocol.HttpProtobuf); } } @@ -48,7 +49,6 @@ internal void TracerSettings_DefaultValues() { settings.TracesEnabled.Should().BeTrue(); settings.TracesExporter.Should().Be(TracesExporter.Otlp); - settings.OtlpExportProtocol.Should().Be(OtlpExportProtocol.HttpProtobuf); settings.ConsoleExporterEnabled.Should().BeFalse(); settings.EnabledInstrumentations.Should().NotBeEmpty(); settings.ActivitySources.Should().BeEquivalentTo(new List { "OpenTelemetry.AutoInstrumentation.*" }); @@ -71,6 +71,12 @@ internal void TracerSettings_DefaultValues() settings.InstrumentationOptions.HttpInstrumentationCaptureResponseHeaders.Should().BeEmpty(); settings.InstrumentationOptions.OracleMdaSetDbStatementForText.Should().BeFalse(); settings.InstrumentationOptions.SqlClientSetDbStatementForText.Should().BeFalse(); + + settings.OtlpSettings.Should().NotBeNull(); + settings.OtlpSettings!.Protocol.Should().Be(OtlpExportProtocol.HttpProtobuf); + settings.OtlpSettings.Endpoint.Should().BeNull(); + settings.OtlpSettings.Headers.Should().BeNull(); + settings.OtlpSettings.TimeoutMilliseconds.Should().BeNull(); } } @@ -83,10 +89,15 @@ internal void MeterSettings_DefaultValues() { settings.MetricsEnabled.Should().BeTrue(); settings.MetricExporter.Should().Be(MetricsExporter.Otlp); - settings.OtlpExportProtocol.Should().Be(OtlpExportProtocol.HttpProtobuf); settings.ConsoleExporterEnabled.Should().BeFalse(); settings.EnabledInstrumentations.Should().NotBeEmpty(); settings.Meters.Should().BeEmpty(); + + settings.OtlpSettings.Should().NotBeNull(); + settings.OtlpSettings!.Protocol.Should().Be(OtlpExportProtocol.HttpProtobuf); + settings.OtlpSettings.Endpoint.Should().BeNull(); + settings.OtlpSettings.Headers.Should().BeNull(); + settings.OtlpSettings.TimeoutMilliseconds.Should().BeNull(); } } @@ -99,10 +110,15 @@ internal void LogSettings_DefaultValues() { settings.LogsEnabled.Should().BeTrue(); settings.LogExporter.Should().Be(LogExporter.Otlp); - settings.OtlpExportProtocol.Should().Be(OtlpExportProtocol.HttpProtobuf); settings.ConsoleExporterEnabled.Should().BeFalse(); settings.EnabledInstrumentations.Should().NotBeEmpty(); settings.IncludeFormattedMessage.Should().BeFalse(); + + settings.OtlpSettings.Should().NotBeNull(); + settings.OtlpSettings!.Protocol.Should().Be(OtlpExportProtocol.HttpProtobuf); + settings.OtlpSettings.Endpoint.Should().BeNull(); + settings.OtlpSettings.Headers.Should().BeNull(); + settings.OtlpSettings.TimeoutMilliseconds.Should().BeNull(); } } @@ -315,12 +331,13 @@ internal void IncludeFormattedMessage_DependsOnCorrespondingEnvVariable(string i [InlineData("nonExistingProtocol", null)] internal void OtlpExportProtocol_DependsOnCorrespondingEnvVariable(string? otlpProtocol, OtlpExportProtocol? expectedOtlpExportProtocol) { - Environment.SetEnvironmentVariable(ConfigurationKeys.ExporterOtlpProtocol, otlpProtocol); + Environment.SetEnvironmentVariable(AutoOtlpDefinitions.DefaultProtocolEnvVarName, otlpProtocol); var settings = Settings.FromDefaultSources(false); // null values for expected data will be handled by OTel .NET SDK - settings.OtlpExportProtocol.Should().Be(expectedOtlpExportProtocol); + settings.OtlpSettings.Should().NotBeNull(); + settings.OtlpSettings!.Protocol.Should().Be(expectedOtlpExportProtocol); } [Theory] @@ -379,7 +396,7 @@ private static void ClearEnvVars() } Environment.SetEnvironmentVariable(ConfigurationKeys.Traces.Exporter, null); - Environment.SetEnvironmentVariable(ConfigurationKeys.ExporterOtlpProtocol, null); + Environment.SetEnvironmentVariable(AutoOtlpDefinitions.DefaultProtocolEnvVarName, null); Environment.SetEnvironmentVariable(ConfigurationKeys.FlushOnUnhandledException, null); Environment.SetEnvironmentVariable(ConfigurationKeys.ResourceDetectorEnabled, null); From e8cc43701262e57b19089010a0c13b578af71e6e Mon Sep 17 00:00:00 2001 From: RassK Date: Mon, 22 Jul 2024 17:34:54 +0300 Subject: [PATCH 2/7] remove unused variable --- .../Configurations/Otlp/OtlpSpecConfigDefinitions.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs index 1e9ab603fd..64c70a54b3 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs @@ -25,7 +25,6 @@ internal static class OtlpSpecConfigDefinitions public const string MetricsHeadersEnvVarName = "OTEL_EXPORTER_OTLP_METRICS_HEADERS"; public const string MetricsTimeoutEnvVarName = "OTEL_EXPORTER_OTLP_METRICS_TIMEOUT"; public const string MetricsProtocolEnvVarName = "OTEL_EXPORTER_OTLP_METRICS_PROTOCOL"; - public const string MetricsTemporalityPreferenceEnvVarName = "OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE"; public const string TracesEndpointEnvVarName = "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT"; public const string TracesHeadersEnvVarName = "OTEL_EXPORTER_OTLP_TRACES_HEADERS"; From 22d914c706cbe005dd9e70f37a41837173e40a5d Mon Sep 17 00:00:00 2001 From: RassK Date: Mon, 22 Jul 2024 21:08:42 +0300 Subject: [PATCH 3/7] remove default handling from auto --- .../Configurations/Configuration.cs | 33 ------------------- .../Configurations/Otlp/OtlpSettings.cs | 17 +++++----- .../Otlp/OtlpSpecConfigDefinitions.cs | 24 +++++--------- .../Configurations/ConfigurationTests.cs | 31 ----------------- 4 files changed, 17 insertions(+), 88 deletions(-) diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Configuration.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Configuration.cs index 7cc615a95d..8a17379050 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/Configuration.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Configuration.cs @@ -31,17 +31,6 @@ public Configuration(bool failFast, params IConfigurationSource[] sources) .FirstOrDefault(value => !string.IsNullOrEmpty(value)); } - /// - /// Gets the value based on priority. - /// - /// The priority key that is fetched first. - /// The default key performed as a fallback. - /// The value of the setting, or null if not found. - public string? GetString(string priorityKey, string defaultKey) - { - return GetString(priorityKey) ?? GetString(defaultKey); - } - /// /// Gets the value of the first setting found with /// the specified key from the current list of configuration sources. @@ -55,17 +44,6 @@ public Configuration(bool failFast, params IConfigurationSource[] sources) .FirstOrDefault(value => value.HasValue); } - /// - /// Gets the value based on priority. - /// - /// The priority key that is fetched first. - /// The default key performed as a fallback. - /// The value of the setting, or null if not found. - public int? GetInt32(string priorityKey, string defaultKey) - { - return GetInt32(priorityKey) ?? GetInt32(defaultKey); - } - /// /// Gets the value of the first setting found with /// the specified key from the current list of configuration sources. @@ -110,15 +88,4 @@ public Configuration(bool failFast, params IConfigurationSource[] sources) return null; } - - /// - /// Gets the value based on priority. - /// - /// The priority key that is fetched first. - /// The default key performed as a fallback. - /// The value of the setting, or null if not found. - public Uri? GetUri(string priorityKey, string defaultKey) - { - return GetUri(priorityKey) ?? GetUri(defaultKey); - } } diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs index b8729e7669..b3641f49c1 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs @@ -15,14 +15,14 @@ public OtlpSettings(OtlpSignalType signalType, Configuration configuration) { Protocol = GetExporterOtlpProtocol(signalType, configuration); - var (priority, def) = OtlpSpecConfigDefinitions.GetHeadersEnvVars(signalType); - Headers = configuration.GetString(priority, def); + var priorityVar = OtlpSpecConfigDefinitions.GetHeadersEnvVar(signalType); + Headers = configuration.GetString(priorityVar); - (priority, def) = OtlpSpecConfigDefinitions.GetTimeoutEnvVars(signalType); - TimeoutMilliseconds = configuration.GetInt32(priority, def); + priorityVar = OtlpSpecConfigDefinitions.GetTimeoutEnvVar(signalType); + TimeoutMilliseconds = configuration.GetInt32(priorityVar); - (priority, def) = OtlpSpecConfigDefinitions.GetEndpointEnvVars(signalType); - Endpoint = configuration.GetUri(priority, def); + priorityVar = OtlpSpecConfigDefinitions.GetEndpointEnvVar(signalType); + Endpoint = configuration.GetUri(priorityVar); } /// @@ -72,8 +72,9 @@ internal void CopySettingsTo(OtlpExporterOptions options) private static OtlpExportProtocol? GetExporterOtlpProtocol(OtlpSignalType signalType, Configuration configuration) { // the default in SDK is grpc. http/protobuf should be default for our purposes - var (priority, def) = OtlpSpecConfigDefinitions.GetProtocolEnvVars(signalType); - var exporterOtlpProtocol = configuration.GetString(priority, def); + var priorityVar = OtlpSpecConfigDefinitions.GetProtocolEnvVar(signalType); + var exporterOtlpProtocol = configuration.GetString(priorityVar) ?? + configuration.GetString(OtlpSpecConfigDefinitions.DefaultProtocolEnvVarName); if (string.IsNullOrEmpty(exporterOtlpProtocol)) { diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs index 64c70a54b3..6a2aef5a56 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs @@ -31,55 +31,47 @@ internal static class OtlpSpecConfigDefinitions public const string TracesTimeoutEnvVarName = "OTEL_EXPORTER_OTLP_TRACES_TIMEOUT"; public const string TracesProtocolEnvVarName = "OTEL_EXPORTER_OTLP_TRACES_PROTOCOL"; - public static (string PriorityVar, string DefaultVar) GetProtocolEnvVars(OtlpSignalType signal) + public static string GetProtocolEnvVar(OtlpSignalType signal) { - var special = signal switch + return signal switch { OtlpSignalType.Traces => TracesProtocolEnvVarName, OtlpSignalType.Metrics => MetricsProtocolEnvVarName, OtlpSignalType.Logs => LogsProtocolEnvVarName, _ => throw new NotSupportedException() }; - - return (special, DefaultProtocolEnvVarName); } - public static (string PriorityVar, string DefaultVar) GetHeadersEnvVars(OtlpSignalType signal) + public static string GetHeadersEnvVar(OtlpSignalType signal) { - var special = signal switch + return signal switch { OtlpSignalType.Traces => TracesHeadersEnvVarName, OtlpSignalType.Metrics => MetricsHeadersEnvVarName, OtlpSignalType.Logs => LogsHeadersEnvVarName, _ => throw new NotSupportedException() }; - - return (special, DefaultHeadersEnvVarName); } - public static (string PriorityVar, string DefaultVar) GetEndpointEnvVars(OtlpSignalType signal) + public static string GetEndpointEnvVar(OtlpSignalType signal) { - var special = signal switch + return signal switch { OtlpSignalType.Traces => TracesEndpointEnvVarName, OtlpSignalType.Metrics => MetricsEndpointEnvVarName, OtlpSignalType.Logs => LogsEndpointEnvVarName, _ => throw new NotSupportedException() }; - - return (special, DefaultEndpointEnvVarName); } - public static (string PriorityVar, string DefaultVar) GetTimeoutEnvVars(OtlpSignalType signal) + public static string GetTimeoutEnvVar(OtlpSignalType signal) { - var special = signal switch + return signal switch { OtlpSignalType.Traces => TracesTimeoutEnvVarName, OtlpSignalType.Metrics => MetricsTimeoutEnvVarName, OtlpSignalType.Logs => LogsTimeoutEnvVarName, _ => throw new NotSupportedException() }; - - return (special, DefaultTimeoutEnvVarName); } } diff --git a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/ConfigurationTests.cs b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/ConfigurationTests.cs index 5368ca61ca..9b7b95960a 100644 --- a/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/ConfigurationTests.cs +++ b/test/OpenTelemetry.AutoInstrumentation.Tests/Configurations/ConfigurationTests.cs @@ -167,35 +167,4 @@ public void ParseList_ParseNullAsEmpty() list.Should().BeEmpty(); } - - [Fact] - public void GetString_Priority_Exists() - { - var source = new Configuration(false, new NameValueConfigurationSource(false, new NameValueCollection - { - { "PRIORITY_KEY", "priority-value" }, - { "DEFAULT_KEY", "default-value" } - })); - - source.GetString("PRIORITY_KEY", "DEFAULT_KEY").Should().Be("priority-value"); - } - - [Fact] - public void GetString_Priority_NotExists() - { - var source = new Configuration(false, new NameValueConfigurationSource(false, new NameValueCollection - { - { "DEFAULT_KEY", "default-value" } - })); - - source.GetString("PRIORITY_KEY", "DEFAULT_KEY").Should().Be("default-value"); - } - - [Fact] - public void GetString_Priority_Empty() - { - var source = new Configuration(false, new NameValueConfigurationSource(false, new NameValueCollection())); - - source.GetString("PRIORITY_KEY", "DEFAULT_KEY").Should().BeNull(); - } } From a87334555433db3a336d3a4fddc47bf05e201eb8 Mon Sep 17 00:00:00 2001 From: RassK Date: Tue, 23 Jul 2024 12:21:49 +0300 Subject: [PATCH 4/7] docs, changelog, cleanup --- CHANGELOG.md | 2 + docs/config.md | 42 ++++++++----- .../EnvironmentConfigurationMetricHelper.cs | 3 +- .../EnvironmentConfigurationTracerHelper.cs | 3 +- .../Configurations/Otlp/OtlpSettings.cs | 5 +- .../Otlp/OtlpSpecConfigDefinitions.cs | 60 ++++++++----------- .../Logger/LogBuilderExtensions.cs | 3 +- 7 files changed, 62 insertions(+), 56 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af67c11c60..d0e4776e27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ This component adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.h ### Added - Support for Operating System resource detector. +- Support signal specific OTLP exporter variables. See list of supported variables + [here](https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/). ### Changed diff --git a/docs/config.md b/docs/config.md index 22b3b0a553..56747812aa 100644 --- a/docs/config.md +++ b/docs/config.md @@ -93,7 +93,7 @@ The following resource detectors are included and enabled by default: | `AZUREAPPSERVICE` | Azure App Service detector | [Azure resource detector documentation](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Resources.Azure-1.0.0-beta.8/src/OpenTelemetry.Resources.Azure/README.md) | [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | | `CONTAINER` | Container detector | [Container resource detector documentation](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Resources.Container-1.0.0-beta.9/src/OpenTelemetry.Resources.Container/README.md) **Not supported on .NET Framework** | [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | | `HOST` | Host detector | [Host resource detector documentation](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Resources.Host-0.1.0-beta.2/src/OpenTelemetry.Resources.Host/README.md) | [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OPERATINGSYSTEM` | Operating System detector | [Operating System resource detector documentation](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Resources.OperatingSystem-0.1.0-alpha.2/src/OpenTelemetry.Resources.OperatingSystem/README.md) | [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OPERATINGSYSTEM` | Operating System detector | [Operating System resource detector documentation](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Resources.OperatingSystem-0.1.0-alpha.2/src/OpenTelemetry.Resources.OperatingSystem/README.md) | [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | | `PROCESS` | Process detector | [Process resource detector documentation](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Resources.Process-0.1.0-beta.2/src/OpenTelemetry.Resources.Process/README.md) | [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | | `PROCESSRUNTIME` | Process Runtime detector | [Process Runtime resource detector documentation](https://github.com/open-telemetry/opentelemetry-dotnet-contrib/blob/Resources.ProcessRuntime-0.1.0-beta.2/src/OpenTelemetry.Resources.ProcessRuntime/README.md) | [Experimental](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | @@ -300,20 +300,32 @@ To customize the OTLP exporter using environment variables, see the [OTLP exporter documentation](https://github.com/open-telemetry/opentelemetry-dotnet/tree/core-1.7.0/src/OpenTelemetry.Exporter.OpenTelemetryProtocol#environment-variables). Important environment variables include: -| Environment variable | Description | Default value | Status | -|------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------| -| `OTEL_EXPORTER_OTLP_ENDPOINT` | Target endpoint for the OTLP exporter. See [the OpenTelemetry specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md) for more details. | `http://localhost:4318` for the `http/protobuf` protocol, `http://localhost:4317` for the `grpc` protocol | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OTEL_EXPORTER_OTLP_PROTOCOL` | OTLP exporter transport protocol. Supported values are `grpc`, `http/protobuf`. [1] | `http/protobuf` | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OTEL_EXPORTER_OTLP_TIMEOUT` | The max waiting time (in milliseconds) for the backend to process each batch. | `10000` | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OTEL_EXPORTER_OTLP_HEADERS` | Comma-separated list of additional HTTP headers sent with each export, for example: `Authorization=secret,X-Key=Value`. | | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT` | Maximum allowed attribute value size. | none | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OTEL_ATTRIBUTE_COUNT_LIMIT` | Maximum allowed span attribute count. | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT` | Maximum allowed attribute value size. [Not applicable for metrics.](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.15.0/specification/metrics/sdk.md#attribute-limits). | none | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT` | Maximum allowed span attribute count. [Not applicable for metrics.](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.15.0/specification/metrics/sdk.md#attribute-limits). | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OTEL_SPAN_EVENT_COUNT_LIMIT` | Maximum allowed span event count. | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OTEL_SPAN_LINK_COUNT_LIMIT` | Maximum allowed span link count. | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT` | Maximum allowed attribute per span event count. | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | -| `OTEL_LINK_ATTRIBUTE_COUNT_LIMIT` | Maximum allowed attribute per span link count. | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| Environment variable | Description | Default value | Status | +|------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------| +| `OTEL_EXPORTER_OTLP_ENDPOINT` | Target endpoint for the OTLP exporter. See [the OpenTelemetry specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md) for more details. | `http/protobuf`: `http://localhost:4318`, `grpc`: `http://localhost:4317` | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` | Equivalent to `OTEL_EXPORTER_OTLP_ENDPOINT`, but applies only to traces. | `http/protobuf`: `http://localhost:4318/v1/traces`, `grpc`: `http://localhost:4317` | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` | Equivalent to `OTEL_EXPORTER_OTLP_ENDPOINT`, but applies only to metrics. | `http/protobuf`: `http://localhost:4318/v1/metrics`, `grpc`: `http://localhost:4317` | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` | Equivalent to `OTEL_EXPORTER_OTLP_ENDPOINT`, but applies only to logs. | `http/protobuf`: `http://localhost:4318/v1/logs`, `grpc`: `http://localhost:4317` | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_PROTOCOL` | OTLP exporter transport protocol. Supported values are `grpc`, `http/protobuf`. [1] | `http/protobuf` | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_TRACES_PROTOCOL` | Equivalent to `OTEL_EXPORTER_OTLP_PROTOCOL`, but applies only to traces. | `http/protobuf` | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_METRICS_PROTOCOL` | Equivalent to `OTEL_EXPORTER_OTLP_PROTOCOL`, but applies only to metrics. | `http/protobuf` | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` | Equivalent to `OTEL_EXPORTER_OTLP_PROTOCOL`, but applies only to logs. | `http/protobuf` | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_TIMEOUT` | The max waiting time (in milliseconds) for the backend to process each batch. | `10000` (10s) | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT` | Equivalent to `OTEL_EXPORTER_OTLP_TIMEOUT`, but applies only to traces. | `10000` (10s) | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_METRICS_TIMEOUT` | Equivalent to `OTEL_EXPORTER_OTLP_TIMEOUT`, but applies only to metrics. | `10000` (10s) | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_LOGS_TIMEOUT` | Equivalent to `OTEL_EXPORTER_OTLP_TIMEOUT`, but applies only to logs. | `10000` (10s) | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_HEADERS` | Comma-separated list of additional HTTP headers sent with each export, for example: `Authorization=secret,X-Key=Value`. | | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_TRACES_HEADERS` | Equivalent to `OTEL_EXPORTER_OTLP_HEADERS`, but applies only to traces. | | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_METRICS_HEADERS` | Equivalent to `OTEL_EXPORTER_OTLP_HEADERS`, but applies only to metrics. | | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EXPORTER_OTLP_LOGS_HEADERS` | Equivalent to `OTEL_EXPORTER_OTLP_HEADERS`, but applies only to logs. | | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT` | Maximum allowed attribute value size. | none | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_ATTRIBUTE_COUNT_LIMIT` | Maximum allowed span attribute count. | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT` | Maximum allowed attribute value size. [Not applicable for metrics.](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.15.0/specification/metrics/sdk.md#attribute-limits). | none | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT` | Maximum allowed span attribute count. [Not applicable for metrics.](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.15.0/specification/metrics/sdk.md#attribute-limits). | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_SPAN_EVENT_COUNT_LIMIT` | Maximum allowed span event count. | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_SPAN_LINK_COUNT_LIMIT` | Maximum allowed span link count. | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_EVENT_ATTRIBUTE_COUNT_LIMIT` | Maximum allowed attribute per span event count. | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | +| `OTEL_LINK_ATTRIBUTE_COUNT_LIMIT` | Maximum allowed attribute per span link count. | 128 | [Stable](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/versioning-and-stability.md) | **[1]**: Considerations on the `OTEL_EXPORTER_OTLP_PROTOCOL`: diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs index b26258554a..1daee06792 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationMetricHelper.cs @@ -153,7 +153,8 @@ public static MeterProviderBuilder AddOtlpExporter(MeterProviderBuilder builder, { return builder.AddOtlpExporter((options, metricReaderOptions) => { - settings.OtlpSettings?.CopySettingsTo(options); + // Copy Auto settings to SDK settings + settings.OtlpSettings?.CopyTo(options); pluginManager.ConfigureMetricsOptions(options); pluginManager.ConfigureMetricsOptions(metricReaderOptions); diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationTracerHelper.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationTracerHelper.cs index da33a94f13..1828c84283 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationTracerHelper.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/EnvironmentConfigurationTracerHelper.cs @@ -247,7 +247,8 @@ public static TracerProviderBuilder AddOtlpExporter(TracerProviderBuilder builde { return builder.AddOtlpExporter(options => { - settings.OtlpSettings?.CopySettingsTo(options); + // Copy Auto settings to SDK settings + settings.OtlpSettings?.CopyTo(options); pluginManager.ConfigureTracesOptions(options); }); diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs index b3641f49c1..a4b1d3e7c4 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs @@ -7,7 +7,7 @@ namespace OpenTelemetry.AutoInstrumentation.Configurations.Otlp; /// /// Overrides SDK logic and sets separate values for every signal -/// based on priorities of environment variables. +/// when more detailed environment variable is set. /// internal class OtlpSettings { @@ -46,7 +46,7 @@ public OtlpSettings(OtlpSignalType signalType, Configuration configuration) /// public Uri? Endpoint { get; private set; } - internal void CopySettingsTo(OtlpExporterOptions options) + public void CopyTo(OtlpExporterOptions options) { if (Protocol.HasValue) { @@ -60,6 +60,7 @@ internal void CopySettingsTo(OtlpExporterOptions options) if (Endpoint is not null) { + // NOTE! This must be always full path. Endpoint setter is disabling further path handling in SDK side. options.Endpoint = Endpoint; } diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs index 6a2aef5a56..200561fda8 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSpecConfigDefinitions.cs @@ -31,47 +31,35 @@ internal static class OtlpSpecConfigDefinitions public const string TracesTimeoutEnvVarName = "OTEL_EXPORTER_OTLP_TRACES_TIMEOUT"; public const string TracesProtocolEnvVarName = "OTEL_EXPORTER_OTLP_TRACES_PROTOCOL"; - public static string GetProtocolEnvVar(OtlpSignalType signal) + public static string GetProtocolEnvVar(OtlpSignalType signal) => signal switch { - return signal switch - { - OtlpSignalType.Traces => TracesProtocolEnvVarName, - OtlpSignalType.Metrics => MetricsProtocolEnvVarName, - OtlpSignalType.Logs => LogsProtocolEnvVarName, - _ => throw new NotSupportedException() - }; - } + OtlpSignalType.Traces => TracesProtocolEnvVarName, + OtlpSignalType.Metrics => MetricsProtocolEnvVarName, + OtlpSignalType.Logs => LogsProtocolEnvVarName, + _ => throw new NotSupportedException() + }; - public static string GetHeadersEnvVar(OtlpSignalType signal) + public static string GetHeadersEnvVar(OtlpSignalType signal) => signal switch { - return signal switch - { - OtlpSignalType.Traces => TracesHeadersEnvVarName, - OtlpSignalType.Metrics => MetricsHeadersEnvVarName, - OtlpSignalType.Logs => LogsHeadersEnvVarName, - _ => throw new NotSupportedException() - }; - } + OtlpSignalType.Traces => TracesHeadersEnvVarName, + OtlpSignalType.Metrics => MetricsHeadersEnvVarName, + OtlpSignalType.Logs => LogsHeadersEnvVarName, + _ => throw new NotSupportedException() + }; - public static string GetEndpointEnvVar(OtlpSignalType signal) + public static string GetEndpointEnvVar(OtlpSignalType signal) => signal switch { - return signal switch - { - OtlpSignalType.Traces => TracesEndpointEnvVarName, - OtlpSignalType.Metrics => MetricsEndpointEnvVarName, - OtlpSignalType.Logs => LogsEndpointEnvVarName, - _ => throw new NotSupportedException() - }; - } + OtlpSignalType.Traces => TracesEndpointEnvVarName, + OtlpSignalType.Metrics => MetricsEndpointEnvVarName, + OtlpSignalType.Logs => LogsEndpointEnvVarName, + _ => throw new NotSupportedException() + }; - public static string GetTimeoutEnvVar(OtlpSignalType signal) + public static string GetTimeoutEnvVar(OtlpSignalType signal) => signal switch { - return signal switch - { - OtlpSignalType.Traces => TracesTimeoutEnvVarName, - OtlpSignalType.Metrics => MetricsTimeoutEnvVarName, - OtlpSignalType.Logs => LogsTimeoutEnvVarName, - _ => throw new NotSupportedException() - }; - } + OtlpSignalType.Traces => TracesTimeoutEnvVarName, + OtlpSignalType.Metrics => MetricsTimeoutEnvVarName, + OtlpSignalType.Logs => LogsTimeoutEnvVarName, + _ => throw new NotSupportedException() + }; } diff --git a/src/OpenTelemetry.AutoInstrumentation/Logger/LogBuilderExtensions.cs b/src/OpenTelemetry.AutoInstrumentation/Logger/LogBuilderExtensions.cs index 58de74fb21..dd0d6041ea 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Logger/LogBuilderExtensions.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Logger/LogBuilderExtensions.cs @@ -85,7 +85,8 @@ private static void AddOpenTelemetryLogs(ILoggingBuilder builder) case LogExporter.Otlp: options.AddOtlpExporter(otlpOptions => { - settings.OtlpSettings?.CopySettingsTo(otlpOptions); + // Copy Auto settings to SDK settings + settings.OtlpSettings?.CopyTo(otlpOptions); pluginManager?.ConfigureLogsOptions(otlpOptions); }); From d68397246b26e6b99ce886817c474b7ea8dce9b7 Mon Sep 17 00:00:00 2001 From: RassK Date: Tue, 23 Jul 2024 13:56:57 +0300 Subject: [PATCH 5/7] update changelog --- CHANGELOG.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ee15118412..aed8b751fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,19 @@ This component adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.h ### Added - Support for Operating System resource detector. -- Support signal specific OTLP exporter variables. See list of supported variables - [here](https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/). +- Support signal specific OTLP exporter variables (See [docs](/docs/config.md#otlp)): + - `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` + - `OTEL_EXPORTER_OTLP_TRACES_HEADERS` + - `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT` + - `OTEL_EXPORTER_OTLP_TRACES_PROTOCOL` + - `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` + - `OTEL_EXPORTER_OTLP_METRICS_HEADERS` + - `OTEL_EXPORTER_OTLP_METRICS_TIMEOUT` + - `OTEL_EXPORTER_OTLP_METRICS_PROTOCOL` + - `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` + - `OTEL_EXPORTER_OTLP_LOGS_HEADERS` + - `OTEL_EXPORTER_OTLP_LOGS_TIMEOUT` + - `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` ### Changed From 0067968823c93f41fe7213f3c8d24d2c7e735ea4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Kie=C5=82kowicz?= Date: Fri, 26 Jul 2024 08:12:03 +0200 Subject: [PATCH 6/7] Update CHANGELOG.md --- CHANGELOG.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 20c79b23c4..8338287738 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,18 +13,18 @@ This component adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.h - Added support for OTEL_TRACES_EXPORTER, OTEL_METRICS_EXPORTER, OTEL_LOGS_EXPORTER to handle comma-separated list. - Support signal specific OTLP exporter variables (See [docs](/docs/config.md#otlp)): - - `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT` - - `OTEL_EXPORTER_OTLP_TRACES_HEADERS` - - `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT` - - `OTEL_EXPORTER_OTLP_TRACES_PROTOCOL` - - `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT` - - `OTEL_EXPORTER_OTLP_METRICS_HEADERS` - - `OTEL_EXPORTER_OTLP_METRICS_TIMEOUT` - - `OTEL_EXPORTER_OTLP_METRICS_PROTOCOL` - - `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT` - - `OTEL_EXPORTER_OTLP_LOGS_HEADERS` - - `OTEL_EXPORTER_OTLP_LOGS_TIMEOUT` - - `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL` + - `OTEL_EXPORTER_OTLP_TRACES_ENDPOINT`, + - `OTEL_EXPORTER_OTLP_TRACES_HEADERS`, + - `OTEL_EXPORTER_OTLP_TRACES_TIMEOUT`, + - `OTEL_EXPORTER_OTLP_TRACES_PROTOCOL`, + - `OTEL_EXPORTER_OTLP_METRICS_ENDPOINT`, + - `OTEL_EXPORTER_OTLP_METRICS_HEADERS`, + - `OTEL_EXPORTER_OTLP_METRICS_TIMEOUT`, + - `OTEL_EXPORTER_OTLP_METRICS_PROTOCOL`, + - `OTEL_EXPORTER_OTLP_LOGS_ENDPOINT`, + - `OTEL_EXPORTER_OTLP_LOGS_HEADERS`, + - `OTEL_EXPORTER_OTLP_LOGS_TIMEOUT`, + - `OTEL_EXPORTER_OTLP_LOGS_PROTOCOL`. ### Changed From 2c63183b8c3ac91f989153ea81120b460510ebb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Kie=C5=82kowicz?= Date: Mon, 29 Jul 2024 07:49:41 +0200 Subject: [PATCH 7/7] typo fix --- .../Configurations/Otlp/OtlpSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs index a4b1d3e7c4..366ad01c8d 100644 --- a/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs +++ b/src/OpenTelemetry.AutoInstrumentation/Configurations/Otlp/OtlpSettings.cs @@ -26,7 +26,7 @@ public OtlpSettings(OtlpSignalType signalType, Configuration configuration) } /// - /// Gets the the OTLP transport protocol. Supported values: Grpc and HttpProtobuf. + /// Gets the OTLP transport protocol. Supported values: Grpc and HttpProtobuf. /// public OtlpExportProtocol? Protocol { get; private set; }