diff --git a/samples/Exporters/Web/Startup.cs b/samples/Exporters/Web/Startup.cs index 7d64a79eb..c0dc82cd3 100644 --- a/samples/Exporters/Web/Startup.cs +++ b/samples/Exporters/Web/Startup.cs @@ -39,7 +39,7 @@ namespace API // Switch between Zipkin/Jaeger by commenting out one of the following. /* - services.AddOpenTelemetrySdk((builder) => builder.AddRequestInstrumentation().AddDependencyInstrumentation() + services.AddOpenTelemetry((builder) => builder.AddRequestInstrumentation().AddDependencyInstrumentation() .UseJaegerActivityExporter(o => { o.ServiceName = this.Configuration.GetValue("Jaeger:ServiceName"); @@ -48,7 +48,7 @@ namespace API })); */ - services.AddOpenTelemetrySdk((builder) => builder.AddRequestInstrumentation().AddDependencyInstrumentation() + services.AddOpenTelemetry((builder) => builder.AddRequestInstrumentation().AddDependencyInstrumentation() .UseZipkinActivityExporter(o => { o.ServiceName = this.Configuration.GetValue("Zipkin:ServiceName"); diff --git a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryFactoryHostedService.cs b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryFactoryHostedService.cs deleted file mode 100644 index 8c3605c98..000000000 --- a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryFactoryHostedService.cs +++ /dev/null @@ -1,49 +0,0 @@ -// -// 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. -// - -namespace OpenTelemetry.Extensions.Hosting.Implementation -{ - using System; - using System.Threading; - using System.Threading.Tasks; - using Microsoft.Extensions.DependencyInjection; - using Microsoft.Extensions.Hosting; - using OpenTelemetry.Trace; - - internal class TelemetryFactoryHostedService : IHostedService - { - private readonly IServiceProvider serviceProvider; - - public TelemetryFactoryHostedService(IServiceProvider serviceProvider) - { - this.serviceProvider = serviceProvider; - } - - public Task StartAsync(CancellationToken cancellationToken) - { - // Ensure the factory was created when the app starts. - // This will create and start any configured instrumentations. - this.serviceProvider.GetRequiredService(); - - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; - } - } -} diff --git a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs index 17353691b..ba9ae3acc 100644 --- a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs +++ b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs @@ -34,8 +34,11 @@ namespace OpenTelemetry.Extensions.Hosting.Implementation public Task StartAsync(CancellationToken cancellationToken) { - // Ensure the factory was created when the app starts. - // This will create and start any configured instrumentations. + // The sole purpose of this HostedService is to ensure + // all instrumentations are created and started. + // This method is invoked when host starts, and + // by requesting the OpenTelemetrySdk from DI + // it ensures all instrumentations gets started. this.serviceProvider.GetRequiredService(); return Task.CompletedTask; diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index fc75ad62d..3dc990712 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -20,7 +20,6 @@ namespace Microsoft.Extensions.DependencyInjection using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using OpenTelemetry.Extensions.Hosting.Implementation; - using OpenTelemetry.Trace; using OpenTelemetry.Trace.Configuration; /// @@ -43,24 +42,11 @@ namespace Microsoft.Extensions.DependencyInjection /// Adds OpenTelemetry services to the specified . /// /// The to add services to. + /// The configuration delegate. /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetrySdk(this IServiceCollection services) + public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Action configure) { - services.AddOpenTelemetrySdk(builder => { }); - return services; - } - - /// - /// Adds OpenTelemetry services to the specified . - /// - /// The to add services to. - /// The configuration delegate. - /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Action configure) - { - services.AddOpenTelemetry(() => TracerFactory.Create(configure)); - services.AddSingleton(s => (TracerFactory)s.GetRequiredService()); - + services.AddOpenTelemetry(() => OpenTelemetrySdk.EnableOpenTelemetry(configure)); return services; } @@ -70,59 +56,9 @@ namespace Microsoft.Extensions.DependencyInjection /// The to add services to. /// The configuration delegate. /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetrySdk(this IServiceCollection services, Action configure) + public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Action configure) { - services.AddOpenTelemetrySdk(() => OpenTelemetrySdk.EnableOpenTelemetry(configure)); - return services; - } - - /// - /// Adds OpenTelemetry services to the specified . - /// - /// The to add services to. - /// The configuration delegate. - /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Action configure) - { - services.AddOpenTelemetry(s => TracerFactory.Create(builder => configure(s, builder))); - services.AddSingleton(s => (TracerFactory)s.GetRequiredService()); - - return services; - } - - /// - /// Adds OpenTelemetry services to the specified . - /// - /// The to add services to. - /// The configuration delegate. - /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetrySdk(this IServiceCollection services, Action configure) - { - services.AddOpenTelemetrySdk(s => OpenTelemetrySdk.EnableOpenTelemetry(builder => configure(s, builder))); - return services; - } - - /// - /// Adds OpenTelemetry services to the specified . - /// - /// The to add services to. - /// A delegate that provides the factory to be registered. - /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Func createFactory) - { - if (services is null) - { - throw new ArgumentNullException(nameof(services)); - } - - if (createFactory is null) - { - throw new ArgumentNullException(nameof(createFactory)); - } - - services.AddSingleton(s => createFactory()); - AddOpenTelemetryCore(services); - + services.AddOpenTelemetry(s => OpenTelemetrySdk.EnableOpenTelemetry(builder => configure(s, builder))); return services; } @@ -132,7 +68,7 @@ namespace Microsoft.Extensions.DependencyInjection /// The to add services to. /// A delegate that provides the factory to be registered. /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetrySdk(this IServiceCollection services, Func createSdk) + public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Func createSdk) { if (services is null) { @@ -145,31 +81,7 @@ namespace Microsoft.Extensions.DependencyInjection } services.AddSingleton(s => createSdk()); - AddOpenTelemetrySdkCore(services); - - return services; - } - - /// - /// Adds OpenTelemetry services to the specified . - /// - /// The to add services to. - /// A delegate that provides the factory to be registered. - /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Func createFactory) - { - if (services is null) - { - throw new ArgumentNullException(nameof(services)); - } - - if (createFactory is null) - { - throw new ArgumentNullException(nameof(createFactory)); - } - - services.AddSingleton(s => createFactory(s)); - AddOpenTelemetryCore(services); + AddOpenTelemetryInternal(services); return services; } @@ -180,7 +92,7 @@ namespace Microsoft.Extensions.DependencyInjection /// The to add services to. /// A delegate that provides the factory to be registered. /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetrySdk(this IServiceCollection services, Func createSdk) + public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Func createSdk) { if (services is null) { @@ -193,17 +105,12 @@ namespace Microsoft.Extensions.DependencyInjection } services.AddSingleton(s => createSdk(s)); - AddOpenTelemetrySdkCore(services); + AddOpenTelemetryInternal(services); return services; } - private static void AddOpenTelemetryCore(IServiceCollection services) - { - services.TryAddEnumerable(ServiceDescriptor.Singleton()); - } - - private static void AddOpenTelemetrySdkCore(IServiceCollection services) + private static void AddOpenTelemetryInternal(IServiceCollection services) { services.TryAddEnumerable(ServiceDescriptor.Singleton()); } diff --git a/src/OpenTelemetry/Trace/Configuration/OpenTelemetryBuilder.cs b/src/OpenTelemetry/Trace/Configuration/OpenTelemetryBuilder.cs index 5f1bb20e6..bc2d73ca1 100644 --- a/src/OpenTelemetry/Trace/Configuration/OpenTelemetryBuilder.cs +++ b/src/OpenTelemetry/Trace/Configuration/OpenTelemetryBuilder.cs @@ -102,7 +102,7 @@ namespace OpenTelemetry.Trace.Configuration } /// - /// Adds auto-instrumentations for spans. + /// Adds auto-instrumentations for activity. /// /// Type of instrumentation class. /// Function that builds instrumentation. diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingIntergrationOpenTelemetrySdkTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingExtensionsTests.cs similarity index 88% rename from test/OpenTelemetry.Extensions.Hosting.Tests/HostingIntergrationOpenTelemetrySdkTests.cs rename to test/OpenTelemetry.Extensions.Hosting.Tests/HostingExtensionsTests.cs index 278ddc377..3a88ec238 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingIntergrationOpenTelemetrySdkTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingExtensionsTests.cs @@ -1,4 +1,4 @@ -// +// // Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,17 +23,17 @@ using Xunit; namespace OpenTelemetry.Extensions.Hosting { - public class HostingIntergrationOpenTelemetrySdkTests + public class HostingExtensionsTests { [Fact] - public async Task AddOpenTelemetry_RegisterInstrumentation_InstrumentationCreatedAndDisposed() + public async Task AddOpenTelemetryInstrumentationCreationAndDisposal() { var testInstrumentation = new TestInstrumentation(); var callbackRun = false; var builder = new HostBuilder().ConfigureServices(services => { - services.AddOpenTelemetrySdk(builder => + services.AddOpenTelemetry(builder => { builder.AddInstrumentation((activitySource) => { @@ -69,7 +69,7 @@ namespace OpenTelemetry.Extensions.Hosting { var builder = new HostBuilder().ConfigureServices(services => { - services.AddOpenTelemetrySdk(); + services.AddOpenTelemetry(); }); var host = builder.Build(); @@ -87,7 +87,7 @@ namespace OpenTelemetry.Extensions.Hosting var services = new ServiceCollection(); services.AddSingleton(testInstrumentation); - services.AddOpenTelemetrySdk((provider, builder) => + services.AddOpenTelemetry((provider, builder) => { builder.AddInstrumentation((activitySource) => provider.GetRequiredService()); }); diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingIntegrationTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingIntegrationTests.cs deleted file mode 100644 index c62139591..000000000 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingIntegrationTests.cs +++ /dev/null @@ -1,123 +0,0 @@ -// -// 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. -// - -using System; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using OpenTelemetry.Trace; -using OpenTelemetry.Trace.Configuration; -using Xunit; - -namespace OpenTelemetry.Extensions.Hosting -{ - public class HostingIntegrationTests - { - [Fact] - public async Task AddOpenTelemetry_RegisterInstrumentation_InstrumentationCreatedAndDisposed() - { - var testInstrumentation = new TestInstrumentation(); - var callbackRun = false; - - var builder = new HostBuilder().ConfigureServices(services => - { - services.AddOpenTelemetry(telemetry => - { - telemetry.AddInstrumentation(t => - { - callbackRun = true; - return testInstrumentation; - }); - }); - }); - - var host = builder.Build(); - - Assert.False(callbackRun); - Assert.False(testInstrumentation.Disposed); - - await host.StartAsync(); - - Assert.True(callbackRun); - Assert.False(testInstrumentation.Disposed); - - await host.StopAsync(); - - Assert.True(callbackRun); - Assert.False(testInstrumentation.Disposed); - - host.Dispose(); - - Assert.True(callbackRun); - Assert.True(testInstrumentation.Disposed); - } - - [Fact] - public void AddOpenTelemetry_HostBuilt_TracerFactoryRegisteredAsSingleton() - { - var builder = new HostBuilder().ConfigureServices(services => - { - services.AddOpenTelemetry(); - }); - - var host = builder.Build(); - - var tracerFactoryBase1 = host.Services.GetRequiredService(); - var tracerFactoryBase2 = host.Services.GetRequiredService(); - - Assert.Same(tracerFactoryBase1, tracerFactoryBase2); - - var tracerFactory1 = host.Services.GetRequiredService(); - var tracerFactory2 = host.Services.GetRequiredService(); - - Assert.Same(tracerFactory1, tracerFactory2); - } - - [Fact] - public void AddOpenTelemetry_ServiceProviderArgument_ServicesRegistered() - { - var testInstrumentation = new TestInstrumentation(); - - var services = new ServiceCollection(); - services.AddSingleton(testInstrumentation); - services.AddOpenTelemetry((provider, builder) => - { - builder.AddInstrumentation(tracer => provider.GetRequiredService()); - }); - - var serviceProvider = services.BuildServiceProvider(); - - var tracerFactory = serviceProvider.GetRequiredService(); - Assert.NotNull(tracerFactory); - - Assert.False(testInstrumentation.Disposed); - - serviceProvider.Dispose(); - - Assert.True(testInstrumentation.Disposed); - } - - internal class TestInstrumentation : IDisposable - { - public bool Disposed { get; private set; } - - public void Dispose() - { - this.Disposed = true; - } - } - } -} diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs index c2db009ee..8bd03f7c2 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs @@ -56,7 +56,7 @@ namespace OpenTelemetry.Instrumentation.AspNetCore.Tests builder.ConfigureTestServices((IServiceCollection services) => { services.AddSingleton(new TestCallbackMiddlewareImpl()); - services.AddOpenTelemetrySdk((builder) => builder.AddRequestInstrumentation() + services.AddOpenTelemetry((builder) => builder.AddRequestInstrumentation() .AddProcessorPipeline(p => p.AddProcessor(n => spanProcessor.Object))); })) .CreateClient())