From 0d84db18b1c8775227196f9861fafd407669a3b3 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 7 Feb 2024 10:42:15 -0800 Subject: [PATCH 1/7] Add OpenTelemetrySdk. --- .../Experimental/PublicAPI.Unshipped.txt | 1 + .../.publicApi/Stable/PublicAPI.Unshipped.txt | 8 + src/OpenTelemetry/OpenTelemetrySdk.cs | 145 ++++++++++++++++++ .../OpenTelemetrySdkExtensions.cs | 36 +++++ 4 files changed, 190 insertions(+) create mode 100644 src/OpenTelemetry/OpenTelemetrySdk.cs create mode 100644 src/OpenTelemetry/OpenTelemetrySdkExtensions.cs diff --git a/src/OpenTelemetry/.publicApi/Experimental/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/Experimental/PublicAPI.Unshipped.txt index 16832495101..71775d58fee 100644 --- a/src/OpenTelemetry/.publicApi/Experimental/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/Experimental/PublicAPI.Unshipped.txt @@ -22,6 +22,7 @@ OpenTelemetry.Metrics.MetricStreamConfiguration.CardinalityLimit.get -> int? OpenTelemetry.Metrics.MetricStreamConfiguration.CardinalityLimit.set -> void OpenTelemetry.Metrics.TraceBasedExemplarFilter OpenTelemetry.Metrics.TraceBasedExemplarFilter.TraceBasedExemplarFilter() -> void +OpenTelemetry.OpenTelemetrySdk.LoggerProvider.get -> OpenTelemetry.Logs.LoggerProvider! static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Logs.LoggerProviderBuilder! static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Func!>! implementationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder! static OpenTelemetry.Logs.LoggerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder) -> OpenTelemetry.Logs.LoggerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/Stable/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/Stable/PublicAPI.Unshipped.txt index d58a0903257..73e7082946a 100644 --- a/src/OpenTelemetry/.publicApi/Stable/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/Stable/PublicAPI.Unshipped.txt @@ -1,6 +1,14 @@ OpenTelemetry.OpenTelemetryBuilderSdkExtensions +OpenTelemetry.OpenTelemetrySdk +OpenTelemetry.OpenTelemetrySdk.Dispose() -> void +OpenTelemetry.OpenTelemetrySdk.MeterProvider.get -> OpenTelemetry.Metrics.MeterProvider! +OpenTelemetry.OpenTelemetrySdk.Services.get -> System.IServiceProvider! +OpenTelemetry.OpenTelemetrySdk.TracerProvider.get -> OpenTelemetry.Trace.TracerProvider! +OpenTelemetry.OpenTelemetrySdkExtensions static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.ConfigureResource(this OpenTelemetry.IOpenTelemetryBuilder! builder, System.Action! configure) -> OpenTelemetry.IOpenTelemetryBuilder! static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithMetrics(this OpenTelemetry.IOpenTelemetryBuilder! builder) -> OpenTelemetry.IOpenTelemetryBuilder! static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithMetrics(this OpenTelemetry.IOpenTelemetryBuilder! builder, System.Action! configure) -> OpenTelemetry.IOpenTelemetryBuilder! static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithTracing(this OpenTelemetry.IOpenTelemetryBuilder! builder) -> OpenTelemetry.IOpenTelemetryBuilder! static OpenTelemetry.OpenTelemetryBuilderSdkExtensions.WithTracing(this OpenTelemetry.IOpenTelemetryBuilder! builder, System.Action! configure) -> OpenTelemetry.IOpenTelemetryBuilder! +static OpenTelemetry.OpenTelemetrySdk.Create(System.Action! configure) -> OpenTelemetry.OpenTelemetrySdk! +static OpenTelemetry.OpenTelemetrySdkExtensions.GetLoggerFactory(this OpenTelemetry.OpenTelemetrySdk! sdk) -> Microsoft.Extensions.Logging.ILoggerFactory! diff --git a/src/OpenTelemetry/OpenTelemetrySdk.cs b/src/OpenTelemetry/OpenTelemetrySdk.cs new file mode 100644 index 00000000000..e5529333b9a --- /dev/null +++ b/src/OpenTelemetry/OpenTelemetrySdk.cs @@ -0,0 +1,145 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +using System.Diagnostics; +#if NET8_0_OR_GREATER +using System.Diagnostics.CodeAnalysis; +#endif +using Microsoft.Extensions.DependencyInjection; +using OpenTelemetry.Internal; +using OpenTelemetry.Logs; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; + +namespace OpenTelemetry; + +/// +/// Contains methods for configuring the OpenTelemetry SDK and accessing +/// logging, metrics, and tracing providers. +/// +public sealed class OpenTelemetrySdk : IDisposable +{ + private readonly ServiceProvider serviceProvider; + + private OpenTelemetrySdk( + Action configure) + { + Debug.Assert(configure != null, "configure was null"); + + var services = new ServiceCollection(); + + var builder = new OpenTelemetrySdkBuilder(services); + + configure!(builder); + + this.serviceProvider = services.BuildServiceProvider(); + + this.LoggerProvider = (LoggerProvider?)this.serviceProvider.GetService(typeof(LoggerProvider)) + ?? new NoopLoggerProvider(); + this.MeterProvider = (MeterProvider?)this.serviceProvider.GetService(typeof(MeterProvider)) + ?? new NoopMeterProvider(); + this.TracerProvider = (TracerProvider?)this.serviceProvider.GetService(typeof(TracerProvider)) + ?? new NoopTracerProvider(); + } + + /// + /// Gets the containing SDK services. + /// + public IServiceProvider Services => this.serviceProvider; + + /// + /// Gets the . + /// + /// + /// Note: The default will be a no-op instance. + /// Call + /// to enable metrics. + /// + public MeterProvider MeterProvider { get; } + + /// + /// Gets the . + /// + /// + /// Note: The default will be a no-op instance. + /// Call + /// to enable tracing. + /// + public TracerProvider TracerProvider { get; } + +#if EXPOSE_EXPERIMENTAL_FEATURES + /// + /// Gets the . + /// + /// + /// WARNING: This is an experimental API which might change or + /// be removed in the future. Use at your own risk. + /// Note: The default will be a no-op instance. + /// Call to + /// enable logging. + /// +#if NET8_0_OR_GREATER + [Experimental(DiagnosticDefinitions.LoggerProviderExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)] +#endif + public LoggerProvider LoggerProvider { get; } +#else + /// + /// Gets the . + /// + /// + /// Note: The default will be a no-op instance. + /// Call to + /// enable logging. + /// + internal LoggerProvider LoggerProvider { get; } +#endif + + /// + /// Create an instance. + /// + /// configuration delegate. + /// Created . + public static OpenTelemetrySdk Create( + Action configure) + { + Guard.ThrowIfNull(configure); + + return new(configure); + } + + /// + public void Dispose() + { + this.serviceProvider.Dispose(); + } + + private sealed class OpenTelemetrySdkBuilder : IOpenTelemetryBuilder + { + public OpenTelemetrySdkBuilder(IServiceCollection services) + { + Debug.Assert(services != null, "services was null"); + + services!.AddOpenTelemetrySharedProviderBuilderServices(); + + this.Services = services!; + } + + public IServiceCollection Services { get; } + } + + private sealed class NoopLoggerProvider : LoggerProvider + { + } + + private sealed class NoopMeterProvider : MeterProvider + { + } + + private sealed class NoopTracerProvider : TracerProvider + { + } +} diff --git a/src/OpenTelemetry/OpenTelemetrySdkExtensions.cs b/src/OpenTelemetry/OpenTelemetrySdkExtensions.cs new file mode 100644 index 00000000000..f1f01e0f20a --- /dev/null +++ b/src/OpenTelemetry/OpenTelemetrySdkExtensions.cs @@ -0,0 +1,36 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using OpenTelemetry.Internal; + +namespace OpenTelemetry; + +/// +/// Contains methods for extending the class. +/// +public static class OpenTelemetrySdkExtensions +{ + private static readonly NullLoggerFactory NoopLoggerFactory = new(); + + /// + /// Gets the contained in an instance. + /// + /// + /// Note: The default will be a no-op instance. + /// Call + /// to enable logging. + /// + /// . + /// . + public static ILoggerFactory GetLoggerFactory(this OpenTelemetrySdk sdk) + { + Guard.ThrowIfNull(sdk); + + return (ILoggerFactory?)sdk.Services.GetService(typeof(ILoggerFactory)) + ?? NoopLoggerFactory; + } +} From 773f90a0f71d6a1ebaf9ff3844735b28738e5a98 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 7 Feb 2024 12:54:15 -0800 Subject: [PATCH 2/7] Warning fix. --- src/OpenTelemetry/OpenTelemetrySdk.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenTelemetry/OpenTelemetrySdk.cs b/src/OpenTelemetry/OpenTelemetrySdk.cs index e5529333b9a..6724ea974f2 100644 --- a/src/OpenTelemetry/OpenTelemetrySdk.cs +++ b/src/OpenTelemetry/OpenTelemetrySdk.cs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 using System.Diagnostics; -#if NET8_0_OR_GREATER +#if EXPOSE_EXPERIMENTAL_FEATURES && NET8_0_OR_GREATER using System.Diagnostics.CodeAnalysis; #endif using Microsoft.Extensions.DependencyInjection; From a201153e91e3e70128dd2dbec39a6552c92a9e85 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Mon, 12 Feb 2024 10:58:53 -0800 Subject: [PATCH 3/7] Unit tests. --- src/OpenTelemetry/OpenTelemetrySdk.cs | 24 +++---- .../OpenTelemetrySdkTests.cs | 70 +++++++++++++++++++ 2 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 test/OpenTelemetry.Tests/OpenTelemetrySdkTests.cs diff --git a/src/OpenTelemetry/OpenTelemetrySdk.cs b/src/OpenTelemetry/OpenTelemetrySdk.cs index 6724ea974f2..64923ed2fd6 100644 --- a/src/OpenTelemetry/OpenTelemetrySdk.cs +++ b/src/OpenTelemetry/OpenTelemetrySdk.cs @@ -117,6 +117,18 @@ public void Dispose() this.serviceProvider.Dispose(); } + internal sealed class NoopLoggerProvider : LoggerProvider + { + } + + internal sealed class NoopMeterProvider : MeterProvider + { + } + + internal sealed class NoopTracerProvider : TracerProvider + { + } + private sealed class OpenTelemetrySdkBuilder : IOpenTelemetryBuilder { public OpenTelemetrySdkBuilder(IServiceCollection services) @@ -130,16 +142,4 @@ public OpenTelemetrySdkBuilder(IServiceCollection services) public IServiceCollection Services { get; } } - - private sealed class NoopLoggerProvider : LoggerProvider - { - } - - private sealed class NoopMeterProvider : MeterProvider - { - } - - private sealed class NoopTracerProvider : TracerProvider - { - } } diff --git a/test/OpenTelemetry.Tests/OpenTelemetrySdkTests.cs b/test/OpenTelemetry.Tests/OpenTelemetrySdkTests.cs new file mode 100644 index 00000000000..3c8522cb554 --- /dev/null +++ b/test/OpenTelemetry.Tests/OpenTelemetrySdkTests.cs @@ -0,0 +1,70 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +#nullable enable + +using Microsoft.Extensions.Logging.Abstractions; +using OpenTelemetry.Logs; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; +using Xunit; + +namespace OpenTelemetry.Tests; + +public class OpenTelemetrySdkTests +{ + [Fact] + public void BuilderDelegateRequiredTest() + { + Assert.Throws(() => OpenTelemetrySdk.Create(null!)); + } + + [Fact] + public void NoopProvidersReturnedTest() + { + bool builderDelegateInvoked = false; + + using var sdk = OpenTelemetrySdk.Create(builder => + { + builderDelegateInvoked = true; + Assert.NotNull(builder.Services); + }); + + Assert.True(builderDelegateInvoked); + + Assert.NotNull(sdk); + Assert.NotNull(sdk.Services); + Assert.True(sdk.LoggerProvider is OpenTelemetrySdk.NoopLoggerProvider); + Assert.True(sdk.MeterProvider is OpenTelemetrySdk.NoopMeterProvider); + Assert.True(sdk.TracerProvider is OpenTelemetrySdk.NoopTracerProvider); + Assert.True(sdk.GetLoggerFactory() is NullLoggerFactory); + } + + [Fact] + public void ProvidersCreatedAndDisposedTest() + { + var sdk = OpenTelemetrySdk.Create(builder => + { + builder + .WithLogging() + .WithMetrics() + .WithTracing(); + }); + + var loggerProvider = sdk.LoggerProvider as LoggerProviderSdk; + var meterProvider = sdk.MeterProvider as MeterProviderSdk; + var tracerProvider = sdk.TracerProvider as TracerProviderSdk; + + Assert.NotNull(loggerProvider); + Assert.NotNull(meterProvider); + Assert.NotNull(tracerProvider); + + Assert.True(sdk.GetLoggerFactory() is not NullLoggerFactory); + + sdk.Dispose(); + + Assert.True(loggerProvider.Disposed); + Assert.True(meterProvider.Disposed); + Assert.True(tracerProvider.Disposed); + } +} From 74d9d9e0b8501865e83ffc49018dd582adfd3957 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Mon, 12 Feb 2024 11:03:45 -0800 Subject: [PATCH 4/7] CHANGELOG patch. --- src/OpenTelemetry/CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 6260596c78c..1f73ef0eefe 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -42,6 +42,12 @@ [IMetricsListener](https://learn.microsoft.com/dotNet/api/microsoft.extensions.diagnostics.metrics.imetricslistener). ([#5265](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5265)) +* Added `OpenTelemetrySdk.Create` API for configuring OpenTelemetry .NET signals + (logging, tracing, and metrics) via a single builder. This new API simplifies + bootstrap and teardown, and supports cross-cutting extensions targeting + `IOpenTelemetryBuilder`. + ([#5325](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5325)) + ## 1.7.0 Released 2023-Dec-08 From b5872d8f6bea18c6b2bf6141a2d07b1d3f18a2b9 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Tue, 30 Apr 2024 14:10:26 -0700 Subject: [PATCH 5/7] Merge fix. --- src/OpenTelemetry/CHANGELOG.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 9c9baa45570..7bfde7503b1 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -12,6 +12,12 @@ which could have led to a measurement being dropped. ([#5546](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5546)) +* Added `OpenTelemetrySdk.Create` API for configuring OpenTelemetry .NET signals + (logging, tracing, and metrics) via a single builder. This new API simplifies + bootstrap and teardown, and supports cross-cutting extensions targeting + `IOpenTelemetryBuilder`. + ([#5325](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5325)) + ## 1.8.1 Released 2024-Apr-17 @@ -118,12 +124,6 @@ Released 2024-Mar-14 Specification](https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/configuration/sdk-environment-variables.md#exemplar). ([#5412](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5412)) -* Added `OpenTelemetrySdk.Create` API for configuring OpenTelemetry .NET signals - (logging, tracing, and metrics) via a single builder. This new API simplifies - bootstrap and teardown, and supports cross-cutting extensions targeting - `IOpenTelemetryBuilder`. - ([#5325](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5325)) - ## 1.7.0 Released 2023-Dec-08 From 4a58bc4917a2883b8822b7bd51993035f633137f Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 20 Jun 2024 10:22:54 -0700 Subject: [PATCH 6/7] Updates. --- .../.publicApi/Stable/PublicAPI.Unshipped.txt | 4 +-- src/OpenTelemetry/CHANGELOG.md | 6 +++++ src/OpenTelemetry/OpenTelemetrySdk.cs | 27 +++---------------- 3 files changed, 11 insertions(+), 26 deletions(-) diff --git a/src/OpenTelemetry/.publicApi/Stable/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/Stable/PublicAPI.Unshipped.txt index c98b7b8316d..7dc29c7de2d 100644 --- a/src/OpenTelemetry/.publicApi/Stable/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/Stable/PublicAPI.Unshipped.txt @@ -1,8 +1,8 @@ OpenTelemetry.OpenTelemetrySdk OpenTelemetry.OpenTelemetrySdk.Dispose() -> void +OpenTelemetry.OpenTelemetrySdk.LoggerProvider.get -> OpenTelemetry.Logs.LoggerProvider! OpenTelemetry.OpenTelemetrySdk.MeterProvider.get -> OpenTelemetry.Metrics.MeterProvider! -OpenTelemetry.OpenTelemetrySdk.Services.get -> System.IServiceProvider! OpenTelemetry.OpenTelemetrySdk.TracerProvider.get -> OpenTelemetry.Trace.TracerProvider! OpenTelemetry.OpenTelemetrySdkExtensions static OpenTelemetry.OpenTelemetrySdk.Create(System.Action! configure) -> OpenTelemetry.OpenTelemetrySdk! -static OpenTelemetry.OpenTelemetrySdkExtensions.GetLoggerFactory(this OpenTelemetry.OpenTelemetrySdk! sdk) -> Microsoft.Extensions.Logging.ILoggerFactory! \ No newline at end of file +static OpenTelemetry.OpenTelemetrySdkExtensions.GetLoggerFactory(this OpenTelemetry.OpenTelemetrySdk! sdk) -> Microsoft.Extensions.Logging.ILoggerFactory! diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index ca4d195698d..100ec92d219 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -2,6 +2,12 @@ ## Unreleased +* Added `OpenTelemetrySdk.Create` API for configuring OpenTelemetry .NET signals + (logging, tracing, and metrics) via a single builder. This new API simplifies + bootstrap and teardown, and supports cross-cutting extensions targeting + `IOpenTelemetryBuilder`. + ([#5325](https://github.com/open-telemetry/opentelemetry-dotnet/pull/5325)) + ## 1.9.0 Released 2024-Jun-14 diff --git a/src/OpenTelemetry/OpenTelemetrySdk.cs b/src/OpenTelemetry/OpenTelemetrySdk.cs index 64923ed2fd6..0c25faf4a30 100644 --- a/src/OpenTelemetry/OpenTelemetrySdk.cs +++ b/src/OpenTelemetry/OpenTelemetrySdk.cs @@ -2,9 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 using System.Diagnostics; -#if EXPOSE_EXPERIMENTAL_FEATURES && NET8_0_OR_GREATER -using System.Diagnostics.CodeAnalysis; -#endif using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; using OpenTelemetry.Logs; @@ -42,11 +39,6 @@ private OpenTelemetrySdk( ?? new NoopTracerProvider(); } - /// - /// Gets the containing SDK services. - /// - public IServiceProvider Services => this.serviceProvider; - /// /// Gets the . /// @@ -69,34 +61,21 @@ private OpenTelemetrySdk( /// public TracerProvider TracerProvider { get; } -#if EXPOSE_EXPERIMENTAL_FEATURES /// /// Gets the . /// /// - /// WARNING: This is an experimental API which might change or - /// be removed in the future. Use at your own risk. /// Note: The default will be a no-op instance. /// Call to /// enable logging. /// -#if NET8_0_OR_GREATER - [Experimental(DiagnosticDefinitions.LoggerProviderExperimentalApi, UrlFormat = DiagnosticDefinitions.ExperimentalApiUrlFormat)] -#endif public LoggerProvider LoggerProvider { get; } -#else + /// - /// Gets the . + /// Gets the containing SDK services. /// - /// - /// Note: The default will be a no-op instance. - /// Call to - /// enable logging. - /// - internal LoggerProvider LoggerProvider { get; } -#endif + internal IServiceProvider Services => this.serviceProvider; /// /// Create an instance. From 456354f05f37302845ba38b38f79563eeaff703d Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 20 Jun 2024 10:25:52 -0700 Subject: [PATCH 7/7] Tweak. --- src/OpenTelemetry/OpenTelemetrySdk.cs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/OpenTelemetry/OpenTelemetrySdk.cs b/src/OpenTelemetry/OpenTelemetrySdk.cs index 0c25faf4a30..7020d05ce1c 100644 --- a/src/OpenTelemetry/OpenTelemetrySdk.cs +++ b/src/OpenTelemetry/OpenTelemetrySdk.cs @@ -39,6 +39,17 @@ private OpenTelemetrySdk( ?? new NoopTracerProvider(); } + /// + /// Gets the . + /// + /// + /// Note: The default will be a no-op instance. + /// Call to + /// enable logging. + /// + public LoggerProvider LoggerProvider { get; } + /// /// Gets the . /// @@ -61,17 +72,6 @@ private OpenTelemetrySdk( /// public TracerProvider TracerProvider { get; } - /// - /// Gets the . - /// - /// - /// Note: The default will be a no-op instance. - /// Call to - /// enable logging. - /// - public LoggerProvider LoggerProvider { get; } - /// /// Gets the containing SDK services. ///