diff --git a/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Core/ObservabilityExtensions.cs b/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Core/ObservabilityExtensions.cs index 87e89eded..7c18ea310 100644 --- a/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Core/ObservabilityExtensions.cs +++ b/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Core/ObservabilityExtensions.cs @@ -67,7 +67,12 @@ internal static void AddLaunchDarklyObservabilityWithConfig(this IServiceCollect options.WithCommonLaunchDarklyLoggingExport(config); }); config.ExtendedLoggerConfiguration?.Invoke(logging); - }).WithMetrics(metrics => + }, options => + { + options.IncludeFormattedMessage = true; + config.ExtendedLoggerOptionsConfiguration?.Invoke(options); + }) + .WithMetrics(metrics => { metrics .WithCommonLaunchDarklyConfig(config, resourceBuilder) diff --git a/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Core/ObservabilityPlugin.cs b/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Core/ObservabilityPlugin.cs index 9bead039e..9c473cd9e 100644 --- a/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Core/ObservabilityPlugin.cs +++ b/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Core/ObservabilityPlugin.cs @@ -101,6 +101,13 @@ internal ObservabilityPluginBuilder(IServiceCollection services) : base() "Service collection cannot be null when creating an ObservabilityPlugin builder."); } + public ObservabilityPluginBuilder WithExtendedLoggerConfiguration(Action extendedLoggerConfiguration, Action configureLoggerOptions) + { + WithExtendedLoggerConfiguration(extendedLoggerConfiguration); + ConfigureLoggerOptions = configureLoggerOptions; + return this; + } + /// /// Build an instance with the configured settings. /// diff --git a/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Legacy/OpenTelemetryConfig.cs b/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Legacy/OpenTelemetryConfig.cs index c98b3cef4..e62b0a491 100644 --- a/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Legacy/OpenTelemetryConfig.cs +++ b/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/Asp/Legacy/OpenTelemetryConfig.cs @@ -34,7 +34,6 @@ public static void AddLaunchDarklyLogging(this ILoggingBuilder loggingBuilder, O options.SetResourceBuilder(CommonOtelOptions.GetResourceBuilder(config)) .AddProcessor(new SamplingLogProcessor(CommonOtelOptions.GetSampler(config))) .AddOtlpExporter(exportOptions => { exportOptions.WithCommonLaunchDarklyLoggingExport(config); }); - config.ExtendedLoggerConfiguration?.Invoke(options); }); } diff --git a/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/BaseBuilder.cs b/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/BaseBuilder.cs index 42ecd3be0..2925a3fe0 100644 --- a/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/BaseBuilder.cs +++ b/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/BaseBuilder.cs @@ -31,6 +31,9 @@ public class BaseBuilder where TBuilder : BaseBuilder private Action _extendedTracerConfiguration; private Action _extendedLoggerConfiguration; private Action _extendedMeterConfiguration; +#if !NETFRAMEWORK + protected Action ConfigureLoggerOptions; +#endif protected BaseBuilder() { @@ -265,7 +268,11 @@ internal ObservabilityConfig BuildConfig(string sdkKey) sdkKey, _extendedTracerConfiguration, _extendedLoggerConfiguration, - _extendedMeterConfiguration); + _extendedMeterConfiguration +#if !NETFRAMEWORK + , ConfigureLoggerOptions +#endif + ); } } } diff --git a/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/ObservabilityConfig.cs b/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/ObservabilityConfig.cs index 16faee42a..4209eb0db 100644 --- a/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/ObservabilityConfig.cs +++ b/sdk/@launchdarkly/observability-dotnet/src/LaunchDarkly.Observability/ObservabilityConfig.cs @@ -7,6 +7,7 @@ namespace LaunchDarkly.Observability { #if NETFRAMEWORK using LoggerBuilderType = OpenTelemetryLoggerOptions; + #else using LoggerBuilderType = LoggerProviderBuilder; #endif @@ -60,6 +61,13 @@ public class ObservabilityConfig /// public Action ExtendedLoggerConfiguration { get; } +#if !NETFRAMEWORK + /// + /// Function which extends the options of the logger provider. + /// + public Action ExtendedLoggerOptionsConfiguration { get; } +#endif + /// /// Function which extends the configuration of the meter provider. /// @@ -75,6 +83,9 @@ internal ObservabilityConfig( Action extendedTracerConfiguration, Action extendedLoggerConfiguration, Action extendedMeterConfiguration +#if !NETFRAMEWORK + , Action extendedLoggerOptionConfiguration +#endif ) { OtlpEndpoint = otlpEndpoint; @@ -86,6 +97,9 @@ Action extendedMeterConfiguration ExtendedTracerConfiguration = extendedTracerConfiguration; ExtendedLoggerConfiguration = extendedLoggerConfiguration; ExtendedMeterConfiguration = extendedMeterConfiguration; +#if !NETFRAMEWORK + ExtendedLoggerOptionsConfiguration = extendedLoggerOptionConfiguration; +#endif } /// diff --git a/sdk/@launchdarkly/observability-dotnet/test/LaunchDarkly.Observability.Tests/ObservabilityPluginBuilderTests.cs b/sdk/@launchdarkly/observability-dotnet/test/LaunchDarkly.Observability.Tests/ObservabilityPluginBuilderTests.cs index 3195b9b15..3831fabfa 100644 --- a/sdk/@launchdarkly/observability-dotnet/test/LaunchDarkly.Observability.Tests/ObservabilityPluginBuilderTests.cs +++ b/sdk/@launchdarkly/observability-dotnet/test/LaunchDarkly.Observability.Tests/ObservabilityPluginBuilderTests.cs @@ -1,6 +1,9 @@ using NUnit.Framework; using System; using Microsoft.Extensions.DependencyInjection; +#if !NETFRAMEWORK +using OpenTelemetry.Logs; +#endif namespace LaunchDarkly.Observability.Test { @@ -115,5 +118,75 @@ public void Build_PrefersExplicitServiceName_OverEnvironmentVariable() Environment.SetEnvironmentVariable(EnvironmentVariables.OtelServiceName, originalValue); } } + +#if !NETFRAMEWORK + [Test] + public void WithExtendedLoggerConfiguration_WithBothParameters_SetsConfigurationCorrectly() + { + Action loggerConfig = _ => { }; + Action loggerOptions = _ => { }; + + var pluginBuilder = ObservabilityPlugin.Builder(_services) + .WithExtendedLoggerConfiguration(loggerConfig, loggerOptions); + + var plugin = pluginBuilder.Build(); + + Assert.That(plugin, Is.Not.Null); + Assert.That(plugin, Is.InstanceOf()); + } + + [Test] + public void WithExtendedLoggerConfiguration_WithNullLoggerConfiguration_AcceptsNullValue() + { + Action loggerOptions = _ => { }; + + var pluginBuilder = ObservabilityPlugin.Builder(_services) + .WithExtendedLoggerConfiguration(null, loggerOptions); + + var plugin = pluginBuilder.Build(); + + Assert.That(plugin, Is.Not.Null); + Assert.That(plugin, Is.InstanceOf()); + } + + [Test] + public void WithExtendedLoggerConfiguration_WithNullLoggerOptions_AcceptsNullValue() + { + Action loggerConfig = _ => { }; + + var pluginBuilder = ObservabilityPlugin.Builder(_services) + .WithExtendedLoggerConfiguration(loggerConfig, null); + + var plugin = pluginBuilder.Build(); + + Assert.That(plugin, Is.Not.Null); + Assert.That(plugin, Is.InstanceOf()); + } + + [Test] + public void WithExtendedLoggerConfiguration_WithBothParametersNull_AcceptsNullValues() + { + var pluginBuilder = ObservabilityPlugin.Builder(_services) + .WithExtendedLoggerConfiguration(null, null); + + var plugin = pluginBuilder.Build(); + + Assert.That(plugin, Is.Not.Null); + Assert.That(plugin, Is.InstanceOf()); + } + + [Test] + public void WithExtendedLoggerConfiguration_ReturnsBuilderInstance() + { + Action loggerConfig = _ => { }; + Action loggerOptions = _ => { }; + + var result = ObservabilityPlugin.Builder(_services) + .WithExtendedLoggerConfiguration(loggerConfig, loggerOptions); + + Assert.That(result, Is.Not.Null); + Assert.That(result, Is.InstanceOf()); + } +#endif } }