diff --git a/src/OpenTelemetry.Api/Logs/LoggerProviderBuilder.cs b/src/OpenTelemetry.Api/Logs/LoggerProviderBuilder.cs index 5e525e73190..c8379f46fb1 100644 --- a/src/OpenTelemetry.Api/Logs/LoggerProviderBuilder.cs +++ b/src/OpenTelemetry.Api/Logs/LoggerProviderBuilder.cs @@ -21,7 +21,7 @@ namespace OpenTelemetry.Logs; /// /// LoggerProviderBuilder base class. /// -internal abstract class LoggerProviderBuilder +public abstract class LoggerProviderBuilder { /// /// Initializes a new instance of the class. diff --git a/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs b/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs index 78364924e03..a07436014fa 100644 --- a/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Logs/Builder/LoggerProviderBuilderExtensions.cs @@ -18,6 +18,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Logging; using OpenTelemetry.Internal; using OpenTelemetry.Resources; @@ -28,6 +29,24 @@ namespace OpenTelemetry.Logs; /// internal static class LoggerProviderBuilderExtensions { + /// + /// Registers a configuration action for the used by + /// integration (). + /// + /// . + /// Configuration action. + /// Returns for chaining. + public static LoggerProviderBuilder ConfigureLoggerOptions( + this LoggerProviderBuilder loggerProviderBuilder, + Action configure) + { + Guard.ThrowIfNull(configure); + + return loggerProviderBuilder.ConfigureServices( + services => services.Configure(configure)); + } + /// /// Sets the from which the Resource associated with /// this provider is built from. Overwrites currently set ResourceBuilder. diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs index f2a392e52e7..2d5a37c5815 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggerOptions.cs @@ -89,6 +89,7 @@ public class OpenTelemetryLoggerOptions /// /// Log processor to add. /// Returns for chaining. + // todo: [Obsolete("Use the OpenTelemetryLoggingBuilder returned by AddOpenTelemetry or call IServiceCollection.ConfigureOpenTelemetryLoggerProvider instead. AddProcessor will be removed in a future version.")] public OpenTelemetryLoggerOptions AddProcessor(BaseProcessor processor) { Guard.ThrowIfNull(processor); @@ -104,6 +105,7 @@ public OpenTelemetryLoggerOptions AddProcessor(BaseProcessor processo /// /// from which Resource will be built. /// Returns for chaining. + // todo: [Obsolete("Use the OpenTelemetryLoggingBuilder returned by AddOpenTelemetry or call IServiceCollection.ConfigureOpenTelemetryLoggerProvider instead. SetResourceBuilder will be removed in a future version.")] public OpenTelemetryLoggerOptions SetResourceBuilder(ResourceBuilder resourceBuilder) { Guard.ThrowIfNull(resourceBuilder); diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingBuilder.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingBuilder.cs new file mode 100644 index 00000000000..855e03676d6 --- /dev/null +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingBuilder.cs @@ -0,0 +1,63 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#nullable enable + +using System.Diagnostics; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace OpenTelemetry.Logs; + +/// +/// An implementation that exposes methods for configuring OpenTelemetry. +/// +public sealed class OpenTelemetryLoggingBuilder : LoggerProviderBuilder, ILoggerProviderBuilder, ILoggingBuilder +{ + private readonly LoggerProviderServiceCollectionBuilder innerBuiler; + + internal OpenTelemetryLoggingBuilder(IServiceCollection services) + { + Debug.Assert(services != null, "services was null"); + + services.AddOpenTelemetrySharedProviderBuilderServices(); + + this.innerBuiler = new LoggerProviderServiceCollectionBuilder(services!); + this.Services = services!; + } + + /// + public IServiceCollection Services { get; } + + /// + LoggerProvider? ILoggerProviderBuilder.Provider => null; + + /// + public override LoggerProviderBuilder AddInstrumentation(Func instrumentationFactory) + => this.innerBuiler.AddInstrumentation(instrumentationFactory); + + /// + LoggerProviderBuilder IDeferredLoggerProviderBuilder.Configure(Action configure) + { + return ((IDeferredLoggerProviderBuilder)this.innerBuiler).Configure(configure); + } + + /// + LoggerProviderBuilder ILoggerProviderBuilder.ConfigureServices(Action configure) + { + return this.innerBuiler.ConfigureServices(configure); + } +} diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs index 6f63fce672a..e7034fbc6ea 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs @@ -40,8 +40,8 @@ public static class OpenTelemetryLoggingExtensions /// will be created for a given . /// /// The to use. - /// The supplied for call chaining. - public static ILoggingBuilder AddOpenTelemetry( + /// . + public static OpenTelemetryLoggingBuilder AddOpenTelemetry( this ILoggingBuilder builder) { Guard.ThrowIfNull(builder); @@ -51,26 +51,6 @@ public static ILoggingBuilder AddOpenTelemetry( // Note: This will bind logger options element (eg "Logging:OpenTelemetry") to OpenTelemetryLoggerOptions LoggerProviderOptions.RegisterProviderOptions(builder.Services); - new LoggerProviderServiceCollectionBuilder(builder.Services).ConfigureBuilder( - (sp, logging) => - { - var options = sp.GetRequiredService>().CurrentValue; - - if (options.ResourceBuilder != null) - { - logging.SetResourceBuilder(options.ResourceBuilder); - - options.ResourceBuilder = null; - } - - foreach (var processor in options.Processors) - { - logging.AddProcessor(processor); - } - - options.Processors.Clear(); - }); - builder.Services.TryAddEnumerable( ServiceDescriptor.Singleton( sp => new OpenTelemetryLoggerProvider( @@ -78,7 +58,29 @@ public static ILoggingBuilder AddOpenTelemetry( sp.GetRequiredService>().CurrentValue, disposeProvider: false))); - return builder; + var otelBuilder = new OpenTelemetryLoggingBuilder(builder.Services); + + // Note: This is to support legacy AddProcessor & SetResourceBuilder APIs on OpenTelemetryLoggerOptions + otelBuilder.ConfigureBuilder((sp, logging) => + { + var options = sp.GetRequiredService>().CurrentValue; + + if (options.ResourceBuilder != null) + { + logging.SetResourceBuilder(options.ResourceBuilder); + + options.ResourceBuilder = null; + } + + foreach (var processor in options.Processors) + { + logging.AddProcessor(processor); + } + + options.Processors.Clear(); + }); + + return otelBuilder; } /// @@ -87,8 +89,8 @@ public static ILoggingBuilder AddOpenTelemetry( /// /// The to use. /// Optional configuration action. - /// The supplied for call chaining. - public static ILoggingBuilder AddOpenTelemetry( + /// . + public static OpenTelemetryLoggingBuilder AddOpenTelemetry( this ILoggingBuilder builder, Action? configure) {