diff --git a/src/OpenTelemetry.Api/.publicApi/net452/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Api/.publicApi/net452/PublicAPI.Unshipped.txt index eb5e650a70e..adbd8ebe8c4 100644 --- a/src/OpenTelemetry.Api/.publicApi/net452/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Api/.publicApi/net452/PublicAPI.Unshipped.txt @@ -1,2 +1,4 @@ abstract OpenTelemetry.Trace.TracerProviderBuilder.AddLegacySource(string operationName) -> OpenTelemetry.Trace.TracerProviderBuilder +OpenTelemetry.Trace.IDeferredTracerProviderBuilder +OpenTelemetry.Trace.IDeferredTracerProviderBuilder.Configure(System.Action configure) -> OpenTelemetry.Trace.TracerProviderBuilder OpenTelemetry.Trace.TracerProviderBuilder.TracerProviderBuilder() -> void \ No newline at end of file diff --git a/src/OpenTelemetry.Api/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Api/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index eb5e650a70e..adbd8ebe8c4 100644 --- a/src/OpenTelemetry.Api/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Api/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,2 +1,4 @@ abstract OpenTelemetry.Trace.TracerProviderBuilder.AddLegacySource(string operationName) -> OpenTelemetry.Trace.TracerProviderBuilder +OpenTelemetry.Trace.IDeferredTracerProviderBuilder +OpenTelemetry.Trace.IDeferredTracerProviderBuilder.Configure(System.Action configure) -> OpenTelemetry.Trace.TracerProviderBuilder OpenTelemetry.Trace.TracerProviderBuilder.TracerProviderBuilder() -> void \ No newline at end of file diff --git a/src/OpenTelemetry.Api/CHANGELOG.md b/src/OpenTelemetry.Api/CHANGELOG.md index bfc55c77c97..754d5b87102 100644 --- a/src/OpenTelemetry.Api/CHANGELOG.md +++ b/src/OpenTelemetry.Api/CHANGELOG.md @@ -9,6 +9,9 @@ please check the latest changes ## Unreleased +* Added `IDeferredTracerProviderBuilder`. + ([#2058](https://github.com/open-telemetry/opentelemetry-dotnet/pull/2100)) + ## 1.1.0-beta4 Released 2021-Jun-09 diff --git a/src/OpenTelemetry/Trace/IDeferredTracerProviderBuilder.cs b/src/OpenTelemetry.Api/Trace/IDeferredTracerProviderBuilder.cs similarity index 83% rename from src/OpenTelemetry/Trace/IDeferredTracerProviderBuilder.cs rename to src/OpenTelemetry.Api/Trace/IDeferredTracerProviderBuilder.cs index f83a1e969e9..882f57ce802 100644 --- a/src/OpenTelemetry/Trace/IDeferredTracerProviderBuilder.cs +++ b/src/OpenTelemetry.Api/Trace/IDeferredTracerProviderBuilder.cs @@ -15,9 +15,6 @@ // using System; -#if NET461_OR_GREATER || NETSTANDARD2_0 -using Microsoft.Extensions.DependencyInjection; -#endif namespace OpenTelemetry.Trace { @@ -28,13 +25,6 @@ namespace OpenTelemetry.Trace /// public interface IDeferredTracerProviderBuilder { -#if NET461_OR_GREATER || NETSTANDARD2_0 - /// - /// Gets the application . - /// - IServiceCollection Services { get; } -#endif - /// /// Register a callback action to configure the once the application static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.IServiceProvider serviceProvider) -> OpenTelemetry.Trace.TracerProvider static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.Action configure) -> OpenTelemetry.Trace.TracerProviderBuilder +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.GetServices(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder diff --git a/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md index a4679d91372..5cbad9c3b36 100644 --- a/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md +++ b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +* Added `GetServices` extension. + ([#2058](https://github.com/open-telemetry/opentelemetry-dotnet/pull/2100)) + ## 1.0.0-rc5 Released 2021-Jun-09 diff --git a/src/OpenTelemetry.Extensions.Hosting/README.md b/src/OpenTelemetry.Extensions.Hosting/README.md index 10edf0ad927..0a8ade20781 100644 --- a/src/OpenTelemetry.Extensions.Hosting/README.md +++ b/src/OpenTelemetry.Extensions.Hosting/README.md @@ -65,21 +65,18 @@ from the application `IServiceCollection` so any services registered in the Library authors may want to configure the OpenTelemetry `TracerProvider` and register application services to provide more complex features. This can be -accomplished concisely by casting the `TracerProviderBuilder` into an -`IDeferredTracerProviderBuilder` instance in an extension method like this: +accomplished concisely by using the `TracerProviderBuilder.GetServices` +extension method inside of a more general `TracerProviderBuilder` configuration +extension like this: ```csharp public static class MyLibraryExtensions { public static TracerProviderBuilder AddMyFeature(this TracerProviderBuilder tracerProviderBuilder) { - if (!(tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder)) - { - throw new NotSupportedException( - "MyFeature requires an IDeferredTracerProviderBuilder instance."); - } - - deferredTracerProviderBuilder.Services + (tracerProviderBuilder.GetServices() + ?? throw new NotSupportedException( + "MyFeature requires a hosting TracerProviderBuilder instance.")) .AddHostedService() .AddSingleton() .AddSingleton() diff --git a/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs index dfe2d21e7c3..ca26671edfa 100644 --- a/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs @@ -97,6 +97,23 @@ public static TracerProviderBuilder Configure(this TracerProviderBuilder tracerP return tracerProviderBuilder; } + /// + /// Gets the application attached to + /// the . + /// + /// . + /// or + /// if services are unavailable. + public static IServiceCollection GetServices(this TracerProviderBuilder tracerProviderBuilder) + { + if (tracerProviderBuilder is TracerProviderBuilderHosting tracerProviderBuilderHosting) + { + return tracerProviderBuilderHosting.Services; + } + + return null; + } + /// /// Run the configured actions to initialize the . /// diff --git a/src/OpenTelemetry/.publicApi/net452/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net452/PublicAPI.Unshipped.txt index 434be6c75d6..e68cf6badb6 100644 --- a/src/OpenTelemetry/.publicApi/net452/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net452/PublicAPI.Unshipped.txt @@ -1,5 +1,3 @@ -OpenTelemetry.Trace.IDeferredTracerProviderBuilder -OpenTelemetry.Trace.IDeferredTracerProviderBuilder.Configure(System.Action configure) -> OpenTelemetry.Trace.TracerProviderBuilder OpenTelemetry.Trace.ParentBasedSampler.ParentBasedSampler(OpenTelemetry.Trace.Sampler rootSampler, OpenTelemetry.Trace.Sampler remoteParentSampled = null, OpenTelemetry.Trace.Sampler remoteParentNotSampled = null, OpenTelemetry.Trace.Sampler localParentSampled = null, OpenTelemetry.Trace.Sampler localParentNotSampled = null) -> void OpenTelemetry.Trace.TracerProviderBuilderBase OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder diff --git a/src/OpenTelemetry/.publicApi/net46/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net46/PublicAPI.Unshipped.txt index 434be6c75d6..e68cf6badb6 100644 --- a/src/OpenTelemetry/.publicApi/net46/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net46/PublicAPI.Unshipped.txt @@ -1,5 +1,3 @@ -OpenTelemetry.Trace.IDeferredTracerProviderBuilder -OpenTelemetry.Trace.IDeferredTracerProviderBuilder.Configure(System.Action configure) -> OpenTelemetry.Trace.TracerProviderBuilder OpenTelemetry.Trace.ParentBasedSampler.ParentBasedSampler(OpenTelemetry.Trace.Sampler rootSampler, OpenTelemetry.Trace.Sampler remoteParentSampled = null, OpenTelemetry.Trace.Sampler remoteParentNotSampled = null, OpenTelemetry.Trace.Sampler localParentSampled = null, OpenTelemetry.Trace.Sampler localParentNotSampled = null) -> void OpenTelemetry.Trace.TracerProviderBuilderBase OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder diff --git a/src/OpenTelemetry/.publicApi/net461/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net461/PublicAPI.Unshipped.txt index ca2a9e08abf..2655fe7e12d 100644 --- a/src/OpenTelemetry/.publicApi/net461/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net461/PublicAPI.Unshipped.txt @@ -19,9 +19,6 @@ OpenTelemetry.Logs.OpenTelemetryLoggerOptions.IncludeScopes.set -> void OpenTelemetry.Logs.OpenTelemetryLoggerOptions.ParseStateValues.get -> bool OpenTelemetry.Logs.OpenTelemetryLoggerOptions.ParseStateValues.set -> void OpenTelemetry.Logs.OpenTelemetryLoggerOptions.SetResourceBuilder(OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions -OpenTelemetry.Trace.IDeferredTracerProviderBuilder -OpenTelemetry.Trace.IDeferredTracerProviderBuilder.Configure(System.Action configure) -> OpenTelemetry.Trace.TracerProviderBuilder -OpenTelemetry.Trace.IDeferredTracerProviderBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection OpenTelemetry.Trace.ParentBasedSampler.ParentBasedSampler(OpenTelemetry.Trace.Sampler rootSampler, OpenTelemetry.Trace.Sampler remoteParentSampled = null, OpenTelemetry.Trace.Sampler remoteParentNotSampled = null, OpenTelemetry.Trace.Sampler localParentSampled = null, OpenTelemetry.Trace.Sampler localParentNotSampled = null) -> void OpenTelemetry.Trace.TracerProviderBuilderBase OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index ca2a9e08abf..2655fe7e12d 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -19,9 +19,6 @@ OpenTelemetry.Logs.OpenTelemetryLoggerOptions.IncludeScopes.set -> void OpenTelemetry.Logs.OpenTelemetryLoggerOptions.ParseStateValues.get -> bool OpenTelemetry.Logs.OpenTelemetryLoggerOptions.ParseStateValues.set -> void OpenTelemetry.Logs.OpenTelemetryLoggerOptions.SetResourceBuilder(OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions -OpenTelemetry.Trace.IDeferredTracerProviderBuilder -OpenTelemetry.Trace.IDeferredTracerProviderBuilder.Configure(System.Action configure) -> OpenTelemetry.Trace.TracerProviderBuilder -OpenTelemetry.Trace.IDeferredTracerProviderBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection OpenTelemetry.Trace.ParentBasedSampler.ParentBasedSampler(OpenTelemetry.Trace.Sampler rootSampler, OpenTelemetry.Trace.Sampler remoteParentSampled = null, OpenTelemetry.Trace.Sampler remoteParentNotSampled = null, OpenTelemetry.Trace.Sampler localParentSampled = null, OpenTelemetry.Trace.Sampler localParentNotSampled = null) -> void OpenTelemetry.Trace.TracerProviderBuilderBase OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index d79fda2ffed..1e3861cb04c 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -9,6 +9,9 @@ please check the latest changes ## Unreleased +* Moved `IDeferredTracerProviderBuilder` to API library. + ([#2058](https://github.com/open-telemetry/opentelemetry-dotnet/pull/2100)) + ## 1.1.0-beta4 Released 2021-Jun-09 diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingExtensionsTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingExtensionsTests.cs index 86dd4984bb7..0a56f542e42 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingExtensionsTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingExtensionsTests.cs @@ -120,6 +120,19 @@ public void AddOpenTelemetryTracerProvider_BadArgs_NullServiceCollection() })); } + [Fact] + public void AddOpenTelemetryTracerProvider_GetServicesExtension() + { + var services = new ServiceCollection(); + services.AddOpenTelemetryTracing(builder => AddMyFeature(builder)); + + using var serviceProvider = services.BuildServiceProvider(); + + var tracerProvider = (TracerProviderSdk)serviceProvider.GetRequiredService(); + + Assert.True(tracerProvider.Sampler is TestSampler); + } + [Fact] public void AddOpenTelemetryTracerProvider_NestedConfigureCallbacks() { @@ -199,6 +212,14 @@ public void AddOpenTelemetryTracerProvider_Idempotent() Assert.True(testInstrumentation2.Disposed); } + private static TracerProviderBuilder AddMyFeature(TracerProviderBuilder tracerProviderBuilder) + { + (tracerProviderBuilder.GetServices() ?? throw new NotSupportedException("MyFeature requires a hosting TracerProviderBuilder instance.")) + .AddSingleton(); + + return tracerProviderBuilder.SetSampler(); + } + internal class TestInstrumentation : IDisposable { public bool Disposed { get; private set; }