Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
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
5 changes: 5 additions & 0 deletions src/OpenTelemetry/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
20 changes: 13 additions & 7 deletions src/OpenTelemetry/Logs/LoggerProviderSdk.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
using System.Diagnostics;
using System.Text;
using System.Threading;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Internal;
using OpenTelemetry.Resources;

Expand All @@ -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;
Expand All @@ -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);
Expand All @@ -73,8 +81,6 @@ public LoggerProviderSdk(
this.instrumentations.Add(instrumentation.Instance);
}

this.Resource = (state.ResourceBuilder ?? ResourceBuilder.CreateDefault()).Build();

OpenTelemetrySdkEventSource.Log.LoggerProviderSdkEvent("LoggerProviderSdk built successfully.");
}

Expand Down
4 changes: 4 additions & 0 deletions src/OpenTelemetry/ProviderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
Expand All @@ -427,7 +429,15 @@ public void LoggingBuilderAddOpenTelemetryResourceTest()

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();
Expand All @@ -437,6 +447,7 @@ public void LoggingBuilderAddOpenTelemetryResourceTest()
var provider = serviceProvider.GetRequiredService<LoggerProvider>() as LoggerProviderSdk;

Assert.NotNull(provider);
Assert.True(serviceProviderTestExecuted);

var resource = provider!.Resource;

Expand Down