Remove TracerFactory from Extensions.Hosting project (#790)

* Removed hosting extensions using tracerfactory

* rename

* test

* comment
This commit is contained in:
Cijo Thomas 2020-07-09 09:40:51 -07:00 committed by GitHub
parent 0973b3ea0a
commit bd65fd2132
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 25 additions and 287 deletions

View File

@ -39,7 +39,7 @@ namespace API
// Switch between Zipkin/Jaeger by commenting out one of the following. // 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 => .UseJaegerActivityExporter(o =>
{ {
o.ServiceName = this.Configuration.GetValue<string>("Jaeger:ServiceName"); o.ServiceName = this.Configuration.GetValue<string>("Jaeger:ServiceName");
@ -48,7 +48,7 @@ namespace API
})); }));
*/ */
services.AddOpenTelemetrySdk((builder) => builder.AddRequestInstrumentation().AddDependencyInstrumentation() services.AddOpenTelemetry((builder) => builder.AddRequestInstrumentation().AddDependencyInstrumentation()
.UseZipkinActivityExporter(o => .UseZipkinActivityExporter(o =>
{ {
o.ServiceName = this.Configuration.GetValue<string>("Zipkin:ServiceName"); o.ServiceName = this.Configuration.GetValue<string>("Zipkin:ServiceName");

View File

@ -1,49 +0,0 @@
// <copyright file="TelemetryFactoryHostedService.cs" company="OpenTelemetry Authors">
// 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.
// </copyright>
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<TracerFactoryBase>();
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
}

View File

@ -34,8 +34,11 @@ namespace OpenTelemetry.Extensions.Hosting.Implementation
public Task StartAsync(CancellationToken cancellationToken) public Task StartAsync(CancellationToken cancellationToken)
{ {
// Ensure the factory was created when the app starts. // The sole purpose of this HostedService is to ensure
// This will create and start any configured instrumentations. // 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<OpenTelemetrySdk>(); this.serviceProvider.GetRequiredService<OpenTelemetrySdk>();
return Task.CompletedTask; return Task.CompletedTask;

View File

@ -20,7 +20,6 @@ namespace Microsoft.Extensions.DependencyInjection
using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using OpenTelemetry.Extensions.Hosting.Implementation; using OpenTelemetry.Extensions.Hosting.Implementation;
using OpenTelemetry.Trace;
using OpenTelemetry.Trace.Configuration; using OpenTelemetry.Trace.Configuration;
/// <summary> /// <summary>
@ -43,24 +42,11 @@ namespace Microsoft.Extensions.DependencyInjection
/// Adds OpenTelemetry services to the specified <see cref="IServiceCollection" />. /// Adds OpenTelemetry services to the specified <see cref="IServiceCollection" />.
/// </summary> /// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param> /// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="configure">The <see cref="OpenTelemetryBuilder"/> configuration delegate.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns> /// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection AddOpenTelemetrySdk(this IServiceCollection services) public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Action<OpenTelemetryBuilder> configure)
{ {
services.AddOpenTelemetrySdk(builder => { }); services.AddOpenTelemetry(() => OpenTelemetrySdk.EnableOpenTelemetry(configure));
return services;
}
/// <summary>
/// Adds OpenTelemetry services to the specified <see cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="configure">The <see cref="TracerBuilder"/> configuration delegate.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Action<TracerBuilder> configure)
{
services.AddOpenTelemetry(() => TracerFactory.Create(configure));
services.AddSingleton<TracerFactory>(s => (TracerFactory)s.GetRequiredService<TracerFactoryBase>());
return services; return services;
} }
@ -70,59 +56,9 @@ namespace Microsoft.Extensions.DependencyInjection
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param> /// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="configure">The <see cref="OpenTelemetryBuilder"/> configuration delegate.</param> /// <param name="configure">The <see cref="OpenTelemetryBuilder"/> configuration delegate.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns> /// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection AddOpenTelemetrySdk(this IServiceCollection services, Action<OpenTelemetryBuilder> configure) public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Action<IServiceProvider, OpenTelemetryBuilder> configure)
{ {
services.AddOpenTelemetrySdk(() => OpenTelemetrySdk.EnableOpenTelemetry(configure)); services.AddOpenTelemetry(s => OpenTelemetrySdk.EnableOpenTelemetry(builder => configure(s, builder)));
return services;
}
/// <summary>
/// Adds OpenTelemetry services to the specified <see cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="configure">The <see cref="TracerBuilder"/> configuration delegate.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Action<IServiceProvider, TracerBuilder> configure)
{
services.AddOpenTelemetry(s => TracerFactory.Create(builder => configure(s, builder)));
services.AddSingleton<TracerFactory>(s => (TracerFactory)s.GetRequiredService<TracerFactoryBase>());
return services;
}
/// <summary>
/// Adds OpenTelemetry services to the specified <see cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="configure">The <see cref="OpenTelemetryBuilder"/> configuration delegate.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection AddOpenTelemetrySdk(this IServiceCollection services, Action<IServiceProvider, OpenTelemetryBuilder> configure)
{
services.AddOpenTelemetrySdk(s => OpenTelemetrySdk.EnableOpenTelemetry(builder => configure(s, builder)));
return services;
}
/// <summary>
/// Adds OpenTelemetry services to the specified <see cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="createFactory">A delegate that provides the factory to be registered.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Func<TracerFactoryBase> createFactory)
{
if (services is null)
{
throw new ArgumentNullException(nameof(services));
}
if (createFactory is null)
{
throw new ArgumentNullException(nameof(createFactory));
}
services.AddSingleton<TracerFactoryBase>(s => createFactory());
AddOpenTelemetryCore(services);
return services; return services;
} }
@ -132,7 +68,7 @@ namespace Microsoft.Extensions.DependencyInjection
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param> /// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="createSdk">A delegate that provides the factory to be registered.</param> /// <param name="createSdk">A delegate that provides the factory to be registered.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns> /// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection AddOpenTelemetrySdk(this IServiceCollection services, Func<OpenTelemetrySdk> createSdk) public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Func<OpenTelemetrySdk> createSdk)
{ {
if (services is null) if (services is null)
{ {
@ -145,31 +81,7 @@ namespace Microsoft.Extensions.DependencyInjection
} }
services.AddSingleton(s => createSdk()); services.AddSingleton(s => createSdk());
AddOpenTelemetrySdkCore(services); AddOpenTelemetryInternal(services);
return services;
}
/// <summary>
/// Adds OpenTelemetry services to the specified <see cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="createFactory">A delegate that provides the factory to be registered.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Func<IServiceProvider, TracerFactoryBase> createFactory)
{
if (services is null)
{
throw new ArgumentNullException(nameof(services));
}
if (createFactory is null)
{
throw new ArgumentNullException(nameof(createFactory));
}
services.AddSingleton<TracerFactoryBase>(s => createFactory(s));
AddOpenTelemetryCore(services);
return services; return services;
} }
@ -180,7 +92,7 @@ namespace Microsoft.Extensions.DependencyInjection
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param> /// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="createSdk">A delegate that provides the factory to be registered.</param> /// <param name="createSdk">A delegate that provides the factory to be registered.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns> /// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection AddOpenTelemetrySdk(this IServiceCollection services, Func<IServiceProvider, OpenTelemetrySdk> createSdk) public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Func<IServiceProvider, OpenTelemetrySdk> createSdk)
{ {
if (services is null) if (services is null)
{ {
@ -193,17 +105,12 @@ namespace Microsoft.Extensions.DependencyInjection
} }
services.AddSingleton(s => createSdk(s)); services.AddSingleton(s => createSdk(s));
AddOpenTelemetrySdkCore(services); AddOpenTelemetryInternal(services);
return services; return services;
} }
private static void AddOpenTelemetryCore(IServiceCollection services) private static void AddOpenTelemetryInternal(IServiceCollection services)
{
services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, TelemetryFactoryHostedService>());
}
private static void AddOpenTelemetrySdkCore(IServiceCollection services)
{ {
services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, TelemetryHostedService>()); services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, TelemetryHostedService>());
} }

View File

@ -102,7 +102,7 @@ namespace OpenTelemetry.Trace.Configuration
} }
/// <summary> /// <summary>
/// Adds auto-instrumentations for spans. /// Adds auto-instrumentations for activity.
/// </summary> /// </summary>
/// <typeparam name="TInstrumentation">Type of instrumentation class.</typeparam> /// <typeparam name="TInstrumentation">Type of instrumentation class.</typeparam>
/// <param name="instrumentationFactory">Function that builds instrumentation.</param> /// <param name="instrumentationFactory">Function that builds instrumentation.</param>

View File

@ -1,4 +1,4 @@
// <copyright file="HostingIntergrationOpenTelemetrySdkTests.cs" company="OpenTelemetry Authors"> // <copyright file="HostingExtensionsTests.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors // Copyright The OpenTelemetry Authors
// //
// Licensed under the Apache License, Version 2.0 (the "License"); // Licensed under the Apache License, Version 2.0 (the "License");
@ -23,17 +23,17 @@ using Xunit;
namespace OpenTelemetry.Extensions.Hosting namespace OpenTelemetry.Extensions.Hosting
{ {
public class HostingIntergrationOpenTelemetrySdkTests public class HostingExtensionsTests
{ {
[Fact] [Fact]
public async Task AddOpenTelemetry_RegisterInstrumentation_InstrumentationCreatedAndDisposed() public async Task AddOpenTelemetryInstrumentationCreationAndDisposal()
{ {
var testInstrumentation = new TestInstrumentation(); var testInstrumentation = new TestInstrumentation();
var callbackRun = false; var callbackRun = false;
var builder = new HostBuilder().ConfigureServices(services => var builder = new HostBuilder().ConfigureServices(services =>
{ {
services.AddOpenTelemetrySdk(builder => services.AddOpenTelemetry(builder =>
{ {
builder.AddInstrumentation((activitySource) => builder.AddInstrumentation((activitySource) =>
{ {
@ -69,7 +69,7 @@ namespace OpenTelemetry.Extensions.Hosting
{ {
var builder = new HostBuilder().ConfigureServices(services => var builder = new HostBuilder().ConfigureServices(services =>
{ {
services.AddOpenTelemetrySdk(); services.AddOpenTelemetry();
}); });
var host = builder.Build(); var host = builder.Build();
@ -87,7 +87,7 @@ namespace OpenTelemetry.Extensions.Hosting
var services = new ServiceCollection(); var services = new ServiceCollection();
services.AddSingleton(testInstrumentation); services.AddSingleton(testInstrumentation);
services.AddOpenTelemetrySdk((provider, builder) => services.AddOpenTelemetry((provider, builder) =>
{ {
builder.AddInstrumentation<TestInstrumentation>((activitySource) => provider.GetRequiredService<TestInstrumentation>()); builder.AddInstrumentation<TestInstrumentation>((activitySource) => provider.GetRequiredService<TestInstrumentation>());
}); });

View File

@ -1,123 +0,0 @@
// <copyright file="HostingIntegrationTests.cs" company="OpenTelemetry Authors">
// 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.
// </copyright>
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<TracerFactoryBase>();
var tracerFactoryBase2 = host.Services.GetRequiredService<TracerFactoryBase>();
Assert.Same(tracerFactoryBase1, tracerFactoryBase2);
var tracerFactory1 = host.Services.GetRequiredService<TracerFactory>();
var tracerFactory2 = host.Services.GetRequiredService<TracerFactory>();
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<TestInstrumentation>(tracer => provider.GetRequiredService<TestInstrumentation>());
});
var serviceProvider = services.BuildServiceProvider();
var tracerFactory = serviceProvider.GetRequiredService<TracerFactory>();
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;
}
}
}
}

View File

@ -56,7 +56,7 @@ namespace OpenTelemetry.Instrumentation.AspNetCore.Tests
builder.ConfigureTestServices((IServiceCollection services) => builder.ConfigureTestServices((IServiceCollection services) =>
{ {
services.AddSingleton<CallbackMiddleware.CallbackMiddlewareImpl>(new TestCallbackMiddlewareImpl()); services.AddSingleton<CallbackMiddleware.CallbackMiddlewareImpl>(new TestCallbackMiddlewareImpl());
services.AddOpenTelemetrySdk((builder) => builder.AddRequestInstrumentation() services.AddOpenTelemetry((builder) => builder.AddRequestInstrumentation()
.AddProcessorPipeline(p => p.AddProcessor(n => spanProcessor.Object))); .AddProcessorPipeline(p => p.AddProcessor(n => spanProcessor.Object)));
})) }))
.CreateClient()) .CreateClient())