Remove TracerFactory from Extensions.Hosting project (#790)
* Removed hosting extensions using tracerfactory * rename * test * comment
This commit is contained in:
parent
0973b3ea0a
commit
bd65fd2132
|
|
@ -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<string>("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<string>("Zipkin:ServiceName");
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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<OpenTelemetrySdk>();
|
||||
|
||||
return Task.CompletedTask;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
/// <summary>
|
||||
|
|
@ -43,24 +42,11 @@ namespace Microsoft.Extensions.DependencyInjection
|
|||
/// 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)
|
||||
public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Action<OpenTelemetryBuilder> configure)
|
||||
{
|
||||
services.AddOpenTelemetrySdk(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<TracerBuilder> configure)
|
||||
{
|
||||
services.AddOpenTelemetry(() => TracerFactory.Create(configure));
|
||||
services.AddSingleton<TracerFactory>(s => (TracerFactory)s.GetRequiredService<TracerFactoryBase>());
|
||||
|
||||
services.AddOpenTelemetry(() => OpenTelemetrySdk.EnableOpenTelemetry(configure));
|
||||
return services;
|
||||
}
|
||||
|
||||
|
|
@ -70,59 +56,9 @@ namespace Microsoft.Extensions.DependencyInjection
|
|||
/// <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<OpenTelemetryBuilder> configure)
|
||||
public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Action<IServiceProvider, OpenTelemetryBuilder> configure)
|
||||
{
|
||||
services.AddOpenTelemetrySdk(() => 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<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);
|
||||
|
||||
services.AddOpenTelemetry(s => OpenTelemetrySdk.EnableOpenTelemetry(builder => configure(s, builder)));
|
||||
return services;
|
||||
}
|
||||
|
||||
|
|
@ -132,7 +68,7 @@ namespace Microsoft.Extensions.DependencyInjection
|
|||
/// <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>
|
||||
/// <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)
|
||||
{
|
||||
|
|
@ -145,31 +81,7 @@ namespace Microsoft.Extensions.DependencyInjection
|
|||
}
|
||||
|
||||
services.AddSingleton(s => createSdk());
|
||||
AddOpenTelemetrySdkCore(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);
|
||||
AddOpenTelemetryInternal(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="createSdk">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 AddOpenTelemetrySdk(this IServiceCollection services, Func<IServiceProvider, OpenTelemetrySdk> createSdk)
|
||||
public static IServiceCollection AddOpenTelemetry(this IServiceCollection services, Func<IServiceProvider, OpenTelemetrySdk> 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<IHostedService, TelemetryFactoryHostedService>());
|
||||
}
|
||||
|
||||
private static void AddOpenTelemetrySdkCore(IServiceCollection services)
|
||||
private static void AddOpenTelemetryInternal(IServiceCollection services)
|
||||
{
|
||||
services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, TelemetryHostedService>());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -102,7 +102,7 @@ namespace OpenTelemetry.Trace.Configuration
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds auto-instrumentations for spans.
|
||||
/// Adds auto-instrumentations for activity.
|
||||
/// </summary>
|
||||
/// <typeparam name="TInstrumentation">Type of instrumentation class.</typeparam>
|
||||
/// <param name="instrumentationFactory">Function that builds instrumentation.</param>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// <copyright file="HostingIntergrationOpenTelemetrySdkTests.cs" company="OpenTelemetry Authors">
|
||||
// <copyright file="HostingExtensionsTests.cs" company="OpenTelemetry Authors">
|
||||
// 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<TestInstrumentation>((activitySource) => provider.GetRequiredService<TestInstrumentation>());
|
||||
});
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -56,7 +56,7 @@ namespace OpenTelemetry.Instrumentation.AspNetCore.Tests
|
|||
builder.ConfigureTestServices((IServiceCollection services) =>
|
||||
{
|
||||
services.AddSingleton<CallbackMiddleware.CallbackMiddlewareImpl>(new TestCallbackMiddlewareImpl());
|
||||
services.AddOpenTelemetrySdk((builder) => builder.AddRequestInstrumentation()
|
||||
services.AddOpenTelemetry((builder) => builder.AddRequestInstrumentation()
|
||||
.AddProcessorPipeline(p => p.AddProcessor(n => spanProcessor.Object)));
|
||||
}))
|
||||
.CreateClient())
|
||||
|
|
|
|||
Loading…
Reference in New Issue