[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:
parent
b5e50b2878
commit
ddcff7de3c
|
|
@ -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))
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue