diff --git a/src/OpenTelemetry/BatchExportProcessorOptions.cs b/src/OpenTelemetry/BatchExportProcessorOptions.cs index 6695c0c6a56..04072ccec88 100644 --- a/src/OpenTelemetry/BatchExportProcessorOptions.cs +++ b/src/OpenTelemetry/BatchExportProcessorOptions.cs @@ -29,4 +29,47 @@ public class BatchExportProcessorOptions /// Gets or sets the maximum batch size of every export. It must be smaller or equal to . The default value is 512. /// public int MaxExportBatchSize { get; set; } = BatchExportProcessor.DefaultMaxExportBatchSize; + + internal static void ApplyValidatedConfiguration( + BatchExportProcessorOptions options, + int maxQueueSize, + int maxExportBatchSize, + int exporterTimeoutMilliseconds, + int scheduledDelayMilliseconds) + { + var candidateMaxQueueSize = options.MaxQueueSize; + var candidateMaxExportBatchSize = options.MaxExportBatchSize; + var candidateExporterTimeoutMilliseconds = options.ExporterTimeoutMilliseconds; + var candidateScheduledDelayMilliseconds = options.ScheduledDelayMilliseconds; + + if (maxQueueSize > 0) + { + candidateMaxQueueSize = maxQueueSize; + } + + if (maxExportBatchSize > 0) + { + candidateMaxExportBatchSize = maxExportBatchSize; + } + + if (candidateMaxExportBatchSize > candidateMaxQueueSize) + { + candidateMaxExportBatchSize = candidateMaxQueueSize; + } + + if (exporterTimeoutMilliseconds >= 0) + { + candidateExporterTimeoutMilliseconds = exporterTimeoutMilliseconds; + } + + if (scheduledDelayMilliseconds > 0) + { + candidateScheduledDelayMilliseconds = scheduledDelayMilliseconds; + } + + options.MaxQueueSize = candidateMaxQueueSize; + options.MaxExportBatchSize = candidateMaxExportBatchSize; + options.ExporterTimeoutMilliseconds = candidateExporterTimeoutMilliseconds; + options.ScheduledDelayMilliseconds = candidateScheduledDelayMilliseconds; + } } diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 2ec9532981f..b8058ae24b8 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -6,6 +6,10 @@ Notes](../../RELEASENOTES.md). ## Unreleased +* Fix incorrect validation of `OTEL_BSP_*` and `OTEL_BLRP_*` environment + variables. + ([#7187](https://github.com/open-telemetry/opentelemetry-dotnet/pull/7187)) + ## 1.15.3 Released 2026-Apr-21 diff --git a/src/OpenTelemetry/Logs/Processor/BatchExportLogRecordProcessorOptions.cs b/src/OpenTelemetry/Logs/Processor/BatchExportLogRecordProcessorOptions.cs index 405b3d554a3..2ad4019e4c6 100644 --- a/src/OpenTelemetry/Logs/Processor/BatchExportLogRecordProcessorOptions.cs +++ b/src/OpenTelemetry/Logs/Processor/BatchExportLogRecordProcessorOptions.cs @@ -32,24 +32,36 @@ public BatchExportLogRecordProcessorOptions() internal BatchExportLogRecordProcessorOptions(IConfiguration configuration) { + var maxQueueSize = this.MaxQueueSize; + var maxExportBatchSize = this.MaxExportBatchSize; + var exporterTimeoutMilliseconds = this.ExporterTimeoutMilliseconds; + var scheduledDelayMilliseconds = this.ScheduledDelayMilliseconds; + if (configuration.TryGetIntValue(OpenTelemetrySdkEventSource.Log, ExporterTimeoutEnvVarKey, out var value)) { - this.ExporterTimeoutMilliseconds = value; + exporterTimeoutMilliseconds = value; } if (configuration.TryGetIntValue(OpenTelemetrySdkEventSource.Log, MaxExportBatchSizeEnvVarKey, out value)) { - this.MaxExportBatchSize = value; + maxExportBatchSize = value; } if (configuration.TryGetIntValue(OpenTelemetrySdkEventSource.Log, MaxQueueSizeEnvVarKey, out value)) { - this.MaxQueueSize = value; + maxQueueSize = value; } if (configuration.TryGetIntValue(OpenTelemetrySdkEventSource.Log, ScheduledDelayEnvVarKey, out value)) { - this.ScheduledDelayMilliseconds = value; + scheduledDelayMilliseconds = value; } + + ApplyValidatedConfiguration( + this, + maxQueueSize, + maxExportBatchSize, + exporterTimeoutMilliseconds, + scheduledDelayMilliseconds); } } diff --git a/src/OpenTelemetry/Trace/Processor/BatchExportActivityProcessorOptions.cs b/src/OpenTelemetry/Trace/Processor/BatchExportActivityProcessorOptions.cs index 0375cc1fe51..928c2ec6de1 100644 --- a/src/OpenTelemetry/Trace/Processor/BatchExportActivityProcessorOptions.cs +++ b/src/OpenTelemetry/Trace/Processor/BatchExportActivityProcessorOptions.cs @@ -32,24 +32,36 @@ public BatchExportActivityProcessorOptions() internal BatchExportActivityProcessorOptions(IConfiguration configuration) { + var maxQueueSize = this.MaxQueueSize; + var maxExportBatchSize = this.MaxExportBatchSize; + var exporterTimeoutMilliseconds = this.ExporterTimeoutMilliseconds; + var scheduledDelayMilliseconds = this.ScheduledDelayMilliseconds; + if (configuration.TryGetIntValue(OpenTelemetrySdkEventSource.Log, ExporterTimeoutEnvVarKey, out var value)) { - this.ExporterTimeoutMilliseconds = value; + exporterTimeoutMilliseconds = value; } if (configuration.TryGetIntValue(OpenTelemetrySdkEventSource.Log, MaxExportBatchSizeEnvVarKey, out value)) { - this.MaxExportBatchSize = value; + maxExportBatchSize = value; } if (configuration.TryGetIntValue(OpenTelemetrySdkEventSource.Log, MaxQueueSizeEnvVarKey, out value)) { - this.MaxQueueSize = value; + maxQueueSize = value; } if (configuration.TryGetIntValue(OpenTelemetrySdkEventSource.Log, ScheduledDelayEnvVarKey, out value)) { - this.ScheduledDelayMilliseconds = value; + scheduledDelayMilliseconds = value; } + + ApplyValidatedConfiguration( + this, + maxQueueSize, + maxExportBatchSize, + exporterTimeoutMilliseconds, + scheduledDelayMilliseconds); } } diff --git a/test/OpenTelemetry.Tests/Logs/BatchExportLogRecordProcessorOptionsTests.cs b/test/OpenTelemetry.Tests/Logs/BatchExportLogRecordProcessorOptionsTests.cs index f9cd6d840c3..a65b72ca07d 100644 --- a/test/OpenTelemetry.Tests/Logs/BatchExportLogRecordProcessorOptionsTests.cs +++ b/test/OpenTelemetry.Tests/Logs/BatchExportLogRecordProcessorOptionsTests.cs @@ -51,7 +51,7 @@ public void ExportLogRecordProcessorOptions_UsingIConfiguration() { var values = new Dictionary() { - [BatchExportLogRecordProcessorOptions.MaxQueueSizeEnvVarKey] = "1", + [BatchExportLogRecordProcessorOptions.MaxQueueSizeEnvVarKey] = "3", [BatchExportLogRecordProcessorOptions.MaxExportBatchSizeEnvVarKey] = "2", [BatchExportLogRecordProcessorOptions.ExporterTimeoutEnvVarKey] = "3", [BatchExportLogRecordProcessorOptions.ScheduledDelayEnvVarKey] = "4", @@ -63,7 +63,7 @@ public void ExportLogRecordProcessorOptions_UsingIConfiguration() var options = new BatchExportLogRecordProcessorOptions(configuration); - Assert.Equal(1, options.MaxQueueSize); + Assert.Equal(3, options.MaxQueueSize); Assert.Equal(2, options.MaxExportBatchSize); Assert.Equal(3, options.ExporterTimeoutMilliseconds); Assert.Equal(4, options.ScheduledDelayMilliseconds); diff --git a/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorOptionsTests.cs b/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorOptionsTests.cs index 6dd6bde7ff9..185984c3bb1 100644 --- a/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorOptionsTests.cs +++ b/test/OpenTelemetry.Tests/Trace/BatchExportActivityProcessorOptionsTests.cs @@ -6,19 +6,8 @@ namespace OpenTelemetry.Trace.Tests; -public sealed class BatchExportActivityProcessorOptionsTests : IDisposable +public sealed class BatchExportActivityProcessorOptionsTests { - public BatchExportActivityProcessorOptionsTests() - { - ClearEnvVars(); - } - - public void Dispose() - { - ClearEnvVars(); - GC.SuppressFinalize(this); - } - [Fact] public void BatchExportProcessorOptions_Defaults() { @@ -33,17 +22,21 @@ public void BatchExportProcessorOptions_Defaults() [Fact] public void BatchExportProcessorOptions_EnvironmentVariableOverride() { - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.ExporterTimeoutEnvVarKey, "1"); - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.MaxExportBatchSizeEnvVarKey, "2"); - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey, "3"); - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.ScheduledDelayEnvVarKey, "4"); - - var options = new BatchExportActivityProcessorOptions(); + using (EnvironmentVariableScope.Create( + [ + (BatchExportActivityProcessorOptions.ExporterTimeoutEnvVarKey, "1"), + (BatchExportActivityProcessorOptions.MaxExportBatchSizeEnvVarKey, "2"), + (BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey, "3"), + (BatchExportActivityProcessorOptions.ScheduledDelayEnvVarKey, "4"), + ])) + { + var options = new BatchExportActivityProcessorOptions(); - Assert.Equal(1, options.ExporterTimeoutMilliseconds); - Assert.Equal(2, options.MaxExportBatchSize); - Assert.Equal(3, options.MaxQueueSize); - Assert.Equal(4, options.ScheduledDelayMilliseconds); + Assert.Equal(1, options.ExporterTimeoutMilliseconds); + Assert.Equal(2, options.MaxExportBatchSize); + Assert.Equal(3, options.MaxQueueSize); + Assert.Equal(4, options.ScheduledDelayMilliseconds); + } } [Fact] @@ -51,7 +44,7 @@ public void BatchExportProcessorOptions_UsingIConfiguration() { var values = new Dictionary() { - [BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey] = "1", + [BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey] = "3", [BatchExportActivityProcessorOptions.MaxExportBatchSizeEnvVarKey] = "2", [BatchExportActivityProcessorOptions.ExporterTimeoutEnvVarKey] = "3", [BatchExportActivityProcessorOptions.ScheduledDelayEnvVarKey] = "4", @@ -63,7 +56,7 @@ public void BatchExportProcessorOptions_UsingIConfiguration() var options = new BatchExportActivityProcessorOptions(configuration); - Assert.Equal(1, options.MaxQueueSize); + Assert.Equal(3, options.MaxQueueSize); Assert.Equal(2, options.MaxExportBatchSize); Assert.Equal(3, options.ExporterTimeoutMilliseconds); Assert.Equal(4, options.ScheduledDelayMilliseconds); @@ -72,30 +65,58 @@ public void BatchExportProcessorOptions_UsingIConfiguration() [Fact] public void BatchExportProcessorOptions_InvalidEnvironmentVariableOverride() { - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.ExporterTimeoutEnvVarKey, "invalid"); - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.MaxExportBatchSizeEnvVarKey, "invalid"); - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey, "invalid"); - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.ScheduledDelayEnvVarKey, "invalid"); + using (EnvironmentVariableScope.Create( + [ + (BatchExportActivityProcessorOptions.ExporterTimeoutEnvVarKey, "invalid"), + (BatchExportActivityProcessorOptions.MaxExportBatchSizeEnvVarKey, "invalid"), + (BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey, "invalid"), + (BatchExportActivityProcessorOptions.ScheduledDelayEnvVarKey, "invalid"), + ])) + { + var options = new BatchExportActivityProcessorOptions(); - var options = new BatchExportActivityProcessorOptions(); + Assert.Equal(30000, options.ExporterTimeoutMilliseconds); + Assert.Equal(512, options.MaxExportBatchSize); + Assert.Equal(2048, options.MaxQueueSize); + Assert.Equal(5000, options.ScheduledDelayMilliseconds); + } + } - Assert.Equal(30000, options.ExporterTimeoutMilliseconds); - Assert.Equal(512, options.MaxExportBatchSize); - Assert.Equal(2048, options.MaxQueueSize); - Assert.Equal(5000, options.ScheduledDelayMilliseconds); + [Fact] + public void BatchExportProcessorOptions_InvalidNumericEnvironmentVariableOverrideFallsBackToDefaults() + { + using (EnvironmentVariableScope.Create(BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey, "0")) + { + var options = new BatchExportActivityProcessorOptions(); + + Assert.Equal(2048, options.MaxQueueSize); + } } [Fact] - public void BatchExportProcessorOptions_SetterOverridesEnvironmentVariable() + public void BatchExportProcessorOptions_MaxQueueSizeLowerThanEffectiveMaxExportBatchSizeClampsBatchSize() { - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.ExporterTimeoutEnvVarKey, "123"); + using (EnvironmentVariableScope.Create(BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey, "10")) + { + var options = new BatchExportActivityProcessorOptions(); - var options = new BatchExportActivityProcessorOptions + Assert.Equal(10, options.MaxQueueSize); + Assert.Equal(10, options.MaxExportBatchSize); + } + } + + [Fact] + public void BatchExportProcessorOptions_SetterOverridesEnvironmentVariable() + { + using (EnvironmentVariableScope.Create(BatchExportActivityProcessorOptions.ExporterTimeoutEnvVarKey, "123")) { - ExporterTimeoutMilliseconds = 89000, - }; + var options = new BatchExportActivityProcessorOptions + { + ExporterTimeoutMilliseconds = 89000, + }; - Assert.Equal(89000, options.ExporterTimeoutMilliseconds); + Assert.Equal(89000, options.ExporterTimeoutMilliseconds); + } } [Fact] @@ -106,12 +127,4 @@ public void BatchExportProcessorOptions_EnvironmentVariableNames() Assert.Equal("OTEL_BSP_MAX_QUEUE_SIZE", BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey); Assert.Equal("OTEL_BSP_SCHEDULE_DELAY", BatchExportActivityProcessorOptions.ScheduledDelayEnvVarKey); } - - private static void ClearEnvVars() - { - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.ExporterTimeoutEnvVarKey, null); - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.MaxExportBatchSizeEnvVarKey, null); - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey, null); - Environment.SetEnvironmentVariable(BatchExportActivityProcessorOptions.ScheduledDelayEnvVarKey, null); - } }