[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:
parent
2f6e7e3a2b
commit
2f4cd5b454
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -78,6 +78,10 @@ namespace OpenTelemetry
|
|||
{
|
||||
return meterProviderSdk.ServiceProvider;
|
||||
}
|
||||
else if (baseProvider is LoggerProviderSdk loggerProviderSdk)
|
||||
{
|
||||
return loggerProviderSdk.ServiceProvider;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue