[Logs] Support dependency injection in ResourceBuilder and load envvars from IConfiguration (#3889)

* Fixed logging resource builder not being attached to IServiceProvider.

* CHANGELOG patch.

Co-authored-by: Alan West <3676547+alanwest@users.noreply.github.com>
This commit is contained in:
Mikel Blanchard 2022-11-11 11:49:44 -08:00 committed by GitHub
parent b5e50b2878
commit ddcff7de3c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 4 deletions

View File

@ -2,6 +2,11 @@
## Unreleased
* Added dependency injection support in the `ResourceBuilder` class and added
support for loading environment variables from `IConfiguration` for the
`AddEnvironmentVariableDetector` extension (Logs)
([#3889](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3889))
## 1.4.0-beta.3
Released 2022-Nov-07
@ -17,7 +22,7 @@ Released 2022-Nov-07
* Added dependency injection support in the `ResourceBuilder` class and added
support for loading environment variables from `IConfiguration` for the
`AddEnvironmentVariableDetector` extension
`AddEnvironmentVariableDetector` extension (Traces & Metrics)
([#3782](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3782),
[#3798](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3798))

View File

@ -20,6 +20,7 @@ using System;
using System.Collections;
using System.Text;
using System.Threading;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using OpenTelemetry.Internal;
@ -58,6 +59,13 @@ namespace OpenTelemetry.Logs
{
}
internal OpenTelemetryLoggerProvider(IServiceProvider serviceProvider)
: this(
serviceProvider: serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider)),
options: serviceProvider?.GetRequiredService<IOptionsMonitor<OpenTelemetryLoggerOptions>>().CurrentValue!)
{
}
internal OpenTelemetryLoggerProvider()
: this(new OpenTelemetryLoggerOptions())
{
@ -68,7 +76,7 @@ namespace OpenTelemetry.Logs
{
}
internal OpenTelemetryLoggerProvider(OpenTelemetryLoggerOptions options)
internal OpenTelemetryLoggerProvider(OpenTelemetryLoggerOptions options, IServiceProvider? serviceProvider = null)
{
OpenTelemetrySdkEventSource.Log.OpenTelemetryLoggerProviderEvent("Building OpenTelemetryLoggerProvider.");
@ -78,7 +86,9 @@ namespace OpenTelemetry.Logs
this.IncludeFormattedMessage = options.IncludeFormattedMessage;
this.ParseStateValues = options.ParseStateValues;
this.Resource = options.ResourceBuilder.Build();
var resourceBuilder = options.ResourceBuilder;
resourceBuilder.ServiceProvider = serviceProvider;
this.Resource = resourceBuilder.Build();
foreach (var processor in options.Processors)
{

View File

@ -57,7 +57,9 @@ namespace Microsoft.Extensions.Logging
builder.AddConfiguration();
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, OpenTelemetryLoggerProvider>());
builder.Services.TryAddEnumerable(
ServiceDescriptor.Singleton<ILoggerProvider, OpenTelemetryLoggerProvider>(
sp => new OpenTelemetryLoggerProvider(sp)));
// Note: This will bind logger options element (eg "Logging:OpenTelemetry") to OpenTelemetryLoggerOptions
LoggerProviderOptions.RegisterProviderOptions<OpenTelemetryLoggerOptions, OpenTelemetryLoggerProvider>(builder.Services);

View File

@ -15,6 +15,8 @@
// </copyright>
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using OpenTelemetry.Exporter;
using OpenTelemetry.Resources;
@ -38,6 +40,23 @@ namespace OpenTelemetry.Logs.Tests
Assert.NotNull(provider.Resource);
}
[Fact]
public void ResourceDetectionUsingIConfigurationTest()
{
var services = new ServiceCollection();
services.AddOptions();
services.AddSingleton<IConfiguration>(
new ConfigurationBuilder().AddInMemoryCollection(new Dictionary<string, string> { ["OTEL_SERVICE_NAME"] = "TestServiceName" }).Build());
using var serviceProvider = services.BuildServiceProvider();
using var loggerProvider = new OpenTelemetryLoggerProvider(serviceProvider);
Assert.Contains(loggerProvider.Resource.Attributes, kvp => kvp.Key == "service.name" && (string)kvp.Value == "TestServiceName");
}
[Fact]
public void ConfigureCtorTests()
{