Skip to content

[bug] OtlpExporterOptions is not picking up env variables #6558

@lyra95

Description

@lyra95

Package

OpenTelemetry.Exporter.OpenTelemetryProtocol

Package Version

Package Name Version
OpenTelemetry.Extensions.Hosting 1.13.0
OpenTelemetry 1.13.0
OpenTelemetry.Exporter.OpenTelemetryProtocal 1.13.0

Runtime Version

net9.0

Description

When environment variables are set after IConfiguration is built (during WebHost building), even though they are set before exporters are configured, OtlpExporterOptions does not pick them up.

Steps to Reproduce

You can run the code here: https://dotnetfiddle.net/aaHOPk

using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Logging;
using OpenTelemetry.Trace;
using OpenTelemetry.Exporter;
					
public class Program
{
	public static void Main(string[] args)
	{
		Console.WriteLine("------------------------------Not Working----------------------------");
		PrintEndpoint(NotWorking(args).Build());
		
		Console.WriteLine();
		Console.WriteLine("------------------------------Working----------------------------");
		PrintEndpoint(Working(args).Build());
	}
	
	private const string TestEndpoint = "https://example.com:4317";
	
	private static IHostBuilder NotWorking(string[] args)
	{
		return Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder => {})
			.ConfigureServices((context, services) => {
				
				// this happens after IConfiguration build, but before otlp export configuration
				Environment.SetEnvironmentVariable("OTEL_EXPORTER_OTLP_ENDPOINT", TestEndpoint);

				var otelBuilder = services.AddOpenTelemetry();
				otelBuilder.WithTracing(tracer => {
					tracer.AddOtlpExporter();
				});
			});
	}
	
	private static IHostBuilder Working(string[] args)
	{
		Environment.SetEnvironmentVariable("OTEL_EXPORTER_OTLP_ENDPOINT", TestEndpoint);
		
		return Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder => {})
			.ConfigureServices((context, services) => {
				var otelBuilder = services.AddOpenTelemetry();
				otelBuilder.WithTracing(tracer => {
					tracer.AddOtlpExporter();
				});
			});
	}
	
	private static void PrintEndpoint(IHost host){
		var option = host.Services.GetRequiredService<IOptions<OtlpExporterOptions>>();
		var optionFromFactory = host.Services.GetRequiredService<IOptionsFactory<OtlpExporterOptions>>().Create(null);
		
		Console.WriteLine($"expected: {TestEndpoint}, got: {option.Value.Endpoint}");
		Console.WriteLine($"expected: {TestEndpoint}, got: {optionFromFactory.Endpoint}");
	}
}

Expected Result

------------------------------Not Working----------------------------
expected: https://example.com:4317, got: https://example.com:4317/
expected: https://example.com:4317, got: https://example.com:4317/

------------------------------Working----------------------------
expected: https://example.com:4317, got: https://example.com:4317/
expected: https://example.com:4317, got: https://example.com:4317/

Actual Result

------------------------------Not Working----------------------------
expected: https://example.com:4317, got: http://localhost:4317/
expected: https://example.com:4317, got: http://localhost:4317/

------------------------------Working----------------------------
expected: https://example.com:4317, got: https://example.com:4317/
expected: https://example.com:4317, got: https://example.com:4317/

Additional Context

No response

Tip

React with 👍 to help prioritize this issue. Please use comments to provide useful context, avoiding +1 or me too, to help us triage it. Learn more here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds-triageNew issues which have not been classified or triaged by a community memberpkg:OpenTelemetry.Exporter.OpenTelemetryProtocolIssues related to OpenTelemetry.Exporter.OpenTelemetryProtocol NuGet package

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions