[logs-branch] Support loading OtlpLogExporter envvars from IConfiguration (#3812)

* Apply configuration pattern to OtlpLogExporter paths.

* CHANGELOG patch.
This commit is contained in:
Mikel Blanchard 2022-10-24 14:36:46 -07:00 committed by GitHub
parent aba8a6980d
commit 2f6e7e3a2b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 35 additions and 10 deletions

View File

@ -7,6 +7,10 @@
management
([#3707](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3707))
* `OtlpExporterOptions` can now be bound to `IConfiguation` when using the
`OtlpLogExporterHelperExtensions.AddOtlpExporter` extension
([#3812](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3812))
## Unreleased
## 1.4.0-beta.2

View File

@ -18,6 +18,7 @@ using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using OpenTelemetry.Exporter;
using OpenTelemetry.Exporter.OpenTelemetryProtocol.Implementation;
using OpenTelemetry.Internal;
namespace OpenTelemetry.Logs
@ -102,16 +103,27 @@ namespace OpenTelemetry.Logs
name ??= Options.DefaultName;
if (configure != null)
builder.ConfigureServices(services =>
{
builder.ConfigureServices(services => services.Configure(name, configure));
}
if (configure != null)
{
services.Configure(name, configure);
}
services.RegisterOptionsFactory(configuration => new SdkLimitOptions(configuration));
services.RegisterOptionsFactory(configuration => new OtlpExporterOptions(configuration));
});
builder.ConfigureBuilder((sp, builder) =>
{
var options = sp.GetRequiredService<IOptionsMonitor<OtlpExporterOptions>>().Get(name);
var exporterOptions = sp.GetRequiredService<IOptionsMonitor<OtlpExporterOptions>>().Get(name);
AddOtlpExporter(builder, options, sp);
// Note: Not using name here for SdkLimitOptions. There should
// only be one provider for a given service collection so
// SdkLimitOptions is treated as a single default instance.
var sdkLimitOptions = sp.GetRequiredService<IOptionsMonitor<SdkLimitOptions>>().CurrentValue;
AddOtlpExporter(builder, exporterOptions, sdkLimitOptions, sp);
});
return builder;
@ -120,10 +132,12 @@ namespace OpenTelemetry.Logs
private static void AddOtlpExporter(
LoggerProviderBuilder builder,
OtlpExporterOptions exporterOptions,
SdkLimitOptions sdkLimitOptions,
IServiceProvider serviceProvider)
{
exporterOptions.TryEnableIHttpClientFactoryIntegration(serviceProvider, "OtlpLogExporter");
var otlpExporter = new OtlpLogExporter(exporterOptions);
var otlpExporter = new OtlpLogExporter(exporterOptions, sdkLimitOptions);
if (exporterOptions.ExportProcessorType == ExportProcessorType.Simple)
{

View File

@ -80,9 +80,9 @@ namespace OpenTelemetry.Trace
// Note: Not using name here for SdkLimitOptions. There should
// only be one provider for a given service collection so
// SdkLimitOptions is treated as a single default instance.
var sdkOptionsManager = sp.GetRequiredService<IOptionsMonitor<SdkLimitOptions>>().CurrentValue;
var sdkLimitOptions = sp.GetRequiredService<IOptionsMonitor<SdkLimitOptions>>().CurrentValue;
AddOtlpExporter(builder, exporterOptions, sdkOptionsManager, sp);
AddOtlpExporter(builder, exporterOptions, sdkLimitOptions, sp);
});
}

View File

@ -27,6 +27,13 @@ namespace Microsoft.Extensions.DependencyInjection;
internal static class ProviderBuilderServiceCollectionExtensions
{
public static IServiceCollection AddOpenTelemetryLoggerProviderBuilderServices(this IServiceCollection services)
{
services.AddOpenTelemetryProviderBuilderServices();
return services;
}
public static IServiceCollection AddOpenTelemetryMeterProviderBuilderServices(this IServiceCollection services)
{
services.AddOpenTelemetryProviderBuilderServices();

View File

@ -53,7 +53,7 @@ internal sealed class LoggerProviderBuilderSdk : LoggerProviderBuilder, IDeferre
{
Debug.Assert(services != null, "services was null");
services.AddOptions();
services!.AddOpenTelemetryLoggerProviderBuilderServices();
services!.TryAddSingleton<LoggerProvider>(sp => new LoggerProviderSdk(sp, ownsServiceProvider: false));
this.services = services;
@ -66,7 +66,7 @@ internal sealed class LoggerProviderBuilderSdk : LoggerProviderBuilder, IDeferre
{
var services = new ServiceCollection();
services.AddOptions();
services.AddOpenTelemetryLoggerProviderBuilderServices();
this.services = services;
this.ownsServices = true;