diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index c920ba0e7fa..69a85cf9882 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -5,6 +5,11 @@ * Added `LoggerProvider` API from the OpenTelemetry specification ([#3707](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3707)) +* Added dependency injection support in the `ResourceBuilder` class and added + support for loading environment variables from `IConfiguration` for the + `AddEnvironmentVariableDetector` extension when using `LoggerProvider` + ([#3813](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3813)) + ## Unreleased * Added support for loading environment variables from `IConfiguration` when diff --git a/src/OpenTelemetry/Logs/LoggerProviderSdk.cs b/src/OpenTelemetry/Logs/LoggerProviderSdk.cs index c02a9731ca6..ac321bfad13 100644 --- a/src/OpenTelemetry/Logs/LoggerProviderSdk.cs +++ b/src/OpenTelemetry/Logs/LoggerProviderSdk.cs @@ -21,7 +21,6 @@ using System.Diagnostics; using System.Text; using System.Threading; -using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; using OpenTelemetry.Resources; @@ -37,7 +36,8 @@ namespace OpenTelemetry.Logs; /// internal sealed class LoggerProviderSdk : LoggerProvider { - private readonly ServiceProvider? ownedServiceProvider; + internal readonly IServiceProvider ServiceProvider; + private readonly IDisposable? ownedServiceProvider; private readonly List instrumentations = new(); private ILogRecordPool? threadStaticPool = LogRecordThreadStaticPool.Instance; private int shutdownCount; @@ -47,22 +47,30 @@ public LoggerProviderSdk( IServiceProvider serviceProvider, bool ownsServiceProvider) { + Debug.Assert(serviceProvider != null, "serviceProvider was null"); + OpenTelemetrySdkEventSource.Log.LoggerProviderSdkEvent("Building LoggerProviderSdk."); + this.ServiceProvider = serviceProvider!; + if (ownsServiceProvider) { - this.ownedServiceProvider = serviceProvider as ServiceProvider; + this.ownedServiceProvider = serviceProvider as IDisposable; Debug.Assert(this.ownedServiceProvider != null, "ownedServiceProvider was null"); } - var state = new LoggerProviderBuilderState(serviceProvider); + var state = new LoggerProviderBuilderState(serviceProvider!); state.RegisterProvider(nameof(LoggerProvider), this); CallbackHelper.InvokeRegisteredConfigureStateCallbacks( - serviceProvider, + serviceProvider!, state); + var resourceBuilder = state.ResourceBuilder ?? ResourceBuilder.CreateDefault(); + resourceBuilder.ServiceProvider = serviceProvider; + this.Resource = resourceBuilder.Build(); + foreach (var processor in state.Processors) { this.AddProcessor(processor); @@ -73,8 +81,6 @@ public LoggerProviderSdk( this.instrumentations.Add(instrumentation.Instance); } - this.Resource = (state.ResourceBuilder ?? ResourceBuilder.CreateDefault()).Build(); - OpenTelemetrySdkEventSource.Log.LoggerProviderSdkEvent("LoggerProviderSdk built successfully."); } diff --git a/src/OpenTelemetry/ProviderExtensions.cs b/src/OpenTelemetry/ProviderExtensions.cs index c967965ff37..5a2e0db9503 100644 --- a/src/OpenTelemetry/ProviderExtensions.cs +++ b/src/OpenTelemetry/ProviderExtensions.cs @@ -78,6 +78,10 @@ public static Resource GetDefaultResource(this BaseProvider baseProvider) { return meterProviderSdk.ServiceProvider; } + else if (baseProvider is LoggerProviderSdk loggerProviderSdk) + { + return loggerProviderSdk.ServiceProvider; + } return null; } diff --git a/test/OpenTelemetry.Tests/Logs/OpenTelemetryLoggingExtensionsTests.cs b/test/OpenTelemetry.Tests/Logs/OpenTelemetryLoggingExtensionsTests.cs index 1f98fb6ae77..960661ddf3b 100644 --- a/test/OpenTelemetry.Tests/Logs/OpenTelemetryLoggingExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Logs/OpenTelemetryLoggingExtensionsTests.cs @@ -415,6 +415,8 @@ public void LoggingBuilderAddOpenTelemetryResourceTest() { var services = new ServiceCollection(); + bool serviceProviderTestExecuted = false; + services.AddLogging(builder => { builder.AddOpenTelemetry().SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("Examples.LoggingExtensions")); @@ -427,7 +429,15 @@ public void LoggingBuilderAddOpenTelemetryResourceTest() services.ConfigureOpenTelemetryLogging(options => { - options.ConfigureResource(builder => builder.AddAttributes(new Dictionary { ["key2"] = "value2" })); + options.ConfigureResource(builder => + { + builder.AddDetector(sp => + { + serviceProviderTestExecuted = true; + Assert.NotNull(sp); + return new ResourceBuilder.WrapperResourceDetector(new Resource(new Dictionary() { ["key2"] = "value2" })); + }); + }); }); using var serviceProvider = services.BuildServiceProvider(); @@ -437,6 +447,7 @@ public void LoggingBuilderAddOpenTelemetryResourceTest() var provider = serviceProvider.GetRequiredService() as LoggerProviderSdk; Assert.NotNull(provider); + Assert.True(serviceProviderTestExecuted); var resource = provider!.Resource;