Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions src/OpenTelemetry/BatchExportProcessorOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,47 @@ public class BatchExportProcessorOptions<T>
/// Gets or sets the maximum batch size of every export. It must be smaller or equal to <see cref="MaxQueueSize"/>. The default value is 512.
/// </summary>
public int MaxExportBatchSize { get; set; } = BatchExportProcessor<T>.DefaultMaxExportBatchSize;

internal static void ApplyValidatedConfiguration(
BatchExportProcessorOptions<T> 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;
}
Comment thread
martincostello marked this conversation as resolved.

options.MaxQueueSize = candidateMaxQueueSize;
options.MaxExportBatchSize = candidateMaxExportBatchSize;
options.ExporterTimeoutMilliseconds = candidateExporterTimeoutMilliseconds;
options.ScheduledDelayMilliseconds = candidateScheduledDelayMilliseconds;
}
}
4 changes: 4 additions & 0 deletions src/OpenTelemetry/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public void ExportLogRecordProcessorOptions_UsingIConfiguration()
{
var values = new Dictionary<string, string?>()
{
[BatchExportLogRecordProcessorOptions.MaxQueueSizeEnvVarKey] = "1",
[BatchExportLogRecordProcessorOptions.MaxQueueSizeEnvVarKey] = "3",
[BatchExportLogRecordProcessorOptions.MaxExportBatchSizeEnvVarKey] = "2",
[BatchExportLogRecordProcessorOptions.ExporterTimeoutEnvVarKey] = "3",
[BatchExportLogRecordProcessorOptions.ScheduledDelayEnvVarKey] = "4",
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
Expand All @@ -33,25 +22,29 @@ 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]
public void BatchExportProcessorOptions_UsingIConfiguration()
{
var values = new Dictionary<string, string?>()
{
[BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey] = "1",
[BatchExportActivityProcessorOptions.MaxQueueSizeEnvVarKey] = "3",
[BatchExportActivityProcessorOptions.MaxExportBatchSizeEnvVarKey] = "2",
[BatchExportActivityProcessorOptions.ExporterTimeoutEnvVarKey] = "3",
[BatchExportActivityProcessorOptions.ScheduledDelayEnvVarKey] = "4",
Expand All @@ -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);
Expand All @@ -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);
}
Comment thread
martincostello marked this conversation as resolved.
}

[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]
Expand All @@ -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);
}
}
Loading