[logs-branch] Apply Resource dependency injection pattern to LoggerProvider (#3813)

* Apply resource dependency injection changes to LoggerProvider.

* CHANGELOG update.

* Test update.

* CHANGELOG patch.
This commit is contained in:
Mikel Blanchard 2022-10-24 15:09:10 -07:00 committed by GitHub
parent 2f6e7e3a2b
commit 2f4cd5b454
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 8 deletions

View File

@ -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

View File

@ -21,7 +21,6 @@ using System.Collections.Generic;
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;
/// </summary>
internal sealed class LoggerProviderSdk : LoggerProvider
{
private readonly ServiceProvider? ownedServiceProvider;
internal readonly IServiceProvider ServiceProvider;
private readonly IDisposable? ownedServiceProvider;
private readonly List<object> instrumentations = new();
private ILogRecordPool? threadStaticPool = LogRecordThreadStaticPool.Instance;
private int shutdownCount;
@ -47,22 +47,30 @@ internal sealed class LoggerProviderSdk : LoggerProvider
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 @@ internal sealed class LoggerProviderSdk : LoggerProvider
this.instrumentations.Add(instrumentation.Instance);
}
this.Resource = (state.ResourceBuilder ?? ResourceBuilder.CreateDefault()).Build();
OpenTelemetrySdkEventSource.Log.LoggerProviderSdkEvent("LoggerProviderSdk built successfully.");
}

View File

@ -78,6 +78,10 @@ namespace OpenTelemetry
{
return meterProviderSdk.ServiceProvider;
}
else if (baseProvider is LoggerProviderSdk loggerProviderSdk)
{
return loggerProviderSdk.ServiceProvider;
}
return null;
}

View File

@ -415,6 +415,8 @@ public sealed class OpenTelemetryLoggingExtensionsTests
{
var services = new ServiceCollection();
bool serviceProviderTestExecuted = false;
services.AddLogging(builder =>
{
builder.AddOpenTelemetry().SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("Examples.LoggingExtensions"));
@ -427,7 +429,15 @@ public sealed class OpenTelemetryLoggingExtensionsTests
services.ConfigureOpenTelemetryLogging(options =>
{
options.ConfigureResource(builder => builder.AddAttributes(new Dictionary<string, object> { ["key2"] = "value2" }));
options.ConfigureResource(builder =>
{
builder.AddDetector(sp =>
{
serviceProviderTestExecuted = true;
Assert.NotNull(sp);
return new ResourceBuilder.WrapperResourceDetector(new Resource(new Dictionary<string, object>() { ["key2"] = "value2" }));
});
});
});
using var serviceProvider = services.BuildServiceProvider();
@ -437,6 +447,7 @@ public sealed class OpenTelemetryLoggingExtensionsTests
var provider = serviceProvider.GetRequiredService<LoggerProvider>() as LoggerProviderSdk;
Assert.NotNull(provider);
Assert.True(serviceProviderTestExecuted);
var resource = provider!.Resource;