From 7c0d4279d618464ecd1192731e6d71e13666bfd1 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 3 Aug 2022 14:12:16 -0700 Subject: [PATCH 01/30] TracerBuilder depedency injection improvements. --- .../TracerProviderBuilderHosting.cs | 33 ++--- .../OpenTelemetryServicesExtensions.cs | 44 +++++- .../Trace/TracerProviderBuilderExtensions.cs | 138 ------------------ .../Trace/TracerProviderBuilderBase.cs | 137 ++++++++++++++--- .../Trace/TracerProviderBuilderExtensions.cs | 125 ++++++++++++++-- .../Trace/TracerProviderBuilderSdk.cs | 3 +- .../Trace/TracerProviderExtensions.cs | 2 + src/OpenTelemetry/Trace/TracerProviderSdk.cs | 18 ++- .../HostingTracerExtensionTests.cs | 13 +- 9 files changed, 300 insertions(+), 213 deletions(-) delete mode 100644 src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs diff --git a/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs b/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs index aa678dfd8ff..09fe80596d3 100644 --- a/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs +++ b/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs @@ -15,48 +15,33 @@ // using System; -using System.Collections.Generic; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; namespace OpenTelemetry.Trace { - /// - /// A with support for deferred initialization using for dependency injection. - /// - internal sealed class TracerProviderBuilderHosting : TracerProviderBuilderBase, IDeferredTracerProviderBuilder + internal sealed class TracerProviderBuilderHosting : TracerProviderBuilderBase { - private readonly List> configurationActions = new(); - public TracerProviderBuilderHosting(IServiceCollection services) + : base(services) { - Guard.ThrowIfNull(services); - - this.Services = services; } - public IServiceCollection Services { get; } - - public TracerProviderBuilder Configure(Action configure) + public void SetServiceProvider(IServiceProvider serviceProvider) { - Guard.ThrowIfNull(configure); + Guard.ThrowIfNull(serviceProvider); - this.configurationActions.Add(configure); - return this; + this.ServiceProvider = serviceProvider; } - public TracerProvider Build(IServiceProvider serviceProvider) + protected override TracerProvider Build() { - Guard.ThrowIfNull(serviceProvider); - - // Note: Not using a foreach loop because additional actions can be - // added during each call. - for (int i = 0; i < this.configurationActions.Count; i++) + if (this.ServiceProvider == null) { - this.configurationActions[i](serviceProvider, this); + throw new NotSupportedException("Build cannot be called directly on TracerProviderBuilder instances created through the AddOpenTelemetryTracing extension."); } - return this.Build(); + return base.Build(); } } } diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index d003c37a769..265ce0c5762 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -38,7 +38,7 @@ public static class OpenTelemetryServicesExtensions /// The so that additional calls can be chained. public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) { - return services.AddOpenTelemetryTracing(builder => { }); + return services.AddOpenTelemetryTracing((builder) => { }); } /// @@ -52,8 +52,10 @@ public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection Guard.ThrowIfNull(configure); var builder = new TracerProviderBuilderHosting(services); + configure(builder); - return services.AddOpenTelemetryTracing(sp => builder.Build(sp)); + + return services.AddOpenTelemetryTracing(builder); } /// @@ -85,12 +87,12 @@ public static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollection /// Adds OpenTelemetry TracerProvider to the specified . /// /// The to add services to. - /// A delegate that provides the tracer provider to be registered. + /// . /// The so that additional calls can be chained. - private static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Func createTracerProvider) + private static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, TracerProviderBuilderHosting builder) { Guard.ThrowIfNull(services); - Guard.ThrowIfNull(createTracerProvider); + Guard.ThrowIfNull(builder); // Accessing Sdk class is just to trigger its static ctor, // which sets default Propagators and default Activity Id format @@ -98,8 +100,38 @@ private static IServiceCollection AddOpenTelemetryTracing(this IServiceCollectio try { + services.AddSingleton(builder); + services.TryAddEnumerable(ServiceDescriptor.Singleton()); - return services.AddSingleton(s => createTracerProvider(s)); + services.TryAddSingleton(sp => + { + TracerProviderBuilderHosting firstBuilder = null; + + var builders = sp.GetServices(); + foreach (var builder in builders) + { + if (firstBuilder == null) + { + firstBuilder = builder; + } + else + { + throw new NotSupportedException("Multiple tracer provider builders cannot be registered with the same service collection."); + } + } + + if (firstBuilder == null) + { + // Note: This should never happen. + throw new InvalidOperationException("Could not resolve TracerProviderBuilder."); + } + + firstBuilder.SetServiceProvider(sp); + + return firstBuilder.Build(); + }); + + return services; } catch (Exception ex) { diff --git a/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs deleted file mode 100644 index ca26671edfa..00000000000 --- a/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs +++ /dev/null @@ -1,138 +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.Diagnostics; -using Microsoft.Extensions.DependencyInjection; - -namespace OpenTelemetry.Trace -{ - /// - /// Contains extension methods for the class. - /// - public static class TracerProviderBuilderExtensions - { - /// - /// Adds instrumentation to the provider. - /// - /// Instrumentation type. - /// . - /// The supplied for chaining. - public static TracerProviderBuilder AddInstrumentation(this TracerProviderBuilder tracerProviderBuilder) - where T : class - { - if (tracerProviderBuilder is TracerProviderBuilderHosting tracerProviderBuilderHosting) - { - tracerProviderBuilderHosting.Configure((sp, builder) => builder - .AddInstrumentation(() => sp.GetRequiredService())); - } - - return tracerProviderBuilder; - } - - /// - /// Adds a processor to the provider. - /// - /// Processor type. - /// . - /// The supplied for chaining. - public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder) - where T : BaseProcessor - { - if (tracerProviderBuilder is TracerProviderBuilderHosting tracerProviderBuilderHosting) - { - tracerProviderBuilderHosting.Configure((sp, builder) => builder - .AddProcessor(sp.GetRequiredService())); - } - - return tracerProviderBuilder; - } - - /// - /// Sets the sampler on the provider. - /// - /// Sampler type. - /// . - /// The supplied for chaining. - public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracerProviderBuilder) - where T : Sampler - { - if (tracerProviderBuilder is TracerProviderBuilderHosting tracerProviderBuilderHosting) - { - tracerProviderBuilderHosting.Configure((sp, builder) => builder - .SetSampler(sp.GetRequiredService())); - } - - return tracerProviderBuilder; - } - - /// - /// Register a callback action to configure the once the application is available. - /// - /// . - /// Configuration callback. - /// The supplied for chaining. - public static TracerProviderBuilder Configure(this TracerProviderBuilder tracerProviderBuilder, Action configure) - { - if (tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) - { - deferredTracerProviderBuilder.Configure(configure); - } - - 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 . - /// - /// . - /// . - /// . - public static TracerProvider Build(this TracerProviderBuilder tracerProviderBuilder, IServiceProvider serviceProvider) - { - if (tracerProviderBuilder is TracerProviderBuilderHosting tracerProviderBuilderHosting) - { - return tracerProviderBuilderHosting.Build(serviceProvider); - } - - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) - { - return tracerProviderBuilderBase.Build(); - } - - return null; - } - } -} diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs index 708c7bc45b1..c327b14d26c 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs @@ -14,9 +14,12 @@ // limitations under the License. // +#nullable enable + using System; using System.Collections.Generic; using System.Diagnostics; +using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; using OpenTelemetry.Resources; @@ -25,33 +28,35 @@ namespace OpenTelemetry.Trace /// /// Build TracerProvider with Resource, Sampler, Processors and Instrumentation. /// - public abstract class TracerProviderBuilderBase : TracerProviderBuilder + public abstract class TracerProviderBuilderBase : TracerProviderBuilder, IDeferredTracerProviderBuilder { + internal IServiceCollection? Services; + internal List>? BuilderConfigurationActions = new(); + internal ResourceBuilder? ResourceBuilder; + private readonly List instrumentationFactories = new(); private readonly List> processors = new(); private readonly List sources = new(); private readonly HashSet legacyActivityOperationNames = new(StringComparer.OrdinalIgnoreCase); - private ResourceBuilder resourceBuilder = ResourceBuilder.CreateDefault(); - private Sampler sampler = new ParentBasedSampler(new AlwaysOnSampler()); + private readonly bool ownsServices; + private Sampler? sampler; protected TracerProviderBuilderBase() { + this.Services = new ServiceCollection(); + this.ownsServices = true; } - /// - /// Gets or sets the from which the Resource associated with - /// this provider is built from. Setting this overwrites currently set ResourceBuilder. - /// - internal ResourceBuilder ResourceBuilder + protected TracerProviderBuilderBase(IServiceCollection services) { - get => this.resourceBuilder; - set - { - Guard.ThrowIfNull(value); - this.resourceBuilder = value; - } + Guard.ThrowIfNull(services); + + this.Services = services; + this.ownsServices = false; } + protected IServiceProvider? ServiceProvider { get; set; } + /// public override TracerProviderBuilder AddInstrumentation( Func instrumentationFactory) @@ -95,6 +100,22 @@ public override TracerProviderBuilder AddLegacySource(string operationName) return this; } + TracerProviderBuilder IDeferredTracerProviderBuilder.Configure( + Action configure) + { + Guard.ThrowIfNull(configure); + + var configurationActions = this.BuilderConfigurationActions; + if (configurationActions == null) + { + throw new NotSupportedException("Configuration actions cannot be registered after TracerProvider has been created."); + } + + configurationActions.Add(configure); + + return this; + } + /// /// Sets whether the status of /// should be set to Status.Error when it ended abnormally due to an unhandled exception. @@ -103,7 +124,7 @@ public override TracerProviderBuilder AddLegacySource(string operationName) /// Returns for chaining. internal TracerProviderBuilder SetErrorStatusOnException(bool enabled) { - ExceptionProcessor existingExceptionProcessor = null; + ExceptionProcessor? existingExceptionProcessor = null; if (this.processors.Count > 0) { @@ -146,6 +167,7 @@ internal TracerProviderBuilder SetSampler(Sampler sampler) Guard.ThrowIfNull(sampler); this.sampler = sampler; + return this; } @@ -185,15 +207,92 @@ protected TracerProviderBuilder AddInstrumentation( /// Run the configured actions to initialize the . /// /// . - protected TracerProvider Build() + protected virtual TracerProvider Build() { + var services = this.Services; + + if (services == null) + { + throw new NotSupportedException("TracerProviderBuilder build method cannot be called multiple times."); + } + + this.Services = null; + + var serviceProvider = this.ServiceProvider; + var ownsServiceProvider = false; + + if (serviceProvider == null) + { + if (!this.ownsServices) + { + throw new NotSupportedException("ServiceProvider was not supplied for builder tied to external services."); + } + + serviceProvider = services.BuildServiceProvider(); + ownsServiceProvider = true; + } + else if (this.ownsServices) + { + throw new NotSupportedException("ServiceProvider was supplied for builder tied to internal services."); + } + + this.ResourceBuilder ??= ResourceBuilder.CreateDefault(); + + // Step 1: Look for any Action configuration actions registered and + // execute them. + + var registeredConfigurations = serviceProvider.GetServices>(); + foreach (var registeredConfiguration in registeredConfigurations) + { + registeredConfiguration?.Invoke(serviceProvider, this); + } + + // Step 2: Execute any configuration actions directly attached to + // the builder. + + var configurationActions = this.BuilderConfigurationActions; + if (configurationActions != null) + { + // Note: Not using a foreach loop because additional actions can be + // added during each call. + for (int i = 0; i < configurationActions.Count; i++) + { + configurationActions[i](serviceProvider, this); + } + + this.BuilderConfigurationActions = null; + } + + // Step 3: Look for any samplers registered. + + var registeredSampler = serviceProvider.GetService(); + var sampler = this.sampler; + if (sampler == null) + { + sampler = registeredSampler ?? new ParentBasedSampler(new AlwaysOnSampler()); + } + else if (registeredSampler != null) + { + throw new NotSupportedException("A sampler was registered in application services and set on tracer builder directly."); + } + + // Step 4: Look for any processors registered. + + var registeredProcessors = serviceProvider.GetServices>(); + foreach (var registeredProcessor in registeredProcessors) + { + this.processors.Add(registeredProcessor); + } + return new TracerProviderSdk( - this.resourceBuilder.Build(), + this.ResourceBuilder.Build(), this.sources, this.instrumentationFactories, - this.sampler, + sampler, this.processors, - this.legacyActivityOperationNames); + this.legacyActivityOperationNames, + ownsServiceProvider ? (ServiceProvider)serviceProvider : null); } internal readonly struct InstrumentationFactory diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs index 24f26e98e01..e5850641fe7 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs @@ -14,8 +14,11 @@ // limitations under the License. // +#nullable enable + using System; using System.Diagnostics; +using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; using OpenTelemetry.Resources; @@ -59,6 +62,20 @@ public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracer return tracerProviderBuilder; } + /// + /// Sets the sampler on the provider. + /// + /// Sampler type. + /// . + /// The supplied for chaining. + public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracerProviderBuilder) + where T : Sampler + { + return ConfigureBuilder( + tracerProviderBuilder, + (sp, builder) => builder.SetSampler(sp.GetRequiredService())); + } + /// /// Sets the from which the Resource associated with /// this provider is built from. Overwrites currently set ResourceBuilder. @@ -87,15 +104,20 @@ public static TracerProviderBuilder SetResourceBuilder(this TracerProviderBuilde /// Returns for chaining. public static TracerProviderBuilder ConfigureResource(this TracerProviderBuilder tracerProviderBuilder, Action configure) { - Guard.ThrowIfNull(tracerProviderBuilder, nameof(tracerProviderBuilder)); - Guard.ThrowIfNull(configure, nameof(configure)); + Guard.ThrowIfNull(configure); - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + return tracerProviderBuilder.ConfigureBuilder((sp, b) => { - configure(tracerProviderBuilderBase.ResourceBuilder); - } + // Note: ConfigureResource is deferred until the build phase. + // This allows them to play nice and apply on top of any + // SetResourceBuilder calls. + if (b is TracerProviderBuilderBase tracerProviderBuilderBase) + { + Debug.Assert(tracerProviderBuilderBase.ResourceBuilder != null, "ResourceBuilder was null"); - return tracerProviderBuilder; + configure(tracerProviderBuilderBase.ResourceBuilder!); + } + }); } /// @@ -115,20 +137,97 @@ public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder trac } /// - /// Run the given actions to initialize the . + /// Adds a processor to the provider which will be retrieved using dependency injection. /// + /// Processor type. + /// TracerProviderBuilder instance. + /// The supplied for chaining. + public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder) + where T : BaseProcessor + { + return ConfigureBuilder( + tracerProviderBuilder, + (sp, provider) => provider.AddProcessor(sp.GetRequiredService())); + } + + /// + /// Adds instrumentation to the provider. + /// + /// Instrumentation type. /// . - /// . - public static TracerProvider Build(this TracerProviderBuilder tracerProviderBuilder) + /// The supplied for chaining. + public static TracerProviderBuilder AddInstrumentation(this TracerProviderBuilder tracerProviderBuilder) + where T : class + { + return ConfigureBuilder( + tracerProviderBuilder, + (sp, builder) => builder.AddInstrumentation(() => sp.GetRequiredService())); + } + + /// + /// Register a callback action to configure the where tracing services are configured. + /// + /// + /// Note: Tracing services are only available during the application + /// configuration phase. + /// + /// . + /// Configuration callback. + /// The supplied for chaining. + public static TracerProviderBuilder ConfigureServices( + this TracerProviderBuilder tracerProviderBuilder, + Action configure) { - if (tracerProviderBuilder is IDeferredTracerProviderBuilder) + Guard.ThrowIfNull(configure); + + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + var services = tracerProviderBuilderBase.Services; + + if (services == null) + { + throw new NotSupportedException("Services cannot be configured outside of application configuration phase."); + } + + configure(services); + } + + return tracerProviderBuilder; + } + + /// + /// Register a callback action to configure the once the application is available. + /// + /// . + /// Configuration callback. + /// The supplied for chaining. + public static TracerProviderBuilder ConfigureBuilder( + this TracerProviderBuilder tracerProviderBuilder, + Action configure) + { + Guard.ThrowIfNull(configure); + + if (tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) { - throw new NotSupportedException($"'{nameof(TracerProviderBuilder)}' requires a '{nameof(IServiceProvider)}' to build"); + deferredTracerProviderBuilder.Configure(configure); } - if (tracerProviderBuilder is TracerProviderBuilderSdk tracerProviderBuilderSdk) + return tracerProviderBuilder; + } + + /// + /// Run the given actions to initialize the . + /// + /// . + /// . + public static TracerProvider? Build(this TracerProviderBuilder tracerProviderBuilder) + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) { - return tracerProviderBuilderSdk.BuildSdk(); + return tracerProviderBuilderBase.Build(); } return null; diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderSdk.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderSdk.cs index ba9291e5851..b92cdf3f5bf 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Trace/TracerProviderBuilderSdk.cs @@ -14,10 +14,11 @@ // limitations under the License. // +#nullable enable + namespace OpenTelemetry.Trace { internal sealed class TracerProviderBuilderSdk : TracerProviderBuilderBase { - internal TracerProvider BuildSdk() => this.Build(); } } diff --git a/src/OpenTelemetry/Trace/TracerProviderExtensions.cs b/src/OpenTelemetry/Trace/TracerProviderExtensions.cs index 44016245f7d..38e9d65c090 100644 --- a/src/OpenTelemetry/Trace/TracerProviderExtensions.cs +++ b/src/OpenTelemetry/Trace/TracerProviderExtensions.cs @@ -14,6 +14,8 @@ // limitations under the License. // +#nullable enable + using System; using System.Diagnostics; using System.Threading; diff --git a/src/OpenTelemetry/Trace/TracerProviderSdk.cs b/src/OpenTelemetry/Trace/TracerProviderSdk.cs index 88f4e15e2b9..cb75c514834 100644 --- a/src/OpenTelemetry/Trace/TracerProviderSdk.cs +++ b/src/OpenTelemetry/Trace/TracerProviderSdk.cs @@ -14,11 +14,14 @@ // limitations under the License. // +#nullable enable + using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.CompilerServices; +using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; using OpenTelemetry.Resources; @@ -33,7 +36,8 @@ internal sealed class TracerProviderSdk : TracerProvider private readonly Sampler sampler; private readonly Action getRequestedDataAction; private readonly bool supportLegacyActivity; - private BaseProcessor processor; + private readonly ServiceProvider? ownedServiceProvider; + private BaseProcessor? processor; private bool disposed; internal TracerProviderSdk( @@ -42,11 +46,13 @@ internal TracerProviderSdk( IEnumerable instrumentationFactories, Sampler sampler, List> processors, - HashSet legacyActivityOperationNames) + HashSet legacyActivityOperationNames, + ServiceProvider? ownedServiceProvider) { this.Resource = resource; this.sampler = sampler; this.supportLegacyActivity = legacyActivityOperationNames.Count > 0; + this.ownedServiceProvider = ownedServiceProvider; bool legacyActivityWildcardMode = false; var legacyActivityWildcardModeRegex = WildcardHelper.GetWildcardRegex(); @@ -77,7 +83,7 @@ internal TracerProviderSdk( if (this.supportLegacyActivity) { - Func legacyActivityPredicate = null; + Func? legacyActivityPredicate = null; if (legacyActivityWildcardMode) { legacyActivityPredicate = activity => legacyActivityWildcardModeRegex.IsMatch(activity.OperationName); @@ -100,7 +106,7 @@ internal TracerProviderSdk( // unless suppressed. if (!Sdk.SuppressInstrumentation) { - this.getRequestedDataAction(activity); + this.getRequestedDataAction!(activity); } else { @@ -257,7 +263,7 @@ internal TracerProviderSdk( internal List Instrumentations => this.instrumentations; - internal BaseProcessor Processor => this.processor; + internal BaseProcessor? Processor => this.processor; internal Sampler Sampler => this.sampler; @@ -355,6 +361,8 @@ protected override void Dispose(bool disposing) // Redis instrumentation, for example, flushes during dispose which creates Activity objects for any profiling // sessions that were open. this.listener?.Dispose(); + + this.ownedServiceProvider?.Dispose(); } this.disposed = true; diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs index b897dd42098..ef0b2d0be44 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs @@ -91,7 +91,7 @@ public void AddOpenTelemetryTracerProvider_ServiceProviderArgument_ServicesRegis services.AddSingleton(testInstrumentation); services.AddOpenTelemetryTracing(builder => { - builder.Configure( + builder.ConfigureBuilder( (sp, b) => b.AddInstrumentation(() => sp.GetRequiredService())); }); @@ -115,7 +115,7 @@ public void AddOpenTelemetryTracerProvider_BadArgs_NullServiceCollection() Assert.Throws(() => services.AddOpenTelemetryTracing(builder => { - builder.Configure( + builder.ConfigureBuilder( (sp, b) => b.AddInstrumentation(() => sp.GetRequiredService())); })); } @@ -139,10 +139,10 @@ public void AddOpenTelemetryTracerProvider_NestedConfigureCallbacks() int configureCalls = 0; var services = new ServiceCollection(); services.AddOpenTelemetryTracing(builder => builder - .Configure((sp1, builder1) => + .ConfigureBuilder((sp1, builder1) => { configureCalls++; - builder1.Configure((sp2, builder2) => + builder1.ConfigureBuilder((sp2, builder2) => { configureCalls++; }); @@ -165,7 +165,7 @@ public void AddOpenTelemetryTracerProvider_ConfigureCallbacksUsingExtensions() services.AddSingleton(); services.AddOpenTelemetryTracing(builder => builder - .Configure((sp1, builder1) => + .ConfigureBuilder((sp1, builder1) => { builder1 .AddInstrumentation() @@ -214,8 +214,7 @@ public void AddOpenTelemetryTracerProvider_Idempotent() private static TracerProviderBuilder AddMyFeature(TracerProviderBuilder tracerProviderBuilder) { - (tracerProviderBuilder.GetServices() ?? throw new NotSupportedException("MyFeature requires a hosting TracerProviderBuilder instance.")) - .AddSingleton(); + tracerProviderBuilder.ConfigureServices(services => services.AddSingleton()); return tracerProviderBuilder.SetSampler(); } From 4c01825b87bd65e3d5ca0533c67917c01708611e Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 3 Aug 2022 14:56:02 -0700 Subject: [PATCH 02/30] Fixes and API updates. --- .../netstandard2.0/PublicAPI.Unshipped.txt | 7 ----- .../TracerProviderBuilderHosting.cs | 4 +-- .../.publicApi/net462/PublicAPI.Shipped.txt | 26 +++++++++---------- .../.publicApi/net462/PublicAPI.Unshipped.txt | 11 +++++++- .../.publicApi/net6.0/PublicAPI.Shipped.txt | 26 +++++++++---------- .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 11 +++++++- .../netstandard2.0/PublicAPI.Shipped.txt | 26 +++++++++---------- .../netstandard2.0/PublicAPI.Unshipped.txt | 11 +++++++- .../netstandard2.1/PublicAPI.Shipped.txt | 26 +++++++++---------- .../netstandard2.1/PublicAPI.Unshipped.txt | 11 +++++++- .../Trace/TracerProviderBuilderBase.cs | 16 +++++++++++- .../Trace/TracerProviderBuilderExtensions.cs | 2 +- 12 files changed, 110 insertions(+), 67 deletions(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 67477b7fba6..066b671ddd1 100644 --- a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,6 +1,5 @@ Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions OpenTelemetry.Metrics.MeterProviderBuilderExtensions -OpenTelemetry.Trace.TracerProviderBuilderExtensions static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection @@ -10,9 +9,3 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this Op static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.Build(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.IServiceProvider serviceProvider) -> OpenTelemetry.Metrics.MeterProvider static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.Configure(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.GetServices(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder -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/Implementation/TracerProviderBuilderHosting.cs b/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs index 09fe80596d3..d26814838fb 100644 --- a/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs +++ b/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs @@ -34,14 +34,14 @@ public void SetServiceProvider(IServiceProvider serviceProvider) this.ServiceProvider = serviceProvider; } - protected override TracerProvider Build() + protected override TracerProvider OnBuild() { if (this.ServiceProvider == null) { throw new NotSupportedException("Build cannot be called directly on TracerProviderBuilder instances created through the AddOpenTelemetryTracing extension."); } - return base.Build(); + return base.OnBuild(); } } } diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Shipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Shipped.txt index afa4f5a68a7..dce32c64dfc 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Shipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Shipped.txt @@ -58,8 +58,8 @@ OpenTelemetry.SimpleExportProcessor.SimpleExportProcessor(OpenTelemetry.BaseE ~OpenTelemetry.Trace.SamplingParameters.Tags.get -> System.Collections.Generic.IEnumerable> ~OpenTelemetry.Trace.SamplingResult.Attributes.get -> System.Collections.Generic.IEnumerable> ~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable> attributes) -> void -~OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder -~OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider +OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string! instrumentationName, string! instrumentationVersion, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider! override OpenTelemetry.BaseExportProcessor.OnEnd(T! data) -> void ~override OpenTelemetry.BatchActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void override OpenTelemetry.BatchExportProcessor.OnExport(T! data) -> void @@ -68,9 +68,9 @@ override OpenTelemetry.BatchExportProcessor.OnExport(T! data) -> void ~override OpenTelemetry.SimpleActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void override OpenTelemetry.SimpleExportProcessor.OnExport(T! data) -> void ~override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string operationName) -> OpenTelemetry.Trace.TracerProviderBuilder -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string[] names) -> OpenTelemetry.Trace.TracerProviderBuilder +~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! override sealed OpenTelemetry.BaseExportProcessor.OnStart(T! data) -> void readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExporter! ~readonly OpenTelemetry.Metrics.BaseExportingMetricReader.exporter -> OpenTelemetry.BaseExporter @@ -98,14 +98,14 @@ readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExpo ~static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder ~static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator textMapPropagator) -> void ~static OpenTelemetry.SuppressInstrumentationScope.Begin(bool value = true) -> System.IDisposable -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor processor) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor processor) -> OpenTelemetry.Trace.TracerProvider -~static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool -~static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider? +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.Sampler! sampler) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider! provider, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Trace.TracerProvider! +static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool +static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions OpenTelemetry.BaseExporter.BaseExporter() -> void diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index 791e1c4f84a..9f9430bcb49 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -12,9 +12,18 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider(System.Action! configure) -> void OpenTelemetry.Logs.OpenTelemetryLoggerOptions.ConfigureResource(System.Action! configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? +OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void +OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.Action configure) -> OpenTelemetry.Trace.TracerProviderBuilder +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Shipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Shipped.txt index afa4f5a68a7..dce32c64dfc 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Shipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Shipped.txt @@ -58,8 +58,8 @@ OpenTelemetry.SimpleExportProcessor.SimpleExportProcessor(OpenTelemetry.BaseE ~OpenTelemetry.Trace.SamplingParameters.Tags.get -> System.Collections.Generic.IEnumerable> ~OpenTelemetry.Trace.SamplingResult.Attributes.get -> System.Collections.Generic.IEnumerable> ~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable> attributes) -> void -~OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder -~OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider +OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string! instrumentationName, string! instrumentationVersion, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider! override OpenTelemetry.BaseExportProcessor.OnEnd(T! data) -> void ~override OpenTelemetry.BatchActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void override OpenTelemetry.BatchExportProcessor.OnExport(T! data) -> void @@ -68,9 +68,9 @@ override OpenTelemetry.BatchExportProcessor.OnExport(T! data) -> void ~override OpenTelemetry.SimpleActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void override OpenTelemetry.SimpleExportProcessor.OnExport(T! data) -> void ~override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string operationName) -> OpenTelemetry.Trace.TracerProviderBuilder -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string[] names) -> OpenTelemetry.Trace.TracerProviderBuilder +~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! override sealed OpenTelemetry.BaseExportProcessor.OnStart(T! data) -> void readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExporter! ~readonly OpenTelemetry.Metrics.BaseExportingMetricReader.exporter -> OpenTelemetry.BaseExporter @@ -98,14 +98,14 @@ readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExpo ~static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder ~static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator textMapPropagator) -> void ~static OpenTelemetry.SuppressInstrumentationScope.Begin(bool value = true) -> System.IDisposable -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor processor) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor processor) -> OpenTelemetry.Trace.TracerProvider -~static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool -~static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider? +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.Sampler! sampler) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider! provider, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Trace.TracerProvider! +static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool +static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions OpenTelemetry.BaseExporter.BaseExporter() -> void diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index a045a0ffba5..71100ff45e8 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -12,9 +12,18 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMillisecond OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider(System.Action! configure) -> void *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? +OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void +OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.Action configure) -> OpenTelemetry.Trace.TracerProviderBuilder +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Shipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Shipped.txt index afa4f5a68a7..dce32c64dfc 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Shipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Shipped.txt @@ -58,8 +58,8 @@ OpenTelemetry.SimpleExportProcessor.SimpleExportProcessor(OpenTelemetry.BaseE ~OpenTelemetry.Trace.SamplingParameters.Tags.get -> System.Collections.Generic.IEnumerable> ~OpenTelemetry.Trace.SamplingResult.Attributes.get -> System.Collections.Generic.IEnumerable> ~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable> attributes) -> void -~OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder -~OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider +OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string! instrumentationName, string! instrumentationVersion, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider! override OpenTelemetry.BaseExportProcessor.OnEnd(T! data) -> void ~override OpenTelemetry.BatchActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void override OpenTelemetry.BatchExportProcessor.OnExport(T! data) -> void @@ -68,9 +68,9 @@ override OpenTelemetry.BatchExportProcessor.OnExport(T! data) -> void ~override OpenTelemetry.SimpleActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void override OpenTelemetry.SimpleExportProcessor.OnExport(T! data) -> void ~override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string operationName) -> OpenTelemetry.Trace.TracerProviderBuilder -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string[] names) -> OpenTelemetry.Trace.TracerProviderBuilder +~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! override sealed OpenTelemetry.BaseExportProcessor.OnStart(T! data) -> void readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExporter! ~readonly OpenTelemetry.Metrics.BaseExportingMetricReader.exporter -> OpenTelemetry.BaseExporter @@ -98,14 +98,14 @@ readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExpo ~static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder ~static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator textMapPropagator) -> void ~static OpenTelemetry.SuppressInstrumentationScope.Begin(bool value = true) -> System.IDisposable -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor processor) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor processor) -> OpenTelemetry.Trace.TracerProvider -~static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool -~static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider? +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.Sampler! sampler) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider! provider, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Trace.TracerProvider! +static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool +static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions OpenTelemetry.BaseExporter.BaseExporter() -> void diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 791e1c4f84a..9f9430bcb49 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -12,9 +12,18 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider(System.Action! configure) -> void OpenTelemetry.Logs.OpenTelemetryLoggerOptions.ConfigureResource(System.Action! configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? +OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void +OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.Action configure) -> OpenTelemetry.Trace.TracerProviderBuilder +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Shipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Shipped.txt index afa4f5a68a7..dce32c64dfc 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Shipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Shipped.txt @@ -58,8 +58,8 @@ OpenTelemetry.SimpleExportProcessor.SimpleExportProcessor(OpenTelemetry.BaseE ~OpenTelemetry.Trace.SamplingParameters.Tags.get -> System.Collections.Generic.IEnumerable> ~OpenTelemetry.Trace.SamplingResult.Attributes.get -> System.Collections.Generic.IEnumerable> ~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable> attributes) -> void -~OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder -~OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider +OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string! instrumentationName, string! instrumentationVersion, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider! override OpenTelemetry.BaseExportProcessor.OnEnd(T! data) -> void ~override OpenTelemetry.BatchActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void override OpenTelemetry.BatchExportProcessor.OnExport(T! data) -> void @@ -68,9 +68,9 @@ override OpenTelemetry.BatchExportProcessor.OnExport(T! data) -> void ~override OpenTelemetry.SimpleActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void override OpenTelemetry.SimpleExportProcessor.OnExport(T! data) -> void ~override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string operationName) -> OpenTelemetry.Trace.TracerProviderBuilder -~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string[] names) -> OpenTelemetry.Trace.TracerProviderBuilder +~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! override sealed OpenTelemetry.BaseExportProcessor.OnStart(T! data) -> void readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExporter! ~readonly OpenTelemetry.Metrics.BaseExportingMetricReader.exporter -> OpenTelemetry.BaseExporter @@ -98,14 +98,14 @@ readonly OpenTelemetry.BaseExportProcessor.exporter -> OpenTelemetry.BaseExpo ~static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder ~static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator textMapPropagator) -> void ~static OpenTelemetry.SuppressInstrumentationScope.Begin(bool value = true) -> System.IDisposable -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor processor) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder -~static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor processor) -> OpenTelemetry.Trace.TracerProvider -~static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool -~static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider? +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.Sampler! sampler) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider! provider, OpenTelemetry.BaseProcessor! processor) -> OpenTelemetry.Trace.TracerProvider! +static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool +static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions OpenTelemetry.BaseExporter.BaseExporter() -> void diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index a045a0ffba5..71100ff45e8 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -12,9 +12,18 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMillisecond OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider(System.Action! configure) -> void *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? +OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void +OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder -~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.Action configure) -> OpenTelemetry.Trace.TracerProviderBuilder +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs index c327b14d26c..51ee426cdf7 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs @@ -185,6 +185,11 @@ internal TracerProviderBuilder AddProcessor(BaseProcessor processor) return this; } + internal TracerProvider InvokeBuild() + { + return this.Build(); + } + /// /// Adds instrumentation to the provider. /// @@ -207,7 +212,16 @@ protected TracerProviderBuilder AddInstrumentation( /// Run the configured actions to initialize the . /// /// . - protected virtual TracerProvider Build() + protected TracerProvider Build() + { + return this.OnBuild(); + } + + /// + /// Called to run the configured actions to initialize the . + /// + /// . + protected virtual TracerProvider OnBuild() { var services = this.Services; diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs index e5850641fe7..06d1d24e59c 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs @@ -227,7 +227,7 @@ public static TracerProviderBuilder ConfigureBuilder( { if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) { - return tracerProviderBuilderBase.Build(); + return tracerProviderBuilderBase.InvokeBuild(); } return null; From a64ae6bfd3b788483e1c1bb1a761ec553023ca41 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 3 Aug 2022 15:04:41 -0700 Subject: [PATCH 03/30] Update skipped test. --- .../Implementation/TelemetryHostedService.cs | 2 +- .../HostingTracerExtensionTests.cs | 29 +++++-------------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs index 1551667aa86..27db97399e1 100644 --- a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs +++ b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs @@ -24,7 +24,7 @@ namespace OpenTelemetry.Extensions.Hosting.Implementation { - internal class TelemetryHostedService : IHostedService + internal sealed class TelemetryHostedService : IHostedService { private readonly IServiceProvider serviceProvider; diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs index ef0b2d0be44..c1e3310fbf3 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs @@ -182,34 +182,21 @@ public void AddOpenTelemetryTracerProvider_ConfigureCallbacksUsingExtensions() Assert.True(tracerProvider.Sampler is TestSampler); } - [Fact(Skip = "Known limitation. See issue 1215.")] + [Fact] public void AddOpenTelemetryTracerProvider_Idempotent() { - var testInstrumentation1 = new TestInstrumentation(); - var testInstrumentation2 = new TestInstrumentation(); - var services = new ServiceCollection(); - services.AddSingleton(testInstrumentation1); - services.AddOpenTelemetryTracing(builder => - { - builder.AddInstrumentation(() => testInstrumentation1); - }); - services.AddOpenTelemetryTracing(builder => - { - builder.AddInstrumentation(() => testInstrumentation2); - }); + services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSource")); + services.AddOpenTelemetryTracing(); - var serviceProvider = services.BuildServiceProvider(); + using var serviceProvider = services.BuildServiceProvider(); - var tracerFactory = serviceProvider.GetRequiredService(); - Assert.NotNull(tracerFactory); + var builders = serviceProvider.GetServices(); - Assert.False(testInstrumentation1.Disposed); - Assert.False(testInstrumentation2.Disposed); - serviceProvider.Dispose(); - Assert.True(testInstrumentation1.Disposed); - Assert.True(testInstrumentation2.Disposed); + Assert.Equal(2, builders.Count()); + + Assert.Throws(() => serviceProvider.GetRequiredService()); } private static TracerProviderBuilder AddMyFeature(TracerProviderBuilder tracerProviderBuilder) From 816736e8bc42d5c78c8099ec2e066ec956333ced Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 3 Aug 2022 15:17:40 -0700 Subject: [PATCH 04/30] Tweak. --- .../OpenTelemetryServicesExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index 265ce0c5762..2572c063a2c 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -116,7 +116,7 @@ private static IServiceCollection AddOpenTelemetryTracing(this IServiceCollectio } else { - throw new NotSupportedException("Multiple tracer provider builders cannot be registered with the same service collection."); + throw new NotSupportedException("Multiple tracer provider builders cannot be registered in the same service collection."); } } From ae8a8569c86d02858904a2d128517d706f14cc31 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 3 Aug 2022 15:28:45 -0700 Subject: [PATCH 05/30] Tweaks. --- .../OpenTelemetryServicesExtensions.cs | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index 2572c063a2c..6140955b01f 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -38,7 +38,7 @@ public static class OpenTelemetryServicesExtensions /// The so that additional calls can be chained. public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) { - return services.AddOpenTelemetryTracing((builder) => { }); + return services.AddOpenTelemetryTracing(builder: null, configure: null); } /// @@ -51,11 +51,7 @@ public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection { Guard.ThrowIfNull(configure); - var builder = new TracerProviderBuilderHosting(services); - - configure(builder); - - return services.AddOpenTelemetryTracing(builder); + return services.AddOpenTelemetryTracing(new TracerProviderBuilderHosting(services), configure); } /// @@ -89,19 +85,25 @@ public static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollection /// The to add services to. /// . /// The so that additional calls can be chained. - private static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, TracerProviderBuilderHosting builder) + private static IServiceCollection AddOpenTelemetryTracing( + this IServiceCollection services, + TracerProviderBuilderHosting builder, + Action configure) { Guard.ThrowIfNull(services); - Guard.ThrowIfNull(builder); // Accessing Sdk class is just to trigger its static ctor, // which sets default Propagators and default Activity Id format _ = Sdk.SuppressInstrumentation; - try + if (builder != null) { + configure?.Invoke(builder); services.AddSingleton(builder); + } + try + { services.TryAddEnumerable(ServiceDescriptor.Singleton()); services.TryAddSingleton(sp => { @@ -122,8 +124,7 @@ private static IServiceCollection AddOpenTelemetryTracing(this IServiceCollectio if (firstBuilder == null) { - // Note: This should never happen. - throw new InvalidOperationException("Could not resolve TracerProviderBuilder."); + firstBuilder = new TracerProviderBuilderHosting(services); } firstBuilder.SetServiceProvider(sp); From 96e29c2109ecaa034f692f48bc7015ed304dd949 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 4 Aug 2022 10:22:33 -0700 Subject: [PATCH 06/30] Test fix. --- .../HostingTracerExtensionTests.cs | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs index c1e3310fbf3..e70b0d8aba7 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs @@ -183,12 +183,33 @@ public void AddOpenTelemetryTracerProvider_ConfigureCallbacksUsingExtensions() } [Fact] - public void AddOpenTelemetryTracerProvider_Idempotent() + public void AddOpenTelemetryTracing_SingleBuilderAllowed() { var services = new ServiceCollection(); - services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSource")); + services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSourceBuilder1")); services.AddOpenTelemetryTracing(); + services.AddOpenTelemetryTracing(); + services.AddOpenTelemetryTracing(); + + using var serviceProvider = services.BuildServiceProvider(); + + var builders = serviceProvider.GetServices(); + + Assert.Single(builders); + + var provider = serviceProvider.GetRequiredService(); + + Assert.NotNull(provider); + } + + [Fact] + public void AddOpenTelemetryTracing_MultipleBuildersThrowsNotSupported() + { + var services = new ServiceCollection(); + + services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSourceBuilder1")); + services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSourceBuilder2")); using var serviceProvider = services.BuildServiceProvider(); From bb17782a56d21fe5220e6750544dac52066180f3 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 4 Aug 2022 12:17:30 -0700 Subject: [PATCH 07/30] Turn on options in TracerProviderBuilderBase. --- src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs index 51ee426cdf7..bd7d6a933a3 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs @@ -43,7 +43,11 @@ public abstract class TracerProviderBuilderBase : TracerProviderBuilder, IDeferr protected TracerProviderBuilderBase() { - this.Services = new ServiceCollection(); + var services = new ServiceCollection(); + + services.AddOptions(); + + this.Services = services; this.ownsServices = true; } From ed11c2b48189fabce88146065bbf3854ae52a304 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 4 Aug 2022 14:36:54 -0700 Subject: [PATCH 08/30] Updated CHANGELOGs. --- src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md | 4 ++++ src/OpenTelemetry/CHANGELOG.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md index 76d47d93281..957bfd30744 100644 --- a/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md +++ b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +* Moved some of the dependency injection support when configuring + `TracerProvider` into the SDK + ([#3533](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3533)) + ## 1.0.0-rc9.5 Released 2022-Aug-02 diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 0d17ce51aac..fb59909808f 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +* Added support for dependency injection scenarios when configuring + `TracerProvider` + ([#3533](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3533)) + ## 1.4.0-alpha.1 Released 2022-Aug-02 From dcfb85ae8635e936d7435a65a41c4c738010db37 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 4 Aug 2022 15:14:00 -0700 Subject: [PATCH 09/30] Added XML comments to AddOpenTelemetryTracing methods. --- .../OpenTelemetryServicesExtensions.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index 6140955b01f..af136bcf083 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -34,6 +34,11 @@ public static class OpenTelemetryServicesExtensions /// /// Adds OpenTelemetry TracerProvider to the specified . /// + /// + /// Note: This is safe to be called more than once and should be used by + /// library authors to ensure at least one + /// is registered. + /// /// The to add services to. /// The so that additional calls can be chained. public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) @@ -44,6 +49,11 @@ public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection /// /// Adds OpenTelemetry TracerProvider to the specified . /// + /// + /// Note: This is should only be called once during application + /// bootstrap for a given . This should + /// not be used by library authors. + /// /// The to add services to. /// Callback action to configure the . /// The so that additional calls can be chained. From a1ea05dc64bc69eb49e6eedfb6785033a1b261be Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 5 Aug 2022 11:12:42 -0700 Subject: [PATCH 10/30] Tweaks. --- .../Trace/TracerProviderBuilderBase.cs | 15 +++++++++++---- .../Trace/TracerProviderBuilderExtensions.cs | 19 +++++++++++++------ 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs index bd7d6a933a3..59269576725 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs @@ -19,6 +19,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; using OpenTelemetry.Resources; @@ -284,15 +285,21 @@ protected virtual TracerProvider OnBuild() // Step 3: Look for any samplers registered. - var registeredSampler = serviceProvider.GetService(); + var registeredSamplers = serviceProvider.GetServices(); + int registeredSamplerCount = registeredSamplers.Count(); + if (registeredSamplerCount > 1) + { + throw new NotSupportedException("Multiple samplers registered in application services is not supported."); + } + var sampler = this.sampler; if (sampler == null) { - sampler = registeredSampler ?? new ParentBasedSampler(new AlwaysOnSampler()); + sampler = registeredSamplers.First() ?? new ParentBasedSampler(new AlwaysOnSampler()); } - else if (registeredSampler != null) + else if (registeredSamplerCount > 0) { - throw new NotSupportedException("A sampler was registered in application services and set on tracer builder directly."); + throw new NotSupportedException("Setting sampler directly on tracer builder and through application services is not supported."); } // Step 4: Look for any processors registered. diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs index 06d1d24e59c..97bdbf11bc4 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs @@ -19,6 +19,7 @@ using System; using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using OpenTelemetry.Internal; using OpenTelemetry.Resources; @@ -65,15 +66,18 @@ public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracer /// /// Sets the sampler on the provider. /// + /// + /// Note: The type specified by will be + /// registered as a singleton service into application services. + /// /// Sampler type. /// . /// The supplied for chaining. public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracerProviderBuilder) where T : Sampler { - return ConfigureBuilder( - tracerProviderBuilder, - (sp, builder) => builder.SetSampler(sp.GetRequiredService())); + return tracerProviderBuilder + .ConfigureServices(services => services.TryAddSingleton()); } /// @@ -139,15 +143,18 @@ public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder trac /// /// Adds a processor to the provider which will be retrieved using dependency injection. /// + /// + /// Note: The type specified by will be + /// registered as a singleton service into application services. + /// /// Processor type. /// TracerProviderBuilder instance. /// The supplied for chaining. public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder) where T : BaseProcessor { - return ConfigureBuilder( - tracerProviderBuilder, - (sp, provider) => provider.AddProcessor(sp.GetRequiredService())); + return tracerProviderBuilder + .ConfigureServices(services => services.TryAddSingleton, T>()); } /// From e02a95143b061e15eb18408cce34584c6c6532f0 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Sat, 6 Aug 2022 10:01:22 -0700 Subject: [PATCH 11/30] Added export helpers and restored removed API from hosting library so that there is no breakage during upgrades. --- .../.publicApi/net462/PublicAPI.Unshipped.txt | 12 ++ .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 12 ++ .../netstandard2.0/PublicAPI.Unshipped.txt | 12 ++ .../netstandard2.1/PublicAPI.Unshipped.txt | 12 ++ src/OpenTelemetry/ExportProcessorOptions.cs | 80 ++++++++++++ .../Trace/TracerProviderBuilderExtensions.cs | 123 +++++++++++++++++- 6 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 src/OpenTelemetry/ExportProcessorOptions.cs diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index e3a5ec94b89..57e34cfb5a0 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -1,3 +1,7 @@ +OpenTelemetry.ExportProcessorOptions +OpenTelemetry.ExportProcessorOptions.ExportProcessorOptions() -> void +OpenTelemetry.ExportProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType +OpenTelemetry.ExportProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -26,13 +30,21 @@ static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTeleme static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! +OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.BatchExportProcessorOptions! +OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.set -> void +static OpenTelemetry.ExportProcessorOptions.Batch.get -> OpenTelemetry.ExportProcessorOptions! +static OpenTelemetry.ExportProcessorOptions.Simple.get -> OpenTelemetry.ExportProcessorOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index e3a5ec94b89..57e34cfb5a0 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -1,3 +1,7 @@ +OpenTelemetry.ExportProcessorOptions +OpenTelemetry.ExportProcessorOptions.ExportProcessorOptions() -> void +OpenTelemetry.ExportProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType +OpenTelemetry.ExportProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -26,13 +30,21 @@ static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTeleme static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! +OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.BatchExportProcessorOptions! +OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.set -> void +static OpenTelemetry.ExportProcessorOptions.Batch.get -> OpenTelemetry.ExportProcessorOptions! +static OpenTelemetry.ExportProcessorOptions.Simple.get -> OpenTelemetry.ExportProcessorOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index c9312ae740c..db74a153b6e 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,3 +1,7 @@ +OpenTelemetry.ExportProcessorOptions +OpenTelemetry.ExportProcessorOptions.ExportProcessorOptions() -> void +OpenTelemetry.ExportProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType +OpenTelemetry.ExportProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -26,13 +30,21 @@ static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTeleme static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! +OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.BatchExportProcessorOptions! +OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.set -> void +static OpenTelemetry.ExportProcessorOptions.Batch.get -> OpenTelemetry.ExportProcessorOptions! +static OpenTelemetry.ExportProcessorOptions.Simple.get -> OpenTelemetry.ExportProcessorOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index e3a5ec94b89..57e34cfb5a0 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -1,3 +1,7 @@ +OpenTelemetry.ExportProcessorOptions +OpenTelemetry.ExportProcessorOptions.ExportProcessorOptions() -> void +OpenTelemetry.ExportProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType +OpenTelemetry.ExportProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -26,13 +30,21 @@ static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTeleme static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! +OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.BatchExportProcessorOptions! +OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.set -> void +static OpenTelemetry.ExportProcessorOptions.Batch.get -> OpenTelemetry.ExportProcessorOptions! +static OpenTelemetry.ExportProcessorOptions.Simple.get -> OpenTelemetry.ExportProcessorOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/ExportProcessorOptions.cs b/src/OpenTelemetry/ExportProcessorOptions.cs new file mode 100644 index 00000000000..8e1d970aa25 --- /dev/null +++ b/src/OpenTelemetry/ExportProcessorOptions.cs @@ -0,0 +1,80 @@ +// +// 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. +// + +#nullable enable + +using System; +using System.Diagnostics; +using OpenTelemetry.Internal; + +namespace OpenTelemetry; + +public class ExportProcessorOptions +{ + private readonly bool isReadonly; + private ExportProcessorType exportProcessorType = ExportProcessorType.Batch; + private BatchExportProcessorOptions batchExportProcessorOptions = new(); + + public ExportProcessorOptions() + { + } + + internal ExportProcessorOptions(ExportProcessorType exportProcessorType) + { + this.ExportProcessorType = exportProcessorType; + this.isReadonly = true; + } + + public static ExportProcessorOptions Simple { get; } = new(ExportProcessorType.Simple); + + public static ExportProcessorOptions Batch { get; } = new(ExportProcessorType.Batch); + + /// + /// Gets or sets the export processor type to be used. The default value is . + /// + public ExportProcessorType ExportProcessorType + { + get => this.exportProcessorType; + set + { + if (this.isReadonly) + { + throw new NotSupportedException(); + } + + this.exportProcessorType = value; + } + } + + /// + /// Gets or sets the batch export options. Ignored unless is . + /// + public BatchExportProcessorOptions BatchExportProcessorOptions + { + get => this.batchExportProcessorOptions; + set + { + if (this.isReadonly) + { + throw new NotSupportedException(); + } + + Guard.ThrowIfNull(value); + + this.batchExportProcessorOptions = value; + } + } +} diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs index 97bdbf11bc4..b402f28347b 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs @@ -125,7 +125,7 @@ public static TracerProviderBuilder ConfigureResource(this TracerProviderBuilder } /// - /// Adds processor to the provider. + /// Adds a processor to the provider. /// /// TracerProviderBuilder instance. /// Activity processor to add. @@ -157,6 +157,88 @@ public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder t .ConfigureServices(services => services.TryAddSingleton, T>()); } + /// + /// Adds an exporter to the provider. + /// + /// TracerProviderBuilder instance. + /// . + /// Activity exporter to add. + /// Returns for chaining. + public static TracerProviderBuilder AddExporter( + this TracerProviderBuilder tracerProviderBuilder, + ExportProcessorOptions options, + BaseExporter exporter) + { + Guard.ThrowIfNull(tracerProviderBuilder); + Guard.ThrowIfNull(options); + Guard.ThrowIfNull(exporter); + + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + switch (options.ExportProcessorType) + { + case ExportProcessorType.Simple: + return tracerProviderBuilderBase.AddProcessor(new SimpleActivityExportProcessor(exporter)); + case ExportProcessorType.Batch: + var batchOptions = options.BatchExportProcessorOptions ?? new BatchExportProcessorOptions(); + return tracerProviderBuilderBase.AddProcessor( + new BatchActivityExportProcessor( + exporter, + batchOptions.MaxQueueSize, + batchOptions.ScheduledDelayMilliseconds, + batchOptions.ExporterTimeoutMilliseconds, + batchOptions.MaxExportBatchSize)); + default: + throw new NotSupportedException($"ExportProcessorType '{options.ExportProcessorType}' is not supported."); + } + } + + return tracerProviderBuilder; + } + + /// + /// Adds an exporter to the provider which will be retrieved using dependency injection. + /// + /// + /// Note: The type specified by will be + /// registered as a singleton service into application services. + /// + /// Exporter type. + /// TracerProviderBuilder instance. + /// . + /// The supplied for chaining. + public static TracerProviderBuilder AddExporter( + this TracerProviderBuilder tracerProviderBuilder, + ExportProcessorOptions options) + where T : BaseExporter + { + Guard.ThrowIfNull(options); + + return tracerProviderBuilder + .ConfigureServices(services => + { + services.TryAddSingleton, T>(); + services.TryAddSingleton>(sp => + { + switch (options.ExportProcessorType) + { + case ExportProcessorType.Simple: + return new SimpleActivityExportProcessor(sp.GetRequiredService()); + case ExportProcessorType.Batch: + var batchOptions = options.BatchExportProcessorOptions; + return new BatchActivityExportProcessor( + sp.GetRequiredService(), + batchOptions.MaxQueueSize, + batchOptions.ScheduledDelayMilliseconds, + batchOptions.ExporterTimeoutMilliseconds, + batchOptions.MaxExportBatchSize); + default: + throw new NotSupportedException($"ExportProcessorType '{options.ExportProcessorType}' is not supported."); + } + }); + }); + } + /// /// Adds instrumentation to the provider. /// @@ -203,6 +285,31 @@ public static TracerProviderBuilder ConfigureServices( return tracerProviderBuilder; } + /// + /// Gets the application attached to + /// the . + /// + /// . + /// or + /// if services are unavailable. + [Obsolete("Call ConfigureServices instead this method will be removed in a future version.")] + public static IServiceCollection? GetServices(this TracerProviderBuilder tracerProviderBuilder) + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + var services = tracerProviderBuilderBase.Services; + + if (services == null) + { + throw new NotSupportedException("Services cannot be configured outside of application configuration phase."); + } + + return services; + } + + return null; + } + /// /// Register a callback action to configure the once the application + /// Register a callback action to configure the once the application is available. + /// + /// . + /// Configuration callback. + /// The supplied for chaining. + [Obsolete("Call ConfigureBuilder instead this method will be removed in a future version.")] + public static TracerProviderBuilder Configure( + this TracerProviderBuilder tracerProviderBuilder, + Action configure) + => ConfigureBuilder(tracerProviderBuilder, configure); + /// /// Run the given actions to initialize the . /// From d3b0ac67a3ebad407829887f3c621a5f3f58d5d3 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Sat, 6 Aug 2022 11:08:54 -0700 Subject: [PATCH 12/30] Export extension tweaks. --- .../.publicApi/net462/PublicAPI.Unshipped.txt | 20 +-- .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 20 +-- .../netstandard2.0/PublicAPI.Unshipped.txt | 20 +-- .../netstandard2.1/PublicAPI.Unshipped.txt | 20 +-- src/OpenTelemetry/ExportProcessorOptions.cs | 80 ----------- .../Trace/ExportActivityProcessorOptions.cs | 45 +++++++ .../Trace/TracerProviderBuilderExtensions.cs | 127 ++++++++++++------ 7 files changed, 171 insertions(+), 161 deletions(-) delete mode 100644 src/OpenTelemetry/ExportProcessorOptions.cs create mode 100644 src/OpenTelemetry/Trace/ExportActivityProcessorOptions.cs diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index 57e34cfb5a0..eefdf0370a2 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -1,7 +1,3 @@ -OpenTelemetry.ExportProcessorOptions -OpenTelemetry.ExportProcessorOptions.ExportProcessorOptions() -> void -OpenTelemetry.ExportProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType -OpenTelemetry.ExportProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -23,6 +19,12 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.AddProcessor(OpenTelemetry.BasePr OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMilliseconds = -1) -> bool OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! +OpenTelemetry.Trace.ExportActivityProcessorOptions +OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.Trace.BatchExportActivityProcessorOptions! +OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.set -> void +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void @@ -30,8 +32,10 @@ static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTeleme static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter! exporter, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! @@ -42,9 +46,5 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this Op virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! -OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.BatchExportProcessorOptions! -OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.set -> void -static OpenTelemetry.ExportProcessorOptions.Batch.get -> OpenTelemetry.ExportProcessorOptions! -static OpenTelemetry.ExportProcessorOptions.Simple.get -> OpenTelemetry.ExportProcessorOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index 57e34cfb5a0..eefdf0370a2 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -1,7 +1,3 @@ -OpenTelemetry.ExportProcessorOptions -OpenTelemetry.ExportProcessorOptions.ExportProcessorOptions() -> void -OpenTelemetry.ExportProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType -OpenTelemetry.ExportProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -23,6 +19,12 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.AddProcessor(OpenTelemetry.BasePr OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMilliseconds = -1) -> bool OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! +OpenTelemetry.Trace.ExportActivityProcessorOptions +OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.Trace.BatchExportActivityProcessorOptions! +OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.set -> void +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void @@ -30,8 +32,10 @@ static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTeleme static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter! exporter, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! @@ -42,9 +46,5 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this Op virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! -OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.BatchExportProcessorOptions! -OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.set -> void -static OpenTelemetry.ExportProcessorOptions.Batch.get -> OpenTelemetry.ExportProcessorOptions! -static OpenTelemetry.ExportProcessorOptions.Simple.get -> OpenTelemetry.ExportProcessorOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index db74a153b6e..a74d026c2ee 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,7 +1,3 @@ -OpenTelemetry.ExportProcessorOptions -OpenTelemetry.ExportProcessorOptions.ExportProcessorOptions() -> void -OpenTelemetry.ExportProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType -OpenTelemetry.ExportProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -23,6 +19,12 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMillisecond OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void OpenTelemetry.Logs.OpenTelemetryLoggerOptions.ConfigureResource(System.Action! configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! +OpenTelemetry.Trace.ExportActivityProcessorOptions +OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.Trace.BatchExportActivityProcessorOptions! +OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.set -> void +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void @@ -30,8 +32,10 @@ static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTeleme static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter! exporter, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! @@ -42,9 +46,5 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this Op virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! -OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.BatchExportProcessorOptions! -OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.set -> void -static OpenTelemetry.ExportProcessorOptions.Batch.get -> OpenTelemetry.ExportProcessorOptions! -static OpenTelemetry.ExportProcessorOptions.Simple.get -> OpenTelemetry.ExportProcessorOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index 57e34cfb5a0..eefdf0370a2 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -1,7 +1,3 @@ -OpenTelemetry.ExportProcessorOptions -OpenTelemetry.ExportProcessorOptions.ExportProcessorOptions() -> void -OpenTelemetry.ExportProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType -OpenTelemetry.ExportProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -23,6 +19,12 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.AddProcessor(OpenTelemetry.BasePr OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMilliseconds = -1) -> bool OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! +OpenTelemetry.Trace.ExportActivityProcessorOptions +OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.Trace.BatchExportActivityProcessorOptions! +OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.set -> void +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType +OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void @@ -30,8 +32,10 @@ static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTeleme static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorOptions! options) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter! exporter, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! @@ -42,9 +46,5 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this Op virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! -OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.BatchExportProcessorOptions! -OpenTelemetry.ExportProcessorOptions.BatchExportProcessorOptions.set -> void -static OpenTelemetry.ExportProcessorOptions.Batch.get -> OpenTelemetry.ExportProcessorOptions! -static OpenTelemetry.ExportProcessorOptions.Simple.get -> OpenTelemetry.ExportProcessorOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/ExportProcessorOptions.cs b/src/OpenTelemetry/ExportProcessorOptions.cs deleted file mode 100644 index 8e1d970aa25..00000000000 --- a/src/OpenTelemetry/ExportProcessorOptions.cs +++ /dev/null @@ -1,80 +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. -// - -#nullable enable - -using System; -using System.Diagnostics; -using OpenTelemetry.Internal; - -namespace OpenTelemetry; - -public class ExportProcessorOptions -{ - private readonly bool isReadonly; - private ExportProcessorType exportProcessorType = ExportProcessorType.Batch; - private BatchExportProcessorOptions batchExportProcessorOptions = new(); - - public ExportProcessorOptions() - { - } - - internal ExportProcessorOptions(ExportProcessorType exportProcessorType) - { - this.ExportProcessorType = exportProcessorType; - this.isReadonly = true; - } - - public static ExportProcessorOptions Simple { get; } = new(ExportProcessorType.Simple); - - public static ExportProcessorOptions Batch { get; } = new(ExportProcessorType.Batch); - - /// - /// Gets or sets the export processor type to be used. The default value is . - /// - public ExportProcessorType ExportProcessorType - { - get => this.exportProcessorType; - set - { - if (this.isReadonly) - { - throw new NotSupportedException(); - } - - this.exportProcessorType = value; - } - } - - /// - /// Gets or sets the batch export options. Ignored unless is . - /// - public BatchExportProcessorOptions BatchExportProcessorOptions - { - get => this.batchExportProcessorOptions; - set - { - if (this.isReadonly) - { - throw new NotSupportedException(); - } - - Guard.ThrowIfNull(value); - - this.batchExportProcessorOptions = value; - } - } -} diff --git a/src/OpenTelemetry/Trace/ExportActivityProcessorOptions.cs b/src/OpenTelemetry/Trace/ExportActivityProcessorOptions.cs new file mode 100644 index 00000000000..450e893e83d --- /dev/null +++ b/src/OpenTelemetry/Trace/ExportActivityProcessorOptions.cs @@ -0,0 +1,45 @@ +// +// 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. +// + +#nullable enable + +using OpenTelemetry.Internal; + +namespace OpenTelemetry.Trace; + +public class ExportActivityProcessorOptions +{ + private BatchExportActivityProcessorOptions? batchExportProcessorOptions; + + /// + /// Gets or sets the export processor type to be used. The default value is . + /// + public ExportProcessorType ExportProcessorType { get; set; } + + /// + /// Gets or sets the batch export options. Ignored unless is . + /// + public BatchExportActivityProcessorOptions BatchExportProcessorOptions + { + get => this.batchExportProcessorOptions ??= new(); + set + { + Guard.ThrowIfNull(value); + + this.batchExportProcessorOptions = value; + } + } +} diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs index b402f28347b..dda1cd8b0e8 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs @@ -20,6 +20,7 @@ using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Options; using OpenTelemetry.Internal; using OpenTelemetry.Resources; @@ -161,39 +162,43 @@ public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder t /// Adds an exporter to the provider. /// /// TracerProviderBuilder instance. - /// . + /// . /// Activity exporter to add. /// Returns for chaining. public static TracerProviderBuilder AddExporter( this TracerProviderBuilder tracerProviderBuilder, - ExportProcessorOptions options, + ExportProcessorType exportProcessorType, BaseExporter exporter) + => AddExporter(tracerProviderBuilder, exportProcessorType, exporter, o => { }); + + /// + /// Adds an exporter to the provider. + /// + /// TracerProviderBuilder instance. + /// . + /// Activity exporter to add. + /// Callback action to configure . Only invoked when is . + /// Returns for chaining. + public static TracerProviderBuilder AddExporter( + this TracerProviderBuilder tracerProviderBuilder, + ExportProcessorType exportProcessorType, + BaseExporter exporter, + Action configure) { - Guard.ThrowIfNull(tracerProviderBuilder); - Guard.ThrowIfNull(options); Guard.ThrowIfNull(exporter); + Guard.ThrowIfNull(configure); - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + return tracerProviderBuilder.ConfigureBuilder((sp, b) => { - switch (options.ExportProcessorType) + if (b is TracerProviderBuilderBase tracerProviderBuilderBase) { - case ExportProcessorType.Simple: - return tracerProviderBuilderBase.AddProcessor(new SimpleActivityExportProcessor(exporter)); - case ExportProcessorType.Batch: - var batchOptions = options.BatchExportProcessorOptions ?? new BatchExportProcessorOptions(); - return tracerProviderBuilderBase.AddProcessor( - new BatchActivityExportProcessor( - exporter, - batchOptions.MaxQueueSize, - batchOptions.ScheduledDelayMilliseconds, - batchOptions.ExporterTimeoutMilliseconds, - batchOptions.MaxExportBatchSize)); - default: - throw new NotSupportedException($"ExportProcessorType '{options.ExportProcessorType}' is not supported."); + tracerProviderBuilderBase.AddProcessor( + BuildExportProcessor(sp, exportProcessorType, exporter, configure)); } - } - - return tracerProviderBuilder; + }); } /// @@ -205,36 +210,44 @@ public static TracerProviderBuilder AddExporter( /// /// Exporter type. /// TracerProviderBuilder instance. - /// . + /// . + /// The supplied for chaining. + public static TracerProviderBuilder AddExporter( + this TracerProviderBuilder tracerProviderBuilder, + ExportProcessorType exportProcessorType) + where T : BaseExporter + => AddExporter(tracerProviderBuilder, exportProcessorType, o => { }); + + /// + /// Adds an exporter to the provider which will be retrieved using dependency injection. + /// + /// + /// Note: The type specified by will be + /// registered as a singleton service into application services. + /// + /// Exporter type. + /// TracerProviderBuilder instance. + /// . + /// Callback action to configure . Only invoked when is . /// The supplied for chaining. public static TracerProviderBuilder AddExporter( this TracerProviderBuilder tracerProviderBuilder, - ExportProcessorOptions options) + ExportProcessorType exportProcessorType, + Action configure) where T : BaseExporter { - Guard.ThrowIfNull(options); + Guard.ThrowIfNull(configure); return tracerProviderBuilder .ConfigureServices(services => { services.TryAddSingleton, T>(); - services.TryAddSingleton>(sp => + services.TryAddSingleton(sp => { - switch (options.ExportProcessorType) - { - case ExportProcessorType.Simple: - return new SimpleActivityExportProcessor(sp.GetRequiredService()); - case ExportProcessorType.Batch: - var batchOptions = options.BatchExportProcessorOptions; - return new BatchActivityExportProcessor( - sp.GetRequiredService(), - batchOptions.MaxQueueSize, - batchOptions.ScheduledDelayMilliseconds, - batchOptions.ExporterTimeoutMilliseconds, - batchOptions.MaxExportBatchSize); - default: - throw new NotSupportedException($"ExportProcessorType '{options.ExportProcessorType}' is not supported."); - } + return BuildExportProcessor(sp, exportProcessorType, sp.GetRequiredService(), configure); }); }); } @@ -360,5 +373,37 @@ public static TracerProviderBuilder Configure( return null; } + + private static BaseProcessor BuildExportProcessor( + IServiceProvider serviceProvider, + ExportProcessorType exportProcessorType, + BaseExporter exporter, + Action? configure = null) + { + switch (exportProcessorType) + { + case ExportProcessorType.Simple: + return new SimpleActivityExportProcessor(exporter); + case ExportProcessorType.Batch: + var options = new ExportActivityProcessorOptions + { + ExportProcessorType = ExportProcessorType.Batch, + BatchExportProcessorOptions = serviceProvider.GetRequiredService>().Value, + }; + + configure?.Invoke(options); + + var batchOptions = options.BatchExportProcessorOptions; + + return new BatchActivityExportProcessor( + exporter, + batchOptions.MaxQueueSize, + batchOptions.ScheduledDelayMilliseconds, + batchOptions.ExporterTimeoutMilliseconds, + batchOptions.MaxExportBatchSize); + default: + throw new NotSupportedException($"ExportProcessorType '{exportProcessorType}' is not supported."); + } + } } } From c0eee21c3193225fbd48249792ddba5e6bdc8b63 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Sat, 6 Aug 2022 11:16:30 -0700 Subject: [PATCH 13/30] Tweak. --- src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs index dda1cd8b0e8..04bc2747d5e 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs @@ -245,10 +245,8 @@ public static TracerProviderBuilder AddExporter( .ConfigureServices(services => { services.TryAddSingleton, T>(); - services.TryAddSingleton(sp => - { - return BuildExportProcessor(sp, exportProcessorType, sp.GetRequiredService(), configure); - }); + services.TryAddSingleton( + sp => BuildExportProcessor(sp, exportProcessorType, sp.GetRequiredService(), configure)); }); } From f3f0e85d3c83215151255f64a4c79dec61e23c20 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Mon, 8 Aug 2022 16:28:41 -0700 Subject: [PATCH 14/30] Tracer builder improvements. --- .../TracerProviderBuilderHosting.cs | 47 --- .../OpenTelemetryServicesExtensions.cs | 117 +++--- .../.publicApi/net462/PublicAPI.Unshipped.txt | 3 - .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 3 - .../netstandard2.0/PublicAPI.Unshipped.txt | 3 - .../netstandard2.1/PublicAPI.Unshipped.txt | 3 - .../Builder/TracerProviderBuilderBase.cs | 353 ++++++++++++++++++ .../TracerProviderBuilderExtensions.cs | 156 +++----- .../{ => Builder}/TracerProviderBuilderSdk.cs | 18 + ...rProviderBuilderServiceCollectionHelper.cs | 79 ++++ .../Builder/TracerProviderBuilderState.cs | 133 +++++++ .../Trace/TracerProviderBuilderBase.cs | 337 ----------------- src/OpenTelemetry/Trace/TracerProviderSdk.cs | 65 ++-- .../Trace/TracerProviderExtensionsTest.cs | 5 +- 14 files changed, 715 insertions(+), 607 deletions(-) delete mode 100644 src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs create mode 100644 src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs rename src/OpenTelemetry/Trace/{ => Builder}/TracerProviderBuilderExtensions.cs (73%) rename src/OpenTelemetry/Trace/{ => Builder}/TracerProviderBuilderSdk.cs (65%) create mode 100644 src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs create mode 100644 src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs delete mode 100644 src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs diff --git a/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs b/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs deleted file mode 100644 index d26814838fb..00000000000 --- a/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs +++ /dev/null @@ -1,47 +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 Microsoft.Extensions.DependencyInjection; -using OpenTelemetry.Internal; - -namespace OpenTelemetry.Trace -{ - internal sealed class TracerProviderBuilderHosting : TracerProviderBuilderBase - { - public TracerProviderBuilderHosting(IServiceCollection services) - : base(services) - { - } - - public void SetServiceProvider(IServiceProvider serviceProvider) - { - Guard.ThrowIfNull(serviceProvider); - - this.ServiceProvider = serviceProvider; - } - - protected override TracerProvider OnBuild() - { - if (this.ServiceProvider == null) - { - throw new NotSupportedException("Build cannot be called directly on TracerProviderBuilder instances created through the AddOpenTelemetryTracing extension."); - } - - return base.OnBuild(); - } - } -} diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index af136bcf083..b5c7af9e603 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -35,33 +35,55 @@ public static class OpenTelemetryServicesExtensions /// Adds OpenTelemetry TracerProvider to the specified . /// /// - /// Note: This is safe to be called more than once and should be used by - /// library authors to ensure at least one - /// is registered. + /// Notes: This is safe to be called multiple times and by library + /// authors. Only a single will be created + /// for a given . /// /// The to add services to. + /// Callback action to configure the . /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) + public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action configure) { - return services.AddOpenTelemetryTracing(builder: null, configure: null); + Guard.ThrowIfNull(services); + Guard.ThrowIfNull(configure); + + var builder = new TracerProviderBuilderHosting(services); + + configure(builder); + + return AddOpenTelemetryTracing(services); } /// /// Adds OpenTelemetry TracerProvider to the specified . /// /// - /// Note: This is should only be called once during application - /// bootstrap for a given . This should - /// not be used by library authors. + /// Notes: This is safe to be called multiple times and by library + /// authors. Only a single will be created + /// for a given . /// /// The to add services to. - /// Callback action to configure the . /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action configure) + public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) { - Guard.ThrowIfNull(configure); + Guard.ThrowIfNull(services); + + // Accessing Sdk class is just to trigger its static ctor, + // which sets default Propagators and default Activity Id format + _ = Sdk.SuppressInstrumentation; + + try + { + services.TryAddEnumerable(ServiceDescriptor.Singleton()); + + return services; + } + catch (Exception ex) + { + HostingExtensionsEventSource.Log.FailedInitialize(ex); + } - return services.AddOpenTelemetryTracing(new TracerProviderBuilderHosting(services), configure); + return services; } /// @@ -89,69 +111,6 @@ public static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollection return services.AddOpenTelemetryMetrics(sp => builder.Build(sp)); } - /// - /// Adds OpenTelemetry TracerProvider to the specified . - /// - /// The to add services to. - /// . - /// The so that additional calls can be chained. - private static IServiceCollection AddOpenTelemetryTracing( - this IServiceCollection services, - TracerProviderBuilderHosting builder, - Action configure) - { - Guard.ThrowIfNull(services); - - // Accessing Sdk class is just to trigger its static ctor, - // which sets default Propagators and default Activity Id format - _ = Sdk.SuppressInstrumentation; - - if (builder != null) - { - configure?.Invoke(builder); - services.AddSingleton(builder); - } - - try - { - services.TryAddEnumerable(ServiceDescriptor.Singleton()); - services.TryAddSingleton(sp => - { - TracerProviderBuilderHosting firstBuilder = null; - - var builders = sp.GetServices(); - foreach (var builder in builders) - { - if (firstBuilder == null) - { - firstBuilder = builder; - } - else - { - throw new NotSupportedException("Multiple tracer provider builders cannot be registered in the same service collection."); - } - } - - if (firstBuilder == null) - { - firstBuilder = new TracerProviderBuilderHosting(services); - } - - firstBuilder.SetServiceProvider(sp); - - return firstBuilder.Build(); - }); - - return services; - } - catch (Exception ex) - { - HostingExtensionsEventSource.Log.FailedInitialize(ex); - } - - return services; - } - /// /// Adds OpenTelemetry MeterProvider to the specified . /// @@ -179,5 +138,13 @@ private static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollectio return services; } + + private sealed class TracerProviderBuilderHosting : TracerProviderBuilderBase + { + public TracerProviderBuilderHosting(IServiceCollection services) + : base(services) + { + } + } } } diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index eefdf0370a2..29ee293f744 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -25,8 +25,6 @@ OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.s OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void -OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? -OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! @@ -43,7 +41,6 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! -virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index eefdf0370a2..29ee293f744 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -25,8 +25,6 @@ OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.s OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void -OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? -OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! @@ -43,7 +41,6 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! -virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index a74d026c2ee..6f483b10271 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -25,8 +25,6 @@ OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.s OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void -OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? -OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! @@ -43,7 +41,6 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! -virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index eefdf0370a2..29ee293f744 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -25,8 +25,6 @@ OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.s OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void -OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.get -> System.IServiceProvider? -OpenTelemetry.Trace.TracerProviderBuilderBase.ServiceProvider.set -> void OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! @@ -43,7 +41,6 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! -virtual OpenTelemetry.Trace.TracerProviderBuilderBase.OnBuild() -> OpenTelemetry.Trace.TracerProvider! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs new file mode 100644 index 00000000000..ee1730d3619 --- /dev/null +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -0,0 +1,353 @@ +// +// 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. +// + +#nullable enable + +using System; +using System.Diagnostics; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Options; +using OpenTelemetry.Internal; +using OpenTelemetry.Resources; + +namespace OpenTelemetry.Trace +{ + /// + /// Contains methods for building instances. + /// + public abstract class TracerProviderBuilderBase : TracerProviderBuilder, IDeferredTracerProviderBuilder + { + private readonly IServiceProvider? serviceProvider; + private readonly TracerProviderBuilderState? state; + private readonly bool ownsServices; + private IServiceCollection? services; + + // This ctor is for a builder created from TracerProviderBuilderState which + // happens after the service provider has been created. + internal TracerProviderBuilderBase( + IServiceProvider serviceProvider, + TracerProviderBuilderState state) + { + Debug.Assert(serviceProvider != null, "serviceProvider was null"); + Debug.Assert(state != null, "state was null"); + + this.serviceProvider = serviceProvider; + this.state = state; + } + + // This ctor is for Sdk.CreateTracerProviderBuilder where the builder + // owns its services and service provider. + protected TracerProviderBuilderBase() + { + var services = new ServiceCollection(); + + services.AddOptions(); + services.TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: true)); + + this.services = services; + this.ownsServices = true; + } + + // This ctor is for hosting scenarios where the builder is bound to an + // external service collection. + protected TracerProviderBuilderBase(IServiceCollection services) + { + Guard.ThrowIfNull(services); + + services.AddOptions(); + services.TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: false)); + + this.services = services; + this.ownsServices = false; + } + + /// + public override TracerProviderBuilder AddInstrumentation( + Func instrumentationFactory) + where TInstrumentation : class + { + Guard.ThrowIfNull(instrumentationFactory); + + return this.AddInstrumentation((sp) => instrumentationFactory()); + } + + /// + public override TracerProviderBuilder AddSource(params string[] names) + { + Guard.ThrowIfNull(names); + + return this.ConfigureState((sp, state) => state.AddSource(names)); + } + + /// + public override TracerProviderBuilder AddLegacySource(string operationName) + { + Guard.ThrowIfNullOrWhitespace(operationName); + + return this.ConfigureState((sp, state) => state.AddLegacySource(operationName)); + } + + /// + TracerProviderBuilder IDeferredTracerProviderBuilder.Configure( + Action configure) + { + Guard.ThrowIfNull(configure); + + if (this.state != null) + { + Debug.Assert(this.serviceProvider != null, "serviceProvider was null"); + + configure(this.serviceProvider!, this); + } + else + { + this.ConfigureServices(services + => TracerProviderBuilderServiceCollectionHelper.RegisterConfigureBuilderCallback(services, configure)); + } + + return this; + } + + internal TracerProviderBuilder AddExporter(ExportProcessorType exportProcessorType, Action configure) + where T : BaseExporter + { + Guard.ThrowIfNull(configure); + + this.TryAddSingleton(); + this.ConfigureState((sp, state) + => state.AddProcessor( + this.BuildExportProcessor(exportProcessorType, sp.GetRequiredService(), configure))); + + return this; + } + + internal TracerProviderBuilder AddExporter(ExportProcessorType exportProcessorType, BaseExporter exporter, Action configure) + { + Guard.ThrowIfNull(exporter); + Guard.ThrowIfNull(configure); + + this.ConfigureState((sp, state) + => state.AddProcessor( + this.BuildExportProcessor(exportProcessorType, exporter, configure))); + + return this; + } + + internal TracerProviderBuilder AddInstrumentation() + where T : class + { + this.TryAddSingleton(); + this.AddInstrumentation((sp) => sp.GetRequiredService()); + + return this; + } + + internal TracerProviderBuilder AddProcessor() + where T : BaseProcessor + { + this.TryAddSingleton(); + this.ConfigureState((sp, state) => state.AddProcessor(sp.GetRequiredService())); + + return this; + } + + internal TracerProviderBuilder AddProcessor(BaseProcessor processor) + { + Guard.ThrowIfNull(processor); + + return this.ConfigureState((sp, state) => state.AddProcessor(processor)); + } + + internal TracerProviderBuilder ConfigureResource(Action configure) + { + Guard.ThrowIfNull(configure); + + return this.ConfigureState((sp, state) => state.ConfigureResource(configure)); + } + + internal TracerProviderBuilder ConfigureServices(Action configure) + { + Guard.ThrowIfNull(configure); + + var services = this.services; + + if (services == null) + { + throw new NotSupportedException("Services cannot be configured after ServiceProvider has been created."); + } + + configure(services); + + return this; + } + + internal TracerProvider InvokeBuild() + => this.Build(); + + internal TracerProviderBuilder SetErrorStatusOnException(bool enabled) + { + return this.ConfigureState((sp, state) => state.SetErrorStatusOnException = enabled); + } + + internal TracerProviderBuilder SetResourceBuilder(ResourceBuilder resourceBuilder) + { + Guard.ThrowIfNull(resourceBuilder); + + return this.ConfigureState((sp, state) => state.SetResourceBuilder(resourceBuilder)); + } + + internal TracerProviderBuilder SetSampler() + where T : Sampler + { + this.TryAddSingleton(); + this.ConfigureState((sp, state) => state.SetSampler(sp.GetRequiredService())); + + return this; + } + + internal TracerProviderBuilder SetSampler(Sampler sampler) + { + Guard.ThrowIfNull(sampler); + + return this.ConfigureState((sp, state) => state.SetSampler(sampler)); + } + + /// + /// Adds instrumentation to the provider. + /// d + /// Instrumentation name. + /// Instrumentation version. + /// Function that builds instrumentation. + /// Returns for chaining. + protected TracerProviderBuilder AddInstrumentation( + string instrumentationName, + string instrumentationVersion, + Func instrumentationFactory) + { + Guard.ThrowIfNullOrWhitespace(instrumentationName); + Guard.ThrowIfNullOrWhitespace(instrumentationVersion); + Guard.ThrowIfNull(instrumentationFactory); + + return this.ConfigureState((sp, state) + => state.AddInstrumentation( + instrumentationName, + instrumentationVersion, + instrumentationFactory())); + } + + /// + /// Run the configured actions to initialize the . + /// + /// . + protected TracerProvider Build() + { + if (!this.ownsServices || this.state != null) + { + throw new NotSupportedException("Build cannot be called directly on TracerProviderBuilder tied to external services."); + } + + var services = this.services; + + if (services == null) + { + throw new NotSupportedException("TracerProviderBuilder build method cannot be called multiple times."); + } + + this.services = null; + + var serviceProvider = services.BuildServiceProvider(); + + return serviceProvider.GetRequiredService(); + } + + private TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) + where T : class + { + this.ConfigureState((sp, state) + => state.AddInstrumentation( + typeof(T).Name, + "semver:" + typeof(T).Assembly.GetName().Version, + instrumentationFactory(sp))); + + return this; + } + + private TracerProviderBuilder ConfigureState(Action configure) + { + Debug.Assert(configure != null, "configure was null"); + + if (this.state != null) + { + Debug.Assert(this.serviceProvider != null, "serviceProvider was null"); + + configure!(this.serviceProvider!, this.state); + } + else + { + this.ConfigureServices(services => TracerProviderBuilderServiceCollectionHelper.RegisterConfigureStateCallback(services, configure)); + } + + return this; + } + + private void TryAddSingleton() + where T : class + { + var services = this.services; + + if (services != null) + { + services.TryAddSingleton(); + } + } + + private BaseProcessor BuildExportProcessor( + ExportProcessorType exportProcessorType, + BaseExporter exporter, + Action configure) + { + Debug.Assert(this.serviceProvider != null, "serviceProvider was null"); + + var serviceProvider = this.serviceProvider; + + switch (exportProcessorType) + { + case ExportProcessorType.Simple: + return new SimpleActivityExportProcessor(exporter); + case ExportProcessorType.Batch: + var options = new ExportActivityProcessorOptions + { + ExportProcessorType = ExportProcessorType.Batch, + BatchExportProcessorOptions = serviceProvider.GetRequiredService>().Value, + }; + + configure(options); + + var batchOptions = options.BatchExportProcessorOptions; + + return new BatchActivityExportProcessor( + exporter, + batchOptions.MaxQueueSize, + batchOptions.ScheduledDelayMilliseconds, + batchOptions.ExporterTimeoutMilliseconds, + batchOptions.MaxExportBatchSize); + default: + throw new NotSupportedException($"ExportProcessorType '{exportProcessorType}' is not supported."); + } + } + } +} diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs similarity index 73% rename from src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs rename to src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs index 04bc2747d5e..eee8016a328 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs @@ -19,9 +19,6 @@ using System; using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Options; -using OpenTelemetry.Internal; using OpenTelemetry.Resources; namespace OpenTelemetry.Trace @@ -35,7 +32,7 @@ public static class TracerProviderBuilderExtensions /// Sets whether the status of /// should be set to Status.Error when it ended abnormally due to an unhandled exception. /// - /// TracerProviderBuilder instance. + /// . /// Enabled or not. Default value is true. /// Returns for chaining. public static TracerProviderBuilder SetErrorStatusOnException(this TracerProviderBuilder tracerProviderBuilder, bool enabled = true) @@ -51,7 +48,7 @@ public static TracerProviderBuilder SetErrorStatusOnException(this TracerProvide /// /// Sets sampler. /// - /// TracerProviderBuilder instance. + /// . /// Sampler instance. /// Returns for chaining. public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracerProviderBuilder, Sampler sampler) @@ -77,8 +74,12 @@ public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracer public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracerProviderBuilder) where T : Sampler { - return tracerProviderBuilder - .ConfigureServices(services => services.TryAddSingleton()); + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.SetSampler(); + } + + return tracerProviderBuilder; } /// @@ -87,14 +88,14 @@ public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tra /// You should usually use instead /// (call if desired). /// - /// TracerProviderBuilder instance. + /// . /// from which Resource will be built. /// Returns for chaining. public static TracerProviderBuilder SetResourceBuilder(this TracerProviderBuilder tracerProviderBuilder, ResourceBuilder resourceBuilder) { if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) { - tracerProviderBuilderBase.ResourceBuilder = resourceBuilder; + tracerProviderBuilderBase.SetResourceBuilder(resourceBuilder); } return tracerProviderBuilder; @@ -104,31 +105,23 @@ public static TracerProviderBuilder SetResourceBuilder(this TracerProviderBuilde /// Modify the from which the Resource associated with /// this provider is built from in-place. /// - /// TracerProviderBuilder instance. + /// . /// An action which modifies the provided in-place. /// Returns for chaining. public static TracerProviderBuilder ConfigureResource(this TracerProviderBuilder tracerProviderBuilder, Action configure) { - Guard.ThrowIfNull(configure); - - return tracerProviderBuilder.ConfigureBuilder((sp, b) => + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) { - // Note: ConfigureResource is deferred until the build phase. - // This allows them to play nice and apply on top of any - // SetResourceBuilder calls. - if (b is TracerProviderBuilderBase tracerProviderBuilderBase) - { - Debug.Assert(tracerProviderBuilderBase.ResourceBuilder != null, "ResourceBuilder was null"); - - configure(tracerProviderBuilderBase.ResourceBuilder!); - } - }); + tracerProviderBuilderBase.ConfigureResource(configure); + } + + return tracerProviderBuilder; } /// /// Adds a processor to the provider. /// - /// TracerProviderBuilder instance. + /// . /// Activity processor to add. /// Returns for chaining. public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder, BaseProcessor processor) @@ -149,19 +142,23 @@ public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder trac /// registered as a singleton service into application services. /// /// Processor type. - /// TracerProviderBuilder instance. + /// . /// The supplied for chaining. public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder) where T : BaseProcessor { - return tracerProviderBuilder - .ConfigureServices(services => services.TryAddSingleton, T>()); + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.AddProcessor(); + } + + return tracerProviderBuilder; } /// /// Adds an exporter to the provider. /// - /// TracerProviderBuilder instance. + /// . /// . /// Activity exporter to add. /// Returns for chaining. @@ -174,7 +171,7 @@ public static TracerProviderBuilder AddExporter( /// /// Adds an exporter to the provider. /// - /// TracerProviderBuilder instance. + /// . /// . /// Activity exporter to add. /// Callback action to configure exporter, Action configure) { - Guard.ThrowIfNull(exporter); - Guard.ThrowIfNull(configure); - - return tracerProviderBuilder.ConfigureBuilder((sp, b) => + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) { - if (b is TracerProviderBuilderBase tracerProviderBuilderBase) - { - tracerProviderBuilderBase.AddProcessor( - BuildExportProcessor(sp, exportProcessorType, exporter, configure)); - } - }); + tracerProviderBuilderBase.AddExporter(exportProcessorType, exporter, configure); + } + + return tracerProviderBuilder; } /// @@ -209,7 +201,7 @@ public static TracerProviderBuilder AddExporter( /// registered as a singleton service into application services. /// /// Exporter type. - /// TracerProviderBuilder instance. + /// . /// . /// The supplied for chaining. public static TracerProviderBuilder AddExporter( @@ -226,7 +218,7 @@ public static TracerProviderBuilder AddExporter( /// registered as a singleton service into application services. /// /// Exporter type. - /// TracerProviderBuilder instance. + /// . /// . /// Callback action to configure . Only invoked when ( Action configure) where T : BaseExporter { - Guard.ThrowIfNull(configure); - - return tracerProviderBuilder - .ConfigureServices(services => - { - services.TryAddSingleton, T>(); - services.TryAddSingleton( - sp => BuildExportProcessor(sp, exportProcessorType, sp.GetRequiredService(), configure)); - }); + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.AddExporter(exportProcessorType, configure); + } + + return tracerProviderBuilder; } /// /// Adds instrumentation to the provider. /// + /// + /// Note: The type specified by will be + /// registered as a singleton service into application services. + /// /// Instrumentation type. /// . /// The supplied for chaining. public static TracerProviderBuilder AddInstrumentation(this TracerProviderBuilder tracerProviderBuilder) where T : class { - return ConfigureBuilder( - tracerProviderBuilder, - (sp, builder) => builder.AddInstrumentation(() => sp.GetRequiredService())); + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.AddInstrumentation(); + } + + return tracerProviderBuilder; } /// @@ -279,18 +275,9 @@ public static TracerProviderBuilder ConfigureServices( this TracerProviderBuilder tracerProviderBuilder, Action configure) { - Guard.ThrowIfNull(configure); - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) { - var services = tracerProviderBuilderBase.Services; - - if (services == null) - { - throw new NotSupportedException("Services cannot be configured outside of application configuration phase."); - } - - configure(services); + tracerProviderBuilderBase.ConfigureServices(configure); } return tracerProviderBuilder; @@ -308,13 +295,8 @@ public static TracerProviderBuilder ConfigureServices( { if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) { - var services = tracerProviderBuilderBase.Services; - - if (services == null) - { - throw new NotSupportedException("Services cannot be configured outside of application configuration phase."); - } - + IServiceCollection? services = null; + tracerProviderBuilderBase.ConfigureServices(s => services = s); return services; } @@ -333,8 +315,6 @@ public static TracerProviderBuilder ConfigureBuilder( this TracerProviderBuilder tracerProviderBuilder, Action configure) { - Guard.ThrowIfNull(configure); - if (tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) { deferredTracerProviderBuilder.Configure(configure); @@ -371,37 +351,5 @@ public static TracerProviderBuilder Configure( return null; } - - private static BaseProcessor BuildExportProcessor( - IServiceProvider serviceProvider, - ExportProcessorType exportProcessorType, - BaseExporter exporter, - Action? configure = null) - { - switch (exportProcessorType) - { - case ExportProcessorType.Simple: - return new SimpleActivityExportProcessor(exporter); - case ExportProcessorType.Batch: - var options = new ExportActivityProcessorOptions - { - ExportProcessorType = ExportProcessorType.Batch, - BatchExportProcessorOptions = serviceProvider.GetRequiredService>().Value, - }; - - configure?.Invoke(options); - - var batchOptions = options.BatchExportProcessorOptions; - - return new BatchActivityExportProcessor( - exporter, - batchOptions.MaxQueueSize, - batchOptions.ScheduledDelayMilliseconds, - batchOptions.ExporterTimeoutMilliseconds, - batchOptions.MaxExportBatchSize); - default: - throw new NotSupportedException($"ExportProcessorType '{exportProcessorType}' is not supported."); - } - } } } diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderSdk.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs similarity index 65% rename from src/OpenTelemetry/Trace/TracerProviderBuilderSdk.cs rename to src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs index b92cdf3f5bf..0144a56daf8 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs @@ -16,9 +16,27 @@ #nullable enable +using System; +using Microsoft.Extensions.DependencyInjection; + namespace OpenTelemetry.Trace { internal sealed class TracerProviderBuilderSdk : TracerProviderBuilderBase { + public TracerProviderBuilderSdk() + { + } + + public TracerProviderBuilderSdk(IServiceCollection services) + : base(services) + { + } + + internal TracerProviderBuilderSdk( + IServiceProvider serviceProvider, + TracerProviderBuilderState state) + : base(serviceProvider, state) + { + } } } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs new file mode 100644 index 00000000000..290c0c5be9f --- /dev/null +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs @@ -0,0 +1,79 @@ +// +// 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.Diagnostics; +using Microsoft.Extensions.DependencyInjection; + +namespace OpenTelemetry.Trace; + +internal static class TracerProviderBuilderServiceCollectionHelper +{ + internal static IServiceCollection RegisterConfigureBuilderCallback( + IServiceCollection services, + Action configure) + { + Debug.Assert(configure != null, "configure was null"); + + return RegisterConfigureStateCallback( + services, + (sp, state) => configure(sp, new TracerProviderBuilderSdk(sp, state))); + } + + internal static IServiceCollection RegisterConfigureStateCallback( + IServiceCollection services, + Action configure) + { + Debug.Assert(services != null, "services was null"); + Debug.Assert(configure != null, "configure was null"); + + return services.AddSingleton(new ConfigureTracerProviderBuilderStateCallbackRegistration(configure)); + } + + internal static void InvokeRegisteredConfigureStateCallbacks( + IServiceProvider serviceProvider, + TracerProviderBuilderState state) + { + Debug.Assert(serviceProvider != null, "serviceProvider was null"); + Debug.Assert(state != null, "state was null"); + + var callbackRegistrations = serviceProvider.GetServices(); + + foreach (var callbackRegistration in callbackRegistrations) + { + callbackRegistration.Configure(serviceProvider, state); + } + } + + private sealed class ConfigureTracerProviderBuilderStateCallbackRegistration + { + private readonly Action configure; + + public ConfigureTracerProviderBuilderStateCallbackRegistration( + Action configure) + { + this.configure = configure; + } + + public void Configure(IServiceProvider serviceProvider, TracerProviderBuilderState state) + { + Debug.Assert(serviceProvider != null, "serviceProvider was null"); + Debug.Assert(state != null, "state was null"); + + this.configure(serviceProvider, state); + } + } +} diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs new file mode 100644 index 00000000000..ee0da80d199 --- /dev/null +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs @@ -0,0 +1,133 @@ +// +// 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. +// + +#nullable enable + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using OpenTelemetry.Internal; +using OpenTelemetry.Resources; + +namespace OpenTelemetry.Trace +{ + /// + /// Stores state used to build a . + /// + internal sealed class TracerProviderBuilderState + { + internal readonly List Instrumentation = new(); + internal readonly List> Processors = new(); + internal readonly List Sources = new(); + internal readonly HashSet LegacyActivityOperationNames = new(StringComparer.OrdinalIgnoreCase); + internal ResourceBuilder? ResourceBuilder; + internal Sampler? Sampler; + internal bool SetErrorStatusOnException; + + public void AddInstrumentation( + string instrumentationName, + string instrumentationVersion, + object instrumentation) + { + Debug.Assert(!string.IsNullOrWhiteSpace(instrumentationName), "instrumentationName was null or whitespace"); + Debug.Assert(!string.IsNullOrWhiteSpace(instrumentationVersion), "instrumentationVersion was null or whitespace"); + Debug.Assert(instrumentation != null, "instrumentation was null"); + + this.Instrumentation.Add( + new InstrumentationRegistration( + instrumentationName, + instrumentationVersion, + instrumentation!)); + } + + public void AddLegacySource(string operationName) + { + Debug.Assert(!string.IsNullOrWhiteSpace(operationName), "operationName was null or whitespace"); + + this.LegacyActivityOperationNames.Add(operationName); + } + + public void AddProcessor(BaseProcessor processor) + { + Debug.Assert(processor != null, "processor was null"); + + this.Processors.Add(processor!); + } + + public void AddSource(params string[] names) + { + Debug.Assert(names != null, "names was null"); + + foreach (var name in names!) + { + Guard.ThrowIfNullOrWhitespace(name); + + // TODO: We need to fix the listening model. + // Today it ignores version. + this.Sources.Add(name); + } + } + + public void ConfigureResource(Action configure) + { + Debug.Assert(configure != null, "configure was null"); + + var resourceBuilder = this.ResourceBuilder ??= ResourceBuilder.CreateDefault(); + + configure!(resourceBuilder); + } + + public void SetResourceBuilder(ResourceBuilder resourceBuilder) + { + Debug.Assert(resourceBuilder != null, "resourceBuilder was null"); + + this.ResourceBuilder = resourceBuilder; + } + + public void SetSampler(Sampler sampler) + { + Debug.Assert(sampler != null, "sampler was null"); + + this.Sampler = sampler; + } + + internal void EnableErrorStatusOnException() + { + try + { + this.Processors.Insert(0, new ExceptionProcessor()); + } + catch (Exception ex) + { + throw new NotSupportedException($"'{nameof(TracerProviderBuilderExtensions.SetErrorStatusOnException)}' is not supported on this platform", ex); + } + } + + internal readonly struct InstrumentationRegistration + { + public readonly string Name; + public readonly string Version; + public readonly object Instance; + + internal InstrumentationRegistration(string name, string version, object instance) + { + this.Name = name; + this.Version = version; + this.Instance = instance; + } + } + } +} diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs deleted file mode 100644 index 59269576725..00000000000 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs +++ /dev/null @@ -1,337 +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. -// - -#nullable enable - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using Microsoft.Extensions.DependencyInjection; -using OpenTelemetry.Internal; -using OpenTelemetry.Resources; - -namespace OpenTelemetry.Trace -{ - /// - /// Build TracerProvider with Resource, Sampler, Processors and Instrumentation. - /// - public abstract class TracerProviderBuilderBase : TracerProviderBuilder, IDeferredTracerProviderBuilder - { - internal IServiceCollection? Services; - internal List>? BuilderConfigurationActions = new(); - internal ResourceBuilder? ResourceBuilder; - - private readonly List instrumentationFactories = new(); - private readonly List> processors = new(); - private readonly List sources = new(); - private readonly HashSet legacyActivityOperationNames = new(StringComparer.OrdinalIgnoreCase); - private readonly bool ownsServices; - private Sampler? sampler; - - protected TracerProviderBuilderBase() - { - var services = new ServiceCollection(); - - services.AddOptions(); - - this.Services = services; - this.ownsServices = true; - } - - protected TracerProviderBuilderBase(IServiceCollection services) - { - Guard.ThrowIfNull(services); - - this.Services = services; - this.ownsServices = false; - } - - protected IServiceProvider? ServiceProvider { get; set; } - - /// - public override TracerProviderBuilder AddInstrumentation( - Func instrumentationFactory) - where TInstrumentation : class - { - Guard.ThrowIfNull(instrumentationFactory); - - this.instrumentationFactories.Add( - new InstrumentationFactory( - typeof(TInstrumentation).Name, - "semver:" + typeof(TInstrumentation).Assembly.GetName().Version, - instrumentationFactory)); - - return this; - } - - /// - public override TracerProviderBuilder AddSource(params string[] names) - { - Guard.ThrowIfNull(names); - - foreach (var name in names) - { - Guard.ThrowIfNullOrWhitespace(name); - - // TODO: We need to fix the listening model. - // Today it ignores version. - this.sources.Add(name); - } - - return this; - } - - /// - public override TracerProviderBuilder AddLegacySource(string operationName) - { - Guard.ThrowIfNullOrWhitespace(operationName); - - this.legacyActivityOperationNames.Add(operationName); - - return this; - } - - TracerProviderBuilder IDeferredTracerProviderBuilder.Configure( - Action configure) - { - Guard.ThrowIfNull(configure); - - var configurationActions = this.BuilderConfigurationActions; - if (configurationActions == null) - { - throw new NotSupportedException("Configuration actions cannot be registered after TracerProvider has been created."); - } - - configurationActions.Add(configure); - - return this; - } - - /// - /// Sets whether the status of - /// should be set to Status.Error when it ended abnormally due to an unhandled exception. - /// - /// Enabled or not. - /// Returns for chaining. - internal TracerProviderBuilder SetErrorStatusOnException(bool enabled) - { - ExceptionProcessor? existingExceptionProcessor = null; - - if (this.processors.Count > 0) - { - existingExceptionProcessor = this.processors[0] as ExceptionProcessor; - } - - if (enabled) - { - if (existingExceptionProcessor == null) - { - try - { - this.processors.Insert(0, new ExceptionProcessor()); - } - catch (Exception ex) - { - throw new NotSupportedException($"'{nameof(this.SetErrorStatusOnException)}' is not supported on this platform", ex); - } - } - } - else - { - if (existingExceptionProcessor != null) - { - this.processors.RemoveAt(0); - existingExceptionProcessor.Dispose(); - } - } - - return this; - } - - /// - /// Sets sampler. - /// - /// Sampler instance. - /// Returns for chaining. - internal TracerProviderBuilder SetSampler(Sampler sampler) - { - Guard.ThrowIfNull(sampler); - - this.sampler = sampler; - - return this; - } - - /// - /// Adds processor to the provider. - /// - /// Activity processor to add. - /// Returns for chaining. - internal TracerProviderBuilder AddProcessor(BaseProcessor processor) - { - Guard.ThrowIfNull(processor); - - this.processors.Add(processor); - - return this; - } - - internal TracerProvider InvokeBuild() - { - return this.Build(); - } - - /// - /// Adds instrumentation to the provider. - /// - /// Instrumentation name. - /// Instrumentation version. - /// Function that builds instrumentation. - /// Returns for chaining. - protected TracerProviderBuilder AddInstrumentation( - string instrumentationName, - string instrumentationVersion, - Func instrumentationFactory) - { - this.instrumentationFactories.Add( - new InstrumentationFactory(instrumentationName, instrumentationVersion, instrumentationFactory)); - - return this; - } - - /// - /// Run the configured actions to initialize the . - /// - /// . - protected TracerProvider Build() - { - return this.OnBuild(); - } - - /// - /// Called to run the configured actions to initialize the . - /// - /// . - protected virtual TracerProvider OnBuild() - { - var services = this.Services; - - if (services == null) - { - throw new NotSupportedException("TracerProviderBuilder build method cannot be called multiple times."); - } - - this.Services = null; - - var serviceProvider = this.ServiceProvider; - var ownsServiceProvider = false; - - if (serviceProvider == null) - { - if (!this.ownsServices) - { - throw new NotSupportedException("ServiceProvider was not supplied for builder tied to external services."); - } - - serviceProvider = services.BuildServiceProvider(); - ownsServiceProvider = true; - } - else if (this.ownsServices) - { - throw new NotSupportedException("ServiceProvider was supplied for builder tied to internal services."); - } - - this.ResourceBuilder ??= ResourceBuilder.CreateDefault(); - - // Step 1: Look for any Action configuration actions registered and - // execute them. - - var registeredConfigurations = serviceProvider.GetServices>(); - foreach (var registeredConfiguration in registeredConfigurations) - { - registeredConfiguration?.Invoke(serviceProvider, this); - } - - // Step 2: Execute any configuration actions directly attached to - // the builder. - - var configurationActions = this.BuilderConfigurationActions; - if (configurationActions != null) - { - // Note: Not using a foreach loop because additional actions can be - // added during each call. - for (int i = 0; i < configurationActions.Count; i++) - { - configurationActions[i](serviceProvider, this); - } - - this.BuilderConfigurationActions = null; - } - - // Step 3: Look for any samplers registered. - - var registeredSamplers = serviceProvider.GetServices(); - int registeredSamplerCount = registeredSamplers.Count(); - if (registeredSamplerCount > 1) - { - throw new NotSupportedException("Multiple samplers registered in application services is not supported."); - } - - var sampler = this.sampler; - if (sampler == null) - { - sampler = registeredSamplers.First() ?? new ParentBasedSampler(new AlwaysOnSampler()); - } - else if (registeredSamplerCount > 0) - { - throw new NotSupportedException("Setting sampler directly on tracer builder and through application services is not supported."); - } - - // Step 4: Look for any processors registered. - - var registeredProcessors = serviceProvider.GetServices>(); - foreach (var registeredProcessor in registeredProcessors) - { - this.processors.Add(registeredProcessor); - } - - return new TracerProviderSdk( - this.ResourceBuilder.Build(), - this.sources, - this.instrumentationFactories, - sampler, - this.processors, - this.legacyActivityOperationNames, - ownsServiceProvider ? (ServiceProvider)serviceProvider : null); - } - - internal readonly struct InstrumentationFactory - { - public readonly string Name; - public readonly string Version; - public readonly Func Factory; - - internal InstrumentationFactory(string name, string version, Func factory) - { - this.Name = name; - this.Version = version; - this.Factory = factory; - } - } - } -} diff --git a/src/OpenTelemetry/Trace/TracerProviderSdk.cs b/src/OpenTelemetry/Trace/TracerProviderSdk.cs index cb75c514834..3928558ff4c 100644 --- a/src/OpenTelemetry/Trace/TracerProviderSdk.cs +++ b/src/OpenTelemetry/Trace/TracerProviderSdk.cs @@ -21,7 +21,6 @@ using System.Diagnostics; using System.Linq; using System.Runtime.CompilerServices; -using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; using OpenTelemetry.Resources; @@ -36,47 +35,55 @@ internal sealed class TracerProviderSdk : TracerProvider private readonly Sampler sampler; private readonly Action getRequestedDataAction; private readonly bool supportLegacyActivity; - private readonly ServiceProvider? ownedServiceProvider; + private readonly IDisposable? ownedServiceProvider; private BaseProcessor? processor; private bool disposed; internal TracerProviderSdk( - Resource resource, - IEnumerable sources, - IEnumerable instrumentationFactories, - Sampler sampler, - List> processors, - HashSet legacyActivityOperationNames, - ServiceProvider? ownedServiceProvider) + IServiceProvider serviceProvider, + bool ownsServiceProvider) { - this.Resource = resource; - this.sampler = sampler; - this.supportLegacyActivity = legacyActivityOperationNames.Count > 0; - this.ownedServiceProvider = ownedServiceProvider; + if (ownsServiceProvider) + { + this.ownedServiceProvider = serviceProvider as IDisposable; + Debug.Assert(this.ownedServiceProvider != null, "serviceProvider was not IDisposable"); + } + + var state = new TracerProviderBuilderState(); + + TracerProviderBuilderServiceCollectionHelper.InvokeRegisteredConfigureStateCallbacks( + serviceProvider, + state); + + if (state.SetErrorStatusOnException) + { + state.EnableErrorStatusOnException(); + } + + this.Resource = (state.ResourceBuilder ?? ResourceBuilder.CreateDefault()).Build(); + this.sampler = state.Sampler ?? new ParentBasedSampler(new AlwaysOnSampler()); + this.supportLegacyActivity = state.LegacyActivityOperationNames.Count > 0; bool legacyActivityWildcardMode = false; var legacyActivityWildcardModeRegex = WildcardHelper.GetWildcardRegex(); - foreach (var legacyName in legacyActivityOperationNames) + foreach (var legacyName in state.LegacyActivityOperationNames) { if (WildcardHelper.ContainsWildcard(legacyName)) { legacyActivityWildcardMode = true; - legacyActivityWildcardModeRegex = WildcardHelper.GetWildcardRegex(legacyActivityOperationNames); + legacyActivityWildcardModeRegex = WildcardHelper.GetWildcardRegex(state.LegacyActivityOperationNames); break; } } - foreach (var processor in processors) + foreach (var processor in state.Processors) { this.AddProcessor(processor); } - if (instrumentationFactories.Any()) + foreach (var instrumentation in state.Instrumentation) { - foreach (var instrumentationFactory in instrumentationFactories) - { - this.instrumentations.Add(instrumentationFactory.Factory()); - } + this.instrumentations.Add(instrumentation.Instance); } var listener = new ActivityListener(); @@ -90,7 +97,7 @@ internal TracerProviderSdk( } else { - legacyActivityPredicate = activity => legacyActivityOperationNames.Contains(activity.OperationName); + legacyActivityPredicate = activity => state.LegacyActivityOperationNames.Contains(activity.OperationName); } listener.ActivityStarted = activity => @@ -196,13 +203,13 @@ internal TracerProviderSdk( }; } - if (sampler is AlwaysOnSampler) + if (this.sampler is AlwaysOnSampler) { listener.Sample = (ref ActivityCreationOptions options) => !Sdk.SuppressInstrumentation ? ActivitySamplingResult.AllDataAndRecorded : ActivitySamplingResult.None; this.getRequestedDataAction = this.RunGetRequestedDataAlwaysOnSampler; } - else if (sampler is AlwaysOffSampler) + else if (this.sampler is AlwaysOffSampler) { listener.Sample = (ref ActivityCreationOptions options) => !Sdk.SuppressInstrumentation ? PropagateOrIgnoreData(options.Parent) : ActivitySamplingResult.None; @@ -212,19 +219,19 @@ internal TracerProviderSdk( { // This delegate informs ActivitySource about sampling decision when the parent context is an ActivityContext. listener.Sample = (ref ActivityCreationOptions options) => - !Sdk.SuppressInstrumentation ? ComputeActivitySamplingResult(options, sampler) : ActivitySamplingResult.None; + !Sdk.SuppressInstrumentation ? ComputeActivitySamplingResult(options, this.sampler) : ActivitySamplingResult.None; this.getRequestedDataAction = this.RunGetRequestedDataOtherSampler; } // Sources can be null. This happens when user // is only interested in InstrumentationLibraries // which do not depend on ActivitySources. - if (sources.Any()) + if (state.Sources.Any()) { // Validation of source name is already done in builder. - if (sources.Any(s => WildcardHelper.ContainsWildcard(s))) + if (state.Sources.Any(s => WildcardHelper.ContainsWildcard(s))) { - var regex = WildcardHelper.GetWildcardRegex(sources); + var regex = WildcardHelper.GetWildcardRegex(state.Sources); // Function which takes ActivitySource and returns true/false to indicate if it should be subscribed to // or not. @@ -235,7 +242,7 @@ internal TracerProviderSdk( } else { - var activitySources = new HashSet(sources, StringComparer.OrdinalIgnoreCase); + var activitySources = new HashSet(state.Sources, StringComparer.OrdinalIgnoreCase); if (this.supportLegacyActivity) { diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderExtensionsTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderExtensionsTest.cs index 899874c257c..db7ed022395 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderExtensionsTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderExtensionsTest.cs @@ -16,12 +16,11 @@ using System; using System.Diagnostics; - -using OpenTelemetry.Trace; +using OpenTelemetry.Tests; using Xunit; -namespace OpenTelemetry.Tests.Trace +namespace OpenTelemetry.Trace.Tests { public class TracerProviderExtensionsTest { From d8338cd4d692a95e9252f0b1bf4e6aecd37f1984 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Mon, 8 Aug 2022 16:30:55 -0700 Subject: [PATCH 15/30] Fix hosting multiple configurations test. --- .../HostingTracerExtensionTests.cs | 28 ++----------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs index e70b0d8aba7..131e9038139 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs @@ -183,41 +183,19 @@ public void AddOpenTelemetryTracerProvider_ConfigureCallbacksUsingExtensions() } [Fact] - public void AddOpenTelemetryTracing_SingleBuilderAllowed() + public void AddOpenTelemetryTracing_MultipleCallsConfigureSingleProvider() { var services = new ServiceCollection(); services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSourceBuilder1")); services.AddOpenTelemetryTracing(); - services.AddOpenTelemetryTracing(); - services.AddOpenTelemetryTracing(); - - using var serviceProvider = services.BuildServiceProvider(); - - var builders = serviceProvider.GetServices(); - - Assert.Single(builders); - - var provider = serviceProvider.GetRequiredService(); - - Assert.NotNull(provider); - } - - [Fact] - public void AddOpenTelemetryTracing_MultipleBuildersThrowsNotSupported() - { - var services = new ServiceCollection(); - - services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSourceBuilder1")); services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSourceBuilder2")); using var serviceProvider = services.BuildServiceProvider(); - var builders = serviceProvider.GetServices(); - - Assert.Equal(2, builders.Count()); + var providers = serviceProvider.GetServices(); - Assert.Throws(() => serviceProvider.GetRequiredService()); + Assert.Single(providers); } private static TracerProviderBuilder AddMyFeature(TracerProviderBuilder tracerProviderBuilder) From 2a7906d3a4de4553db4bf53475fda150a4281905 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Mon, 8 Aug 2022 16:41:50 -0700 Subject: [PATCH 16/30] Cleanup. --- .../OpenTelemetryServicesExtensions.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index b5c7af9e603..49cc9c8817b 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -75,8 +75,6 @@ public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection try { services.TryAddEnumerable(ServiceDescriptor.Singleton()); - - return services; } catch (Exception ex) { From dea21520c7296099ca9caaa70f82346c75f00177 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Tue, 9 Aug 2022 09:47:33 -0700 Subject: [PATCH 17/30] Cleanup and fixes. --- .../OpenTelemetryServicesExtensions.cs | 24 +++--- .../Builder/TracerProviderBuilderBase.cs | 86 ++++++++----------- .../Trace/Builder/TracerProviderBuilderSdk.cs | 7 +- ...rProviderBuilderServiceCollectionHelper.cs | 2 +- .../Builder/TracerProviderBuilderState.cs | 12 +++ src/OpenTelemetry/Trace/TracerProviderSdk.cs | 2 +- 6 files changed, 64 insertions(+), 69 deletions(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index 49cc9c8817b..bf6b2ed6237 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -40,19 +40,9 @@ public static class OpenTelemetryServicesExtensions /// for a given . /// /// The to add services to. - /// Callback action to configure the . /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action configure) - { - Guard.ThrowIfNull(services); - Guard.ThrowIfNull(configure); - - var builder = new TracerProviderBuilderHosting(services); - - configure(builder); - - return AddOpenTelemetryTracing(services); - } + public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) + => AddOpenTelemetryTracing(services, (b) => { }); /// /// Adds OpenTelemetry TracerProvider to the specified . @@ -63,15 +53,23 @@ public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection /// for a given . /// /// The to add services to. + /// Callback action to configure the . /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) + public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action configure) { Guard.ThrowIfNull(services); + Guard.ThrowIfNull(configure); // Accessing Sdk class is just to trigger its static ctor, // which sets default Propagators and default Activity Id format _ = Sdk.SuppressInstrumentation; + // Note: We need to create a builder even if there is no configure + // because the builder will register services + var builder = new TracerProviderBuilderHosting(services); + + configure(builder); + try { services.TryAddEnumerable(ServiceDescriptor.Singleton()); diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index ee1730d3619..598fffc8015 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -31,21 +31,16 @@ namespace OpenTelemetry.Trace /// public abstract class TracerProviderBuilderBase : TracerProviderBuilder, IDeferredTracerProviderBuilder { - private readonly IServiceProvider? serviceProvider; private readonly TracerProviderBuilderState? state; private readonly bool ownsServices; private IServiceCollection? services; // This ctor is for a builder created from TracerProviderBuilderState which // happens after the service provider has been created. - internal TracerProviderBuilderBase( - IServiceProvider serviceProvider, - TracerProviderBuilderState state) + internal TracerProviderBuilderBase(TracerProviderBuilderState state) { - Debug.Assert(serviceProvider != null, "serviceProvider was null"); Debug.Assert(state != null, "state was null"); - this.serviceProvider = serviceProvider; this.state = state; } @@ -109,9 +104,7 @@ TracerProviderBuilder IDeferredTracerProviderBuilder.Configure( if (this.state != null) { - Debug.Assert(this.serviceProvider != null, "serviceProvider was null"); - - configure(this.serviceProvider!, this); + configure(this.state.ServiceProvider, this); } else { @@ -130,7 +123,7 @@ internal TracerProviderBuilder AddExporter(ExportProcessorType exportProcesso this.TryAddSingleton(); this.ConfigureState((sp, state) => state.AddProcessor( - this.BuildExportProcessor(exportProcessorType, sp.GetRequiredService(), configure))); + BuildExportProcessor(state.ServiceProvider, exportProcessorType, sp.GetRequiredService(), configure))); return this; } @@ -142,7 +135,7 @@ internal TracerProviderBuilder AddExporter(ExportProcessorType exportProcessorTy this.ConfigureState((sp, state) => state.AddProcessor( - this.BuildExportProcessor(exportProcessorType, exporter, configure))); + BuildExportProcessor(state.ServiceProvider, exportProcessorType, exporter, configure))); return this; } @@ -274,6 +267,38 @@ protected TracerProvider Build() return serviceProvider.GetRequiredService(); } + private static BaseProcessor BuildExportProcessor( + IServiceProvider serviceProvider, + ExportProcessorType exportProcessorType, + BaseExporter exporter, + Action configure) + { + switch (exportProcessorType) + { + case ExportProcessorType.Simple: + return new SimpleActivityExportProcessor(exporter); + case ExportProcessorType.Batch: + var options = new ExportActivityProcessorOptions + { + ExportProcessorType = ExportProcessorType.Batch, + BatchExportProcessorOptions = serviceProvider.GetRequiredService>().Value, + }; + + configure(options); + + var batchOptions = options.BatchExportProcessorOptions; + + return new BatchActivityExportProcessor( + exporter, + batchOptions.MaxQueueSize, + batchOptions.ScheduledDelayMilliseconds, + batchOptions.ExporterTimeoutMilliseconds, + batchOptions.MaxExportBatchSize); + default: + throw new NotSupportedException($"ExportProcessorType '{exportProcessorType}' is not supported."); + } + } + private TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) where T : class { @@ -292,9 +317,7 @@ private TracerProviderBuilder ConfigureState(Action() services.TryAddSingleton(); } } - - private BaseProcessor BuildExportProcessor( - ExportProcessorType exportProcessorType, - BaseExporter exporter, - Action configure) - { - Debug.Assert(this.serviceProvider != null, "serviceProvider was null"); - - var serviceProvider = this.serviceProvider; - - switch (exportProcessorType) - { - case ExportProcessorType.Simple: - return new SimpleActivityExportProcessor(exporter); - case ExportProcessorType.Batch: - var options = new ExportActivityProcessorOptions - { - ExportProcessorType = ExportProcessorType.Batch, - BatchExportProcessorOptions = serviceProvider.GetRequiredService>().Value, - }; - - configure(options); - - var batchOptions = options.BatchExportProcessorOptions; - - return new BatchActivityExportProcessor( - exporter, - batchOptions.MaxQueueSize, - batchOptions.ScheduledDelayMilliseconds, - batchOptions.ExporterTimeoutMilliseconds, - batchOptions.MaxExportBatchSize); - default: - throw new NotSupportedException($"ExportProcessorType '{exportProcessorType}' is not supported."); - } - } } } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs index 0144a56daf8..dc7fb2804f9 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs @@ -16,7 +16,6 @@ #nullable enable -using System; using Microsoft.Extensions.DependencyInjection; namespace OpenTelemetry.Trace @@ -32,10 +31,8 @@ public TracerProviderBuilderSdk(IServiceCollection services) { } - internal TracerProviderBuilderSdk( - IServiceProvider serviceProvider, - TracerProviderBuilderState state) - : base(serviceProvider, state) + internal TracerProviderBuilderSdk(TracerProviderBuilderState state) + : base(state) { } } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs index 290c0c5be9f..bb845857004 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs @@ -30,7 +30,7 @@ internal static IServiceCollection RegisterConfigureBuilderCallback( return RegisterConfigureStateCallback( services, - (sp, state) => configure(sp, new TracerProviderBuilderSdk(sp, state))); + (sp, state) => configure(sp, state.Builder)); } internal static IServiceCollection RegisterConfigureStateCallback( diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs index ee0da80d199..0f6be92701a 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs @@ -29,6 +29,7 @@ namespace OpenTelemetry.Trace /// internal sealed class TracerProviderBuilderState { + internal readonly IServiceProvider ServiceProvider; internal readonly List Instrumentation = new(); internal readonly List> Processors = new(); internal readonly List Sources = new(); @@ -37,6 +38,17 @@ internal sealed class TracerProviderBuilderState internal Sampler? Sampler; internal bool SetErrorStatusOnException; + private TracerProviderBuilderSdk? builder; + + public TracerProviderBuilderState(IServiceProvider serviceProvider) + { + Debug.Assert(serviceProvider != null, "serviceProvider was null"); + + this.ServiceProvider = serviceProvider!; + } + + public TracerProviderBuilderSdk Builder => this.builder ??= new TracerProviderBuilderSdk(this); + public void AddInstrumentation( string instrumentationName, string instrumentationVersion, diff --git a/src/OpenTelemetry/Trace/TracerProviderSdk.cs b/src/OpenTelemetry/Trace/TracerProviderSdk.cs index 3928558ff4c..19481c94e09 100644 --- a/src/OpenTelemetry/Trace/TracerProviderSdk.cs +++ b/src/OpenTelemetry/Trace/TracerProviderSdk.cs @@ -49,7 +49,7 @@ internal TracerProviderSdk( Debug.Assert(this.ownedServiceProvider != null, "serviceProvider was not IDisposable"); } - var state = new TracerProviderBuilderState(); + var state = new TracerProviderBuilderState(serviceProvider); TracerProviderBuilderServiceCollectionHelper.InvokeRegisteredConfigureStateCallbacks( serviceProvider, From 8be5f98177ff6296801d8694972439393748d238 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Mon, 15 Aug 2022 11:27:01 -0700 Subject: [PATCH 18/30] Added "UseOpenTelemetry" extensions. --- examples/AspNetCore/Program.cs | 2 +- examples/GrpcService/Startup.cs | 4 +- .../MicroserviceExample/WebApi/Startup.cs | 4 +- .../WorkerService/Program.cs | 21 +++-- .../netstandard2.0/PublicAPI.Unshipped.txt | 4 + .../CHANGELOG.md | 7 +- .../Implementation/TelemetryHostedService.cs | 61 ++++++++------- .../OpenTelemetryHostExtensions.cs | 70 +++++++++++++++++ .../OpenTelemetryServicesExtensions.cs | 53 +------------ .../.publicApi/net462/PublicAPI.Unshipped.txt | 3 + .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 3 + .../netstandard2.0/PublicAPI.Unshipped.txt | 3 + .../netstandard2.1/PublicAPI.Unshipped.txt | 3 + ...viderBuilderServiceCollectionExtensions.cs | 76 +++++++++++++++++++ 14 files changed, 219 insertions(+), 95 deletions(-) create mode 100644 src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs create mode 100644 src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs diff --git a/examples/AspNetCore/Program.cs b/examples/AspNetCore/Program.cs index ed5a4fdef4b..20b03bfb060 100644 --- a/examples/AspNetCore/Program.cs +++ b/examples/AspNetCore/Program.cs @@ -42,7 +42,7 @@ serviceName, serviceVersion: assemblyVersion, serviceInstanceId: Environment.MachineName); // Traces -builder.Services.AddOpenTelemetryTracing(options => +builder.Host.UseOpenTelemetryTracing(options => { options .ConfigureResource(configureResource) diff --git a/examples/GrpcService/Startup.cs b/examples/GrpcService/Startup.cs index c7034011b02..dfa539b29dd 100644 --- a/examples/GrpcService/Startup.cs +++ b/examples/GrpcService/Startup.cs @@ -69,8 +69,10 @@ public void ConfigureServices(IServiceCollection services) } } - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + public void Configure(IApplicationBuilder app, IHost host, IWebHostEnvironment env) { + host.UseOpenTelemetry(); + if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); diff --git a/examples/MicroserviceExample/WebApi/Startup.cs b/examples/MicroserviceExample/WebApi/Startup.cs index a7664f00ccf..43aa011d12d 100644 --- a/examples/MicroserviceExample/WebApi/Startup.cs +++ b/examples/MicroserviceExample/WebApi/Startup.cs @@ -50,8 +50,10 @@ public void ConfigureServices(IServiceCollection services) })); } - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + public void Configure(IApplicationBuilder app, IHost host, IWebHostEnvironment env) { + host.UseOpenTelemetry(); + if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); diff --git a/examples/MicroserviceExample/WorkerService/Program.cs b/examples/MicroserviceExample/WorkerService/Program.cs index d037e727cfb..e9beeb91db1 100644 --- a/examples/MicroserviceExample/WorkerService/Program.cs +++ b/examples/MicroserviceExample/WorkerService/Program.cs @@ -36,17 +36,16 @@ public static IHostBuilder CreateHostBuilder(string[] args) => services.AddHostedService(); services.AddSingleton(); - - services.AddOpenTelemetryTracing((builder) => - { - builder - .AddSource(nameof(MessageReceiver)) - .AddZipkinExporter(b => - { - var zipkinHostName = Environment.GetEnvironmentVariable("ZIPKIN_HOSTNAME") ?? "localhost"; - b.Endpoint = new Uri($"http://{zipkinHostName}:9411/api/v2/spans"); - }); - }); + }) + .UseOpenTelemetryTracing(builder => + { + builder + .AddSource(nameof(MessageReceiver)) + .AddZipkinExporter(b => + { + var zipkinHostName = Environment.GetEnvironmentVariable("ZIPKIN_HOSTNAME") ?? "localhost"; + b.Endpoint = new Uri($"http://{zipkinHostName}:9411/api/v2/spans"); + }); }); } } diff --git a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 066b671ddd1..57582a92613 100644 --- a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,9 +1,13 @@ Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions +Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions OpenTelemetry.Metrics.MeterProviderBuilderExtensions static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection +static Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions.UseOpenTelemetry(this Microsoft.Extensions.Hosting.IHost host) -> Microsoft.Extensions.Hosting.IHost +static Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions.UseOpenTelemetryTracing(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder) -> Microsoft.Extensions.Hosting.IHostBuilder +static Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions.UseOpenTelemetryTracing(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, System.Action configure) -> Microsoft.Extensions.Hosting.IHostBuilder static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.Build(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.IServiceProvider serviceProvider) -> OpenTelemetry.Metrics.MeterProvider diff --git a/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md index 957bfd30744..ac44b76aae0 100644 --- a/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md +++ b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md @@ -2,8 +2,11 @@ ## Unreleased -* Moved some of the dependency injection support when configuring - `TracerProvider` into the SDK +* **BREAKING CHANGE** Dependency injection support when configuring + `TracerProvider` has been moved into the SDK. Call + `IHostBuilder.UseOpenTelemetryTracing` to automatically register and start the + `TracerProvider` or `IServiceCollection.AddOpenTelemetryTracing` to register + and `IHost.UseOpenTelemetry` to start the `TracerProvider` ([#3533](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3533)) ## 1.0.0-rc9.5 diff --git a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs index 27db97399e1..7b3c0d66757 100644 --- a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs +++ b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs @@ -15,6 +15,7 @@ // using System; +using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -22,42 +23,48 @@ using OpenTelemetry.Metrics; using OpenTelemetry.Trace; -namespace OpenTelemetry.Extensions.Hosting.Implementation +namespace OpenTelemetry.Extensions.Hosting.Implementation; + +internal sealed class TelemetryHostedService : IHostedService { - internal sealed class TelemetryHostedService : IHostedService + private readonly IServiceProvider serviceProvider; + + public TelemetryHostedService(IServiceProvider serviceProvider) { - private readonly IServiceProvider serviceProvider; + this.serviceProvider = serviceProvider; + } - public TelemetryHostedService(IServiceProvider serviceProvider) + public Task StartAsync(CancellationToken cancellationToken) + { + try { - this.serviceProvider = serviceProvider; + // The sole purpose of this HostedService is to ensure all + // instrumentations, exporters, etc., are created and started. + Initialize(this.serviceProvider); } - - public Task StartAsync(CancellationToken cancellationToken) + catch (Exception ex) { - try - { - // The sole purpose of this HostedService is to ensure all - // instrumentations, exporters, etc., are created and started. - var meterProvider = this.serviceProvider.GetService(); - var tracerProvider = this.serviceProvider.GetService(); - - if (meterProvider == null && tracerProvider == null) - { - throw new InvalidOperationException("Could not resolve either MeterProvider or TracerProvider through application ServiceProvider, OpenTelemetry SDK has not been initialized."); - } - } - catch (Exception ex) - { - HostingExtensionsEventSource.Log.FailedOpenTelemetrySDK(ex); - } - - return Task.CompletedTask; + HostingExtensionsEventSource.Log.FailedOpenTelemetrySDK(ex); } - public Task StopAsync(CancellationToken cancellationToken) + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + + internal static void Initialize(IServiceProvider serviceProvider) + { + Debug.Assert(serviceProvider != null, "serviceProvider was null"); + + var meterProvider = serviceProvider.GetService(); + var tracerProvider = serviceProvider.GetService(); + + if (meterProvider == null && tracerProvider == null) { - return Task.CompletedTask; + throw new InvalidOperationException("Could not resolve either MeterProvider or TracerProvider through application ServiceProvider, OpenTelemetry SDK has not been initialized."); } } } diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs new file mode 100644 index 00000000000..92266c23b0f --- /dev/null +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs @@ -0,0 +1,70 @@ +// +// 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 Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using OpenTelemetry.Extensions.Hosting.Implementation; +using OpenTelemetry.Internal; +using OpenTelemetry.Trace; + +namespace Microsoft.Extensions.Hosting; + +/// +/// Extension methods for using OpenTelemetry in an application to collect telemetry. +/// +public static class OpenTelemetryHostExtensions +{ + /// + /// Register and automatically start services required to collect OpenTelemetry traces. + /// + /// . + /// Supplied for chaining calls. + public static IHostBuilder UseOpenTelemetryTracing(this IHostBuilder hostBuilder) + => UseOpenTelemetryTracing(hostBuilder, (b) => { }); + + /// + /// Register and automatically start services required to collect OpenTelemetry traces. + /// + /// . + /// Callback action to configure the . + /// Supplied for chaining calls. + public static IHostBuilder UseOpenTelemetryTracing(this IHostBuilder hostBuilder, Action configure) + { + Guard.ThrowIfNull(hostBuilder); + + return hostBuilder.ConfigureServices((hostBuilderContext, services) => + { + services.AddOpenTelemetryTracing(configure); + + services.TryAddEnumerable(ServiceDescriptor.Singleton()); + }); + } + + /// + /// Start OpenTelemetry tracing and/or metric collection. + /// + /// . + /// Supplied for chaining calls. + public static IHost UseOpenTelemetry(this IHost host) + { + Guard.ThrowIfNull(host); + + TelemetryHostedService.Initialize(host.Services); + + return host; + } +} diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index bf6b2ed6237..4878e8d5576 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -31,58 +31,7 @@ namespace Microsoft.Extensions.DependencyInjection /// public static class OpenTelemetryServicesExtensions { - /// - /// Adds OpenTelemetry TracerProvider to the specified . - /// - /// - /// Notes: This is safe to be called multiple times and by library - /// authors. Only a single will be created - /// for a given . - /// - /// The to add services to. - /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) - => AddOpenTelemetryTracing(services, (b) => { }); - - /// - /// Adds OpenTelemetry TracerProvider to the specified . - /// - /// - /// Notes: This is safe to be called multiple times and by library - /// authors. Only a single will be created - /// for a given . - /// - /// The to add services to. - /// Callback action to configure the . - /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action configure) - { - Guard.ThrowIfNull(services); - Guard.ThrowIfNull(configure); - - // Accessing Sdk class is just to trigger its static ctor, - // which sets default Propagators and default Activity Id format - _ = Sdk.SuppressInstrumentation; - - // Note: We need to create a builder even if there is no configure - // because the builder will register services - var builder = new TracerProviderBuilderHosting(services); - - configure(builder); - - try - { - services.TryAddEnumerable(ServiceDescriptor.Singleton()); - } - catch (Exception ex) - { - HostingExtensionsEventSource.Log.FailedInitialize(ex); - } - - return services; - } - - /// + /// /// Adds OpenTelemetry MeterProvider to the specified . /// /// The to add services to. diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index 29ee293f744..f260d409049 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -1,3 +1,4 @@ +Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -43,5 +44,7 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.GetServices(this Open static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! +~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection +~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index 29ee293f744..f260d409049 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -1,3 +1,4 @@ +Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -43,5 +44,7 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.GetServices(this Open static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! +~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection +~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 6f483b10271..ae7e75bcc95 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,3 +1,4 @@ +Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -43,5 +44,7 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.GetServices(this Open static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! +~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection +~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index 29ee293f744..f260d409049 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -1,3 +1,4 @@ +Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -43,5 +44,7 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.GetServices(this Open static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! +~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection +~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs new file mode 100644 index 00000000000..df67a1da3c8 --- /dev/null +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs @@ -0,0 +1,76 @@ +// +// 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 OpenTelemetry; +using OpenTelemetry.Internal; +using OpenTelemetry.Trace; + +namespace Microsoft.Extensions.DependencyInjection; + +/// +/// Extension methods for setting up OpenTelemetry tracing services in an . +/// +public static class TracerProviderBuilderServiceCollectionExtensions +{ + /// + /// Adds OpenTelemetry tracing services to the specified . + /// + /// + /// Notes: + /// + /// A will not be created automatically + /// using this method. Either use the + /// IHostBuilder.UseOpenTelemetryTracing or + /// IHost.UseOpenTelemetry extension in the + /// OpenTelemetry.Extensions.Hosting package or access the through the application to begin collecting traces. + /// This is safe to be called multiple times and by library authors. + /// Only a single will be created for a given + /// . + /// + /// + /// The to add services to. + /// The so that additional calls can be chained. + public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) + => AddOpenTelemetryTracing(services, (b) => { }); + + /// + /// Adds OpenTelemetry tracing services to the specified . + /// + /// + /// The to add services to. + /// Callback action to configure the . + /// The so that additional calls can be chained. + public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action configure) + { + Guard.ThrowIfNull(services); + Guard.ThrowIfNull(configure); + + // Accessing Sdk class is just to trigger its static ctor, + // which sets default Propagators and default Activity Id format + _ = Sdk.SuppressInstrumentation; + + // Note: We need to create a builder even if there is no configure + // because the builder will register services + var builder = new TracerProviderBuilderSdk(services); + + configure(builder); + + return services; + } +} From 9e027974fb7db00264aa4f2069e0d422184c2f15 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Mon, 15 Aug 2022 12:55:48 -0700 Subject: [PATCH 19/30] Cleanup. --- .../netstandard2.0/PublicAPI.Unshipped.txt | 2 -- .../OpenTelemetryServicesExtensions.cs | 8 ------- .../.publicApi/net462/PublicAPI.Unshipped.txt | 1 - .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 1 - .../netstandard2.0/PublicAPI.Unshipped.txt | 1 - .../netstandard2.1/PublicAPI.Unshipped.txt | 1 - .../Builder/TracerProviderBuilderBase.cs | 24 +++++++++---------- .../Trace/Builder/TracerProviderBuilderSdk.cs | 2 +- 8 files changed, 13 insertions(+), 27 deletions(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 57582a92613..5f10fb1ec61 100644 --- a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -3,8 +3,6 @@ Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions OpenTelemetry.Metrics.MeterProviderBuilderExtensions static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions.UseOpenTelemetry(this Microsoft.Extensions.Hosting.IHost host) -> Microsoft.Extensions.Hosting.IHost static Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions.UseOpenTelemetryTracing(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder) -> Microsoft.Extensions.Hosting.IHostBuilder static Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions.UseOpenTelemetryTracing(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, System.Action configure) -> Microsoft.Extensions.Hosting.IHostBuilder diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index 4878e8d5576..7deba0c696c 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -83,13 +83,5 @@ private static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollectio return services; } - - private sealed class TracerProviderBuilderHosting : TracerProviderBuilderBase - { - public TracerProviderBuilderHosting(IServiceCollection services) - : base(services) - { - } - } } } diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index f260d409049..002d698814c 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -26,7 +26,6 @@ OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.s OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void -OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index f260d409049..002d698814c 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -26,7 +26,6 @@ OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.s OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void -OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index ae7e75bcc95..2b1857a9496 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -26,7 +26,6 @@ OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.s OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void -OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index f260d409049..002d698814c 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -26,7 +26,6 @@ OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.s OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void -OpenTelemetry.Trace.TracerProviderBuilderBase.TracerProviderBuilderBase(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder! diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index 598fffc8015..8e4dd27f62d 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -44,30 +44,30 @@ internal TracerProviderBuilderBase(TracerProviderBuilderState state) this.state = state; } - // This ctor is for Sdk.CreateTracerProviderBuilder where the builder - // owns its services and service provider. - protected TracerProviderBuilderBase() + // This ctor is for AddOpenTelemetryTracing scenario where the builder + // is bound to an external service collection. + internal TracerProviderBuilderBase(IServiceCollection services) { - var services = new ServiceCollection(); + Guard.ThrowIfNull(services); services.AddOptions(); - services.TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: true)); + services.TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: false)); this.services = services; - this.ownsServices = true; + this.ownsServices = false; } - // This ctor is for hosting scenarios where the builder is bound to an - // external service collection. - protected TracerProviderBuilderBase(IServiceCollection services) + // This ctor is for Sdk.CreateTracerProviderBuilder where the builder + // owns its services and service provider. + protected TracerProviderBuilderBase() { - Guard.ThrowIfNull(services); + var services = new ServiceCollection(); services.AddOptions(); - services.TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: false)); + services.TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: true)); this.services = services; - this.ownsServices = false; + this.ownsServices = true; } /// diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs index dc7fb2804f9..a13d105e8db 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs @@ -31,7 +31,7 @@ public TracerProviderBuilderSdk(IServiceCollection services) { } - internal TracerProviderBuilderSdk(TracerProviderBuilderState state) + public TracerProviderBuilderSdk(TracerProviderBuilderState state) : base(state) { } From b458552f6e737c7006121cec5ee759cefeba2491 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Tue, 16 Aug 2022 17:17:58 -0700 Subject: [PATCH 20/30] Code review. --- examples/AspNetCore/Program.cs | 5 +++- .../netstandard2.0/PublicAPI.Unshipped.txt | 2 -- .../OpenTelemetryHostExtensions.cs | 30 ------------------- 3 files changed, 4 insertions(+), 33 deletions(-) diff --git a/examples/AspNetCore/Program.cs b/examples/AspNetCore/Program.cs index 20b03bfb060..f8a245eb613 100644 --- a/examples/AspNetCore/Program.cs +++ b/examples/AspNetCore/Program.cs @@ -42,7 +42,7 @@ serviceName, serviceVersion: assemblyVersion, serviceInstanceId: Environment.MachineName); // Traces -builder.Host.UseOpenTelemetryTracing(options => +builder.Services.AddOpenTelemetryTracing(options => { options .ConfigureResource(configureResource) @@ -150,6 +150,9 @@ var app = builder.Build(); +// Start collection of OpenTelemetry traces & metrics +app.UseOpenTelemetry(); + // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { diff --git a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 5f10fb1ec61..a069b0267d6 100644 --- a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -4,8 +4,6 @@ OpenTelemetry.Metrics.MeterProviderBuilderExtensions static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions.UseOpenTelemetry(this Microsoft.Extensions.Hosting.IHost host) -> Microsoft.Extensions.Hosting.IHost -static Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions.UseOpenTelemetryTracing(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder) -> Microsoft.Extensions.Hosting.IHostBuilder -static Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions.UseOpenTelemetryTracing(this Microsoft.Extensions.Hosting.IHostBuilder hostBuilder, System.Action configure) -> Microsoft.Extensions.Hosting.IHostBuilder static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.Build(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.IServiceProvider serviceProvider) -> OpenTelemetry.Metrics.MeterProvider diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs index 92266c23b0f..9968a431005 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs @@ -14,12 +14,8 @@ // limitations under the License. // -using System; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using OpenTelemetry.Extensions.Hosting.Implementation; using OpenTelemetry.Internal; -using OpenTelemetry.Trace; namespace Microsoft.Extensions.Hosting; @@ -28,32 +24,6 @@ namespace Microsoft.Extensions.Hosting; /// public static class OpenTelemetryHostExtensions { - /// - /// Register and automatically start services required to collect OpenTelemetry traces. - /// - /// . - /// Supplied for chaining calls. - public static IHostBuilder UseOpenTelemetryTracing(this IHostBuilder hostBuilder) - => UseOpenTelemetryTracing(hostBuilder, (b) => { }); - - /// - /// Register and automatically start services required to collect OpenTelemetry traces. - /// - /// . - /// Callback action to configure the . - /// Supplied for chaining calls. - public static IHostBuilder UseOpenTelemetryTracing(this IHostBuilder hostBuilder, Action configure) - { - Guard.ThrowIfNull(hostBuilder); - - return hostBuilder.ConfigureServices((hostBuilderContext, services) => - { - services.AddOpenTelemetryTracing(configure); - - services.TryAddEnumerable(ServiceDescriptor.Singleton()); - }); - } - /// /// Start OpenTelemetry tracing and/or metric collection. /// From 489ae0cd383c19666f2b8ab507330235c3685e7e Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Tue, 16 Aug 2022 17:18:05 -0700 Subject: [PATCH 21/30] Code review. --- .../WorkerService/Program.cs | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/examples/MicroserviceExample/WorkerService/Program.cs b/examples/MicroserviceExample/WorkerService/Program.cs index e9beeb91db1..71fa54aafb5 100644 --- a/examples/MicroserviceExample/WorkerService/Program.cs +++ b/examples/MicroserviceExample/WorkerService/Program.cs @@ -26,7 +26,11 @@ public class Program { public static void Main(string[] args) { - CreateHostBuilder(args).Build().Run(); + var host = CreateHostBuilder(args).Build(); + + host + .UseOpenTelemetry() + .Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => @@ -36,16 +40,17 @@ public static IHostBuilder CreateHostBuilder(string[] args) => services.AddHostedService(); services.AddSingleton(); - }) - .UseOpenTelemetryTracing(builder => - { - builder - .AddSource(nameof(MessageReceiver)) - .AddZipkinExporter(b => - { - var zipkinHostName = Environment.GetEnvironmentVariable("ZIPKIN_HOSTNAME") ?? "localhost"; - b.Endpoint = new Uri($"http://{zipkinHostName}:9411/api/v2/spans"); - }); + + services.AddOpenTelemetryTracing(builder => + { + builder + .AddSource(nameof(MessageReceiver)) + .AddZipkinExporter(b => + { + var zipkinHostName = Environment.GetEnvironmentVariable("ZIPKIN_HOSTNAME") ?? "localhost"; + b.Endpoint = new Uri($"http://{zipkinHostName}:9411/api/v2/spans"); + }); + }); }); } } From d953928a2a0dbde42922924c368d1c3a0b91bf44 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 17 Aug 2022 11:35:46 -0700 Subject: [PATCH 22/30] Rename SDK extension "Configure" and restore "Add" in the hosting lib. --- examples/AspNetCore/Program.cs | 3 -- examples/GrpcService/Startup.cs | 4 +- .../MicroserviceExample/WebApi/Startup.cs | 4 +- .../WorkerService/Program.cs | 6 +-- .../netstandard2.0/PublicAPI.Unshipped.txt | 4 +- .../OpenTelemetry.Extensions.Hosting.csproj | 4 +- .../OpenTelemetryHostExtensions.cs | 40 ------------------- .../OpenTelemetryServicesExtensions.cs | 31 +++++++++++++- .../.publicApi/net462/PublicAPI.Unshipped.txt | 4 +- .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 4 +- .../netstandard2.0/PublicAPI.Unshipped.txt | 4 +- .../netstandard2.1/PublicAPI.Unshipped.txt | 4 +- .../Builder/TracerProviderBuilderBase.cs | 2 +- ...viderBuilderServiceCollectionExtensions.cs | 17 ++++---- ...rProviderBuilderServiceCollectionHelper.cs | 10 +++-- 15 files changed, 61 insertions(+), 80 deletions(-) delete mode 100644 src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs diff --git a/examples/AspNetCore/Program.cs b/examples/AspNetCore/Program.cs index f8a245eb613..ed5a4fdef4b 100644 --- a/examples/AspNetCore/Program.cs +++ b/examples/AspNetCore/Program.cs @@ -150,9 +150,6 @@ var app = builder.Build(); -// Start collection of OpenTelemetry traces & metrics -app.UseOpenTelemetry(); - // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { diff --git a/examples/GrpcService/Startup.cs b/examples/GrpcService/Startup.cs index dfa539b29dd..c7034011b02 100644 --- a/examples/GrpcService/Startup.cs +++ b/examples/GrpcService/Startup.cs @@ -69,10 +69,8 @@ public void ConfigureServices(IServiceCollection services) } } - public void Configure(IApplicationBuilder app, IHost host, IWebHostEnvironment env) + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - host.UseOpenTelemetry(); - if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); diff --git a/examples/MicroserviceExample/WebApi/Startup.cs b/examples/MicroserviceExample/WebApi/Startup.cs index 43aa011d12d..a7664f00ccf 100644 --- a/examples/MicroserviceExample/WebApi/Startup.cs +++ b/examples/MicroserviceExample/WebApi/Startup.cs @@ -50,10 +50,8 @@ public void ConfigureServices(IServiceCollection services) })); } - public void Configure(IApplicationBuilder app, IHost host, IWebHostEnvironment env) + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { - host.UseOpenTelemetry(); - if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); diff --git a/examples/MicroserviceExample/WorkerService/Program.cs b/examples/MicroserviceExample/WorkerService/Program.cs index 71fa54aafb5..88a8cfd8dcf 100644 --- a/examples/MicroserviceExample/WorkerService/Program.cs +++ b/examples/MicroserviceExample/WorkerService/Program.cs @@ -26,11 +26,7 @@ public class Program { public static void Main(string[] args) { - var host = CreateHostBuilder(args).Build(); - - host - .UseOpenTelemetry() - .Run(); + CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => diff --git a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index a069b0267d6..066b671ddd1 100644 --- a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,9 +1,9 @@ Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions -Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions OpenTelemetry.Metrics.MeterProviderBuilderExtensions static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -static Microsoft.Extensions.Hosting.OpenTelemetryHostExtensions.UseOpenTelemetry(this Microsoft.Extensions.Hosting.IHost host) -> Microsoft.Extensions.Hosting.IHost +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.Build(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.IServiceProvider serviceProvider) -> OpenTelemetry.Metrics.MeterProvider diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj index 07f3e10f052..9982a27f0da 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj @@ -1,8 +1,8 @@ - + netstandard2.0 - Startup extensions to register OpenTelemetry into the applications using Microsoft.Extensions.DependencyInjection and Microsoft.Extensions.Hosting + Contains extensions to register and start OpenTelemetry in applications using Microsoft.Extensions.Hosting OpenTelemetry diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs deleted file mode 100644 index 9968a431005..00000000000 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryHostExtensions.cs +++ /dev/null @@ -1,40 +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 OpenTelemetry.Extensions.Hosting.Implementation; -using OpenTelemetry.Internal; - -namespace Microsoft.Extensions.Hosting; - -/// -/// Extension methods for using OpenTelemetry in an application to collect telemetry. -/// -public static class OpenTelemetryHostExtensions -{ - /// - /// Start OpenTelemetry tracing and/or metric collection. - /// - /// . - /// Supplied for chaining calls. - public static IHost UseOpenTelemetry(this IHost host) - { - Guard.ThrowIfNull(host); - - TelemetryHostedService.Initialize(host.Services); - - return host; - } -} diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index 7deba0c696c..89a3427a154 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -31,7 +31,36 @@ namespace Microsoft.Extensions.DependencyInjection /// public static class OpenTelemetryServicesExtensions { - /// + /// + /// Configure OpenTelemetry and register a + /// to automatically start tracing services in the supplied . + /// + /// . + /// Supplied for chaining calls. + public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) + => AddOpenTelemetryTracing(services, (b) => { }); + + /// + /// Configure OpenTelemetry and register a + /// to automatically start tracing services in the supplied . + /// + /// . + /// Callback action to configure the . + /// Supplied for chaining calls. + public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action configure) + { + Guard.ThrowIfNull(services); + + services.ConfigureOpenTelemetryTracing(configure); + + services.TryAddEnumerable(ServiceDescriptor.Singleton()); + + return services; + } + + /// /// Adds OpenTelemetry MeterProvider to the specified . /// /// The to add services to. diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index 002d698814c..599397f7aac 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -43,7 +43,7 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.GetServices(this Open static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! -~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection +static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index 002d698814c..599397f7aac 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -43,7 +43,7 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.GetServices(this Open static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! -~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection +static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 2b1857a9496..4f87f710807 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -43,7 +43,7 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.GetServices(this Open static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! -~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection +static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index 002d698814c..599397f7aac 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -43,7 +43,7 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.GetServices(this Open static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! -~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -~static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection +static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! ~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index 8e4dd27f62d..894a250d96c 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -321,7 +321,7 @@ private TracerProviderBuilder ConfigureState(Action TracerProviderBuilderServiceCollectionHelper.RegisterConfigureStateCallback(services, configure)); + this.ConfigureServices(services => TracerProviderBuilderServiceCollectionHelper.RegisterConfigureStateCallback(services, configure!)); } return this; diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs index df67a1da3c8..8b37f9080fb 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs @@ -14,6 +14,8 @@ // limitations under the License. // +#nullable enable + using System; using OpenTelemetry; using OpenTelemetry.Internal; @@ -27,15 +29,14 @@ namespace Microsoft.Extensions.DependencyInjection; public static class TracerProviderBuilderServiceCollectionExtensions { /// - /// Adds OpenTelemetry tracing services to the specified . + /// Configures OpenTelemetry tracing services in the supplied . /// /// /// Notes: /// /// A will not be created automatically /// using this method. Either use the - /// IHostBuilder.UseOpenTelemetryTracing or - /// IHost.UseOpenTelemetry extension in the + /// IServiceCollection.AddOpenTelemetryTracing extension in the /// OpenTelemetry.Extensions.Hosting package or access the through the application to begin collecting traces. @@ -46,17 +47,17 @@ public static class TracerProviderBuilderServiceCollectionExtensions /// /// The to add services to. /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) - => AddOpenTelemetryTracing(services, (b) => { }); + public static IServiceCollection ConfigureOpenTelemetryTracing(this IServiceCollection services) + => ConfigureOpenTelemetryTracing(services, (b) => { }); /// - /// Adds OpenTelemetry tracing services to the specified . + /// Configures OpenTelemetry tracing services in the supplied . /// - /// + /// /// The to add services to. /// Callback action to configure the . /// The so that additional calls can be chained. - public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action configure) + public static IServiceCollection ConfigureOpenTelemetryTracing(this IServiceCollection services, Action configure) { Guard.ThrowIfNull(services); Guard.ThrowIfNull(configure); diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs index bb845857004..ae68e0881b5 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs @@ -14,6 +14,8 @@ // limitations under the License. // +#nullable enable + using System; using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; @@ -30,7 +32,7 @@ internal static IServiceCollection RegisterConfigureBuilderCallback( return RegisterConfigureStateCallback( services, - (sp, state) => configure(sp, state.Builder)); + (sp, state) => configure!(sp, state.Builder)); } internal static IServiceCollection RegisterConfigureStateCallback( @@ -40,7 +42,7 @@ internal static IServiceCollection RegisterConfigureStateCallback( Debug.Assert(services != null, "services was null"); Debug.Assert(configure != null, "configure was null"); - return services.AddSingleton(new ConfigureTracerProviderBuilderStateCallbackRegistration(configure)); + return services.AddSingleton(new ConfigureTracerProviderBuilderStateCallbackRegistration(configure!)); } internal static void InvokeRegisteredConfigureStateCallbacks( @@ -54,7 +56,7 @@ internal static void InvokeRegisteredConfigureStateCallbacks( foreach (var callbackRegistration in callbackRegistrations) { - callbackRegistration.Configure(serviceProvider, state); + callbackRegistration.Configure(serviceProvider!, state!); } } @@ -73,7 +75,7 @@ public void Configure(IServiceProvider serviceProvider, TracerProviderBuilderSta Debug.Assert(serviceProvider != null, "serviceProvider was null"); Debug.Assert(state != null, "state was null"); - this.configure(serviceProvider, state); + this.configure(serviceProvider!, state!); } } } From 57e3b4926278ca37073576812da451811713b62b Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 19 Aug 2022 11:23:40 -0700 Subject: [PATCH 23/30] Doc clarification. --- .../OpenTelemetryServicesExtensions.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index 89a3427a154..44a41e1e5c2 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -36,6 +36,11 @@ public static class OpenTelemetryServicesExtensions /// to automatically start tracing services in the supplied . /// + /// + /// Note: This is safe to be called multiple times and by library authors. + /// Only a single will be created for a given + /// . + /// /// . /// Supplied for chaining calls. public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) @@ -46,6 +51,7 @@ public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection /// to automatically start tracing services in the supplied . /// + /// /// . /// Callback action to configure the . /// Supplied for chaining calls. From 6467f6dd947d6a13f2dd5b8c616e608d80a2b315 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 19 Aug 2022 13:17:48 -0700 Subject: [PATCH 24/30] Some test coverage. --- src/OpenTelemetry/Trace/TracerProviderSdk.cs | 14 +- .../TracerProviderBuilderExtensionsTest.cs | 185 ++++++++++++++++++ 2 files changed, 192 insertions(+), 7 deletions(-) diff --git a/src/OpenTelemetry/Trace/TracerProviderSdk.cs b/src/OpenTelemetry/Trace/TracerProviderSdk.cs index 19481c94e09..adf1738b174 100644 --- a/src/OpenTelemetry/Trace/TracerProviderSdk.cs +++ b/src/OpenTelemetry/Trace/TracerProviderSdk.cs @@ -28,16 +28,16 @@ namespace OpenTelemetry.Trace { internal sealed class TracerProviderSdk : TracerProvider { + internal readonly IDisposable? OwnedServiceProvider; internal int ShutdownCount; + internal bool Disposed; private readonly List instrumentations = new(); private readonly ActivityListener listener; private readonly Sampler sampler; private readonly Action getRequestedDataAction; private readonly bool supportLegacyActivity; - private readonly IDisposable? ownedServiceProvider; private BaseProcessor? processor; - private bool disposed; internal TracerProviderSdk( IServiceProvider serviceProvider, @@ -45,8 +45,8 @@ internal TracerProviderSdk( { if (ownsServiceProvider) { - this.ownedServiceProvider = serviceProvider as IDisposable; - Debug.Assert(this.ownedServiceProvider != null, "serviceProvider was not IDisposable"); + this.OwnedServiceProvider = serviceProvider as IDisposable; + Debug.Assert(this.OwnedServiceProvider != null, "serviceProvider was not IDisposable"); } var state = new TracerProviderBuilderState(serviceProvider); @@ -344,7 +344,7 @@ internal bool OnShutdown(int timeoutMilliseconds) protected override void Dispose(bool disposing) { - if (!this.disposed) + if (!this.Disposed) { if (disposing) { @@ -369,10 +369,10 @@ protected override void Dispose(bool disposing) // sessions that were open. this.listener?.Dispose(); - this.ownedServiceProvider?.Dispose(); + this.OwnedServiceProvider?.Dispose(); } - this.disposed = true; + this.Disposed = true; OpenTelemetrySdkEventSource.Log.ProviderDisposed(nameof(TracerProvider)); } diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs index 8464325e3c4..12282c6a035 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs @@ -16,6 +16,9 @@ using System; using System.Diagnostics; +using System.Linq; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Xunit; namespace OpenTelemetry.Trace.Tests @@ -106,5 +109,187 @@ public void SetErrorStatusOnExceptionDefault() Assert.Equal(StatusCode.Unset, activity.GetStatus().StatusCode); } + + [Fact] + public void ServiceLifecycleAvailableToSDKBuilderTest() + { + var builder = Sdk.CreateTracerProviderBuilder(); + + builder.ConfigureServices(services => services.AddSingleton()); + + MyInstrumentation myInstrumentation = null; + + RunBuilderServiceLifecycleTest( + builder, + () => + { + var provider = builder.Build() as TracerProviderSdk; + + Assert.NotNull(provider); + Assert.NotNull(provider.OwnedServiceProvider); + + myInstrumentation = ((IServiceProvider)provider.OwnedServiceProvider).GetRequiredService(); + + return provider; + }, + provider => + { + provider.Dispose(); + }); + + Assert.NotNull(myInstrumentation); + Assert.True(myInstrumentation.Disposed); + } + + [Fact] + public void ServiceLifecycleAvailableToServicesBuilderTest() + { + var services = new ServiceCollection(); + + bool testRun = false; + + ServiceProvider serviceProvider = null; + TracerProviderSdk provider = null; + + services.ConfigureOpenTelemetryTracing(builder => + { + testRun = true; + + RunBuilderServiceLifecycleTest( + builder, + () => + { + // Note: Build can't be called directly on builder tied to external services + Assert.Throws(() => builder.Build()); + + serviceProvider = services.BuildServiceProvider(); + + provider = serviceProvider.GetRequiredService() as TracerProviderSdk; + + Assert.NotNull(provider); + Assert.Null(provider.OwnedServiceProvider); + + return provider; + }, + (provider) => { }); + }); + + Assert.True(testRun); + + Assert.NotNull(serviceProvider); + Assert.NotNull(provider); + + Assert.False(provider.Disposed); + + serviceProvider.Dispose(); + + Assert.True(provider.Disposed); + } + + [Fact] + public void SingleProviderForServiceCollectionTest() + { + var services = new ServiceCollection(); + + services.ConfigureOpenTelemetryTracing(builder => + { + builder.AddInstrumentation(() => new()); + }); + + services.ConfigureOpenTelemetryTracing(builder => + { + builder.AddInstrumentation(() => new()); + }); + + using var serviceProvider = services.BuildServiceProvider(); + + Assert.NotNull(serviceProvider); + + var tracerProviders = serviceProvider.GetServices(); + + Assert.Single(tracerProviders); + + var provider = tracerProviders.First() as TracerProviderSdk; + + Assert.NotNull(provider); + + Assert.Equal(2, provider.Instrumentations.Count); + } + + private static void RunBuilderServiceLifecycleTest( + TracerProviderBuilder builder, + Func buildFunc, + Action postAction) + { + builder.SetSampler(); + + bool configureServicesCalled = false; + builder.ConfigureServices(services => + { + configureServicesCalled = true; + + Assert.NotNull(services); + + services.TryAddSingleton(); + + services.ConfigureOpenTelemetryTracing(b => + { + // Note: This is strange to call ConfigureOpenTelemetryTracing here, but supported + b.AddInstrumentation(); + }); + }); + + int configureBuilderInvocations = 0; + builder.ConfigureBuilder((sp, builder) => + { + configureBuilderInvocations++; + + // Note: Services can't be configured at this stage + Assert.Throws( + () => builder.ConfigureServices(services => services.TryAddSingleton())); + + builder.AddProcessor(sp.GetRequiredService()); + + builder.ConfigureBuilder((_, _) => + { + // Note: ConfigureBuilder calls can be nested, this is supported + configureBuilderInvocations++; + }); + }); + + var provider = buildFunc(); + + Assert.True(configureServicesCalled); + Assert.Equal(2, configureBuilderInvocations); + + Assert.True(provider.Sampler is MySampler); + Assert.Single(provider.Instrumentations); + Assert.True(provider.Instrumentations[0] is MyInstrumentation); + Assert.True(provider.Processor is MyProcessor); + + postAction(provider); + } + + private sealed class MySampler : Sampler + { + public override SamplingResult ShouldSample(in SamplingParameters samplingParameters) + { + return new SamplingResult(SamplingDecision.RecordAndSample); + } + } + + private sealed class MyInstrumentation : IDisposable + { + internal bool Disposed; + + public void Dispose() + { + this.Disposed = true; + } + } + + private sealed class MyProcessor : BaseProcessor + { + } } } From cb37f397481ca7dc46a021b09255243350b33afe Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 19 Aug 2022 13:17:58 -0700 Subject: [PATCH 25/30] README updates. --- .../README.md | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/README.md b/src/OpenTelemetry.Extensions.Hosting/README.md index 0a8ade20781..a1c8341958c 100644 --- a/src/OpenTelemetry.Extensions.Hosting/README.md +++ b/src/OpenTelemetry.Extensions.Hosting/README.md @@ -45,27 +45,27 @@ Similar methods exist for registering instrumentation (`AddInstrumentation`) and setting a sampler (`SetSampler`). You can also access the application `IServiceProvider` directly and accomplish -the same registration using the `Configure` extension like this: +the same registration using the `ConfigureBuilder` extension like this: ```csharp services.AddSingleton(); services.AddOpenTelemetryTracing(hostingBuilder => hostingBuilder - .Configure((sp, builder) => builder + .ConfigureBuilder((sp, builder) => builder .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddProcessor(sp.GetRequiredService()))); ``` -**Note:** `Configure` is called _after_ the `IServiceProvider` has been built +**Note:** `ConfigureBuilder` is called _after_ the `IServiceProvider` has been built from the application `IServiceCollection` so any services registered in the -`Configure` callback will be ignored. +`ConfigureBuilder` callback will be ignored. #### Building Extension Methods Library authors may want to configure the OpenTelemetry `TracerProvider` and register application services to provide more complex features. This can be -accomplished concisely by using the `TracerProviderBuilder.GetServices` +accomplished concisely by using the `TracerProviderBuilder.ConfigureServices` extension method inside of a more general `TracerProviderBuilder` configuration extension like this: @@ -74,15 +74,13 @@ public static class MyLibraryExtensions { public static TracerProviderBuilder AddMyFeature(this TracerProviderBuilder tracerProviderBuilder) { - (tracerProviderBuilder.GetServices() - ?? throw new NotSupportedException( - "MyFeature requires a hosting TracerProviderBuilder instance.")) - .AddHostedService() - .AddSingleton() - .AddSingleton() - .AddSingleton(); - return tracerProviderBuilder + .ConfigureServices(services => + services + .AddHostedService() + .AddSingleton() + .AddSingleton() + .AddSingleton()) .AddProcessor() .SetSampler(); } From ecd1df4915fc280e1a820af9f78070a617e143a8 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 19 Aug 2022 13:35:09 -0700 Subject: [PATCH 26/30] Fix double dispose of TracerProvider when using Sdk.CreateTracerProviderBuilder. --- src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index 894a250d96c..8162b88d979 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -64,7 +64,6 @@ protected TracerProviderBuilderBase() var services = new ServiceCollection(); services.AddOptions(); - services.TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: true)); this.services = services; this.ownsServices = true; @@ -264,7 +263,7 @@ protected TracerProvider Build() var serviceProvider = services.BuildServiceProvider(); - return serviceProvider.GetRequiredService(); + return new TracerProviderSdk(serviceProvider, ownsServiceProvider: true); } private static BaseProcessor BuildExportProcessor( From 59979e224662163d2da01d947d7ca01e86aa5abf Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 19 Aug 2022 14:39:32 -0700 Subject: [PATCH 27/30] AddExporter tests. --- src/OpenTelemetry/BaseExportProcessor.cs | 2 + src/OpenTelemetry/BatchExportProcessor.cs | 11 +-- .../TracerProviderBuilderExtensionsTest.cs | 88 +++++++++++++++++++ 3 files changed, 96 insertions(+), 5 deletions(-) diff --git a/src/OpenTelemetry/BaseExportProcessor.cs b/src/OpenTelemetry/BaseExportProcessor.cs index 7b1b1bbfa06..b989f2381e0 100644 --- a/src/OpenTelemetry/BaseExportProcessor.cs +++ b/src/OpenTelemetry/BaseExportProcessor.cs @@ -62,6 +62,8 @@ protected BaseExportProcessor(BaseExporter exporter) this.exporter = exporter; } + internal BaseExporter Exporter => this.exporter; + /// public sealed override void OnStart(T data) { diff --git a/src/OpenTelemetry/BatchExportProcessor.cs b/src/OpenTelemetry/BatchExportProcessor.cs index 5fdc2c8893f..f0231cc15f5 100644 --- a/src/OpenTelemetry/BatchExportProcessor.cs +++ b/src/OpenTelemetry/BatchExportProcessor.cs @@ -36,10 +36,11 @@ public abstract class BatchExportProcessor : BaseExportProcessor internal const int DefaultExporterTimeoutMilliseconds = 30000; internal const int DefaultMaxExportBatchSize = 512; + internal readonly int MaxExportBatchSize; + private readonly CircularBuffer circularBuffer; private readonly int scheduledDelayMilliseconds; private readonly int exporterTimeoutMilliseconds; - private readonly int maxExportBatchSize; private readonly Thread exporterThread; private readonly AutoResetEvent exportTrigger = new(false); private readonly ManualResetEvent dataExportedNotification = new(false); @@ -72,7 +73,7 @@ protected BatchExportProcessor( this.circularBuffer = new CircularBuffer(maxQueueSize); this.scheduledDelayMilliseconds = scheduledDelayMilliseconds; this.exporterTimeoutMilliseconds = exporterTimeoutMilliseconds; - this.maxExportBatchSize = maxExportBatchSize; + this.MaxExportBatchSize = maxExportBatchSize; this.exporterThread = new Thread(new ThreadStart(this.ExporterProc)) { IsBackground = true, @@ -101,7 +102,7 @@ internal bool TryExport(T data) { if (this.circularBuffer.TryAdd(data, maxSpinCount: 50000)) { - if (this.circularBuffer.Count >= this.maxExportBatchSize) + if (this.circularBuffer.Count >= this.MaxExportBatchSize) { try { @@ -264,7 +265,7 @@ private void ExporterProc() while (true) { // only wait when the queue doesn't have enough items, otherwise keep busy and send data continuously - if (this.circularBuffer.Count < this.maxExportBatchSize) + if (this.circularBuffer.Count < this.MaxExportBatchSize) { try { @@ -279,7 +280,7 @@ private void ExporterProc() if (this.circularBuffer.Count > 0) { - using (var batch = new Batch(this.circularBuffer, this.maxExportBatchSize)) + using (var batch = new Batch(this.circularBuffer, this.MaxExportBatchSize)) { this.exporter.Export(batch); } diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs index 12282c6a035..871f849117d 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs @@ -216,6 +216,86 @@ public void SingleProviderForServiceCollectionTest() Assert.Equal(2, provider.Instrumentations.Count); } + [Fact] + public void AddExporterTest() + { + var builder = Sdk.CreateTracerProviderBuilder(); + + builder.AddExporter(ExportProcessorType.Simple, new MyExporter()); + builder.AddExporter(ExportProcessorType.Batch); + + using var provider = builder.Build() as TracerProviderSdk; + + Assert.NotNull(provider); + + var processor = provider.Processor as CompositeProcessor; + + Assert.NotNull(processor); + + var firstProcessor = processor.Head.Value; + var secondProcessor = processor.Head.Next?.Value; + + Assert.True(firstProcessor is SimpleActivityExportProcessor simpleProcessor && simpleProcessor.Exporter is MyExporter); + Assert.True(secondProcessor is BatchActivityExportProcessor batchProcessor && batchProcessor.Exporter is MyExporter); + } + + [Fact] + public void AddExporterWithOptionsTest() + { + int optionsInvocations = 0; + + var builder = Sdk.CreateTracerProviderBuilder(); + + builder.ConfigureServices(services => + { + services.Configure(options => + { + // Note: This is testing options integration + + optionsInvocations++; + + options.MaxExportBatchSize = 18; + }); + }); + + builder.AddExporter( + ExportProcessorType.Simple, + new MyExporter(), + options => + { + // Note: Options delegate isn't invoked for simple processor type + Assert.True(false); + }); + builder.AddExporter( + ExportProcessorType.Batch, + options => + { + optionsInvocations++; + + Assert.Equal(18, options.BatchExportProcessorOptions.MaxExportBatchSize); + + options.BatchExportProcessorOptions.MaxExportBatchSize = 100; + }); + + using var provider = builder.Build() as TracerProviderSdk; + + Assert.NotNull(provider); + + Assert.Equal(2, optionsInvocations); + + var processor = provider.Processor as CompositeProcessor; + + Assert.NotNull(processor); + + var firstProcessor = processor.Head.Value; + var secondProcessor = processor.Head.Next?.Value; + + Assert.True(firstProcessor is SimpleActivityExportProcessor simpleProcessor && simpleProcessor.Exporter is MyExporter); + Assert.True(secondProcessor is BatchActivityExportProcessor batchProcessor + && batchProcessor.Exporter is MyExporter + && batchProcessor.MaxExportBatchSize == 100); + } + private static void RunBuilderServiceLifecycleTest( TracerProviderBuilder builder, Func buildFunc, @@ -291,5 +371,13 @@ public void Dispose() private sealed class MyProcessor : BaseProcessor { } + + private sealed class MyExporter : BaseExporter + { + public override ExportResult Export(in Batch batch) + { + return ExportResult.Success; + } + } } } From 923211dc5de2b7590cd01f52d0ee9a454b10d8c5 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 19 Aug 2022 15:05:19 -0700 Subject: [PATCH 28/30] More test coverage. --- .../Builder/TracerProviderBuilderBase.cs | 15 +++--- .../TracerProviderBuilderExtensionsTest.cs | 51 ++++++++++++++++++- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index 8162b88d979..0fd85d2a37d 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -31,7 +31,8 @@ namespace OpenTelemetry.Trace /// public abstract class TracerProviderBuilderBase : TracerProviderBuilder, IDeferredTracerProviderBuilder { - private readonly TracerProviderBuilderState? state; + internal readonly TracerProviderBuilderState? State; + private readonly bool ownsServices; private IServiceCollection? services; @@ -41,7 +42,7 @@ internal TracerProviderBuilderBase(TracerProviderBuilderState state) { Debug.Assert(state != null, "state was null"); - this.state = state; + this.State = state; } // This ctor is for AddOpenTelemetryTracing scenario where the builder @@ -101,9 +102,9 @@ TracerProviderBuilder IDeferredTracerProviderBuilder.Configure( { Guard.ThrowIfNull(configure); - if (this.state != null) + if (this.State != null) { - configure(this.state.ServiceProvider, this); + configure(this.State.ServiceProvider, this); } else { @@ -247,7 +248,7 @@ protected TracerProviderBuilder AddInstrumentation( /// . protected TracerProvider Build() { - if (!this.ownsServices || this.state != null) + if (!this.ownsServices || this.State != null) { throw new NotSupportedException("Build cannot be called directly on TracerProviderBuilder tied to external services."); } @@ -314,9 +315,9 @@ private TracerProviderBuilder ConfigureState(Action(() => builder.Build()); + Assert.NotNull(provider); Assert.NotNull(provider.OwnedServiceProvider); @@ -216,6 +219,32 @@ public void SingleProviderForServiceCollectionTest() Assert.Equal(2, provider.Instrumentations.Count); } + [Fact] + public void AddProcessorUsingDependencyInjectionTest() + { + var builder = Sdk.CreateTracerProviderBuilder(); + + builder.AddProcessor(); + builder.AddProcessor(); + + using var provider = builder.Build() as TracerProviderSdk; + + Assert.NotNull(provider); + + var processors = ((IServiceProvider)provider.OwnedServiceProvider).GetServices(); + + // Note: Two "Add" calls but it is a singleton so only a single registration is produced + Assert.Single(processors); + + var processor = provider.Processor as CompositeProcessor; + + Assert.NotNull(processor); + + // Note: Two "Add" calls due yield two processors added to provider, even though they are the same + Assert.True(processor.Head.Value is MyProcessor); + Assert.True(processor.Head.Next?.Value is MyProcessor); + } + [Fact] public void AddExporterTest() { @@ -301,7 +330,14 @@ private static void RunBuilderServiceLifecycleTest( Func buildFunc, Action postAction) { - builder.SetSampler(); + var baseBuilder = builder as TracerProviderBuilderBase; + Assert.Null(baseBuilder.State); + Assert.NotNull(baseBuilder.GetServices()); + + builder + .AddSource("TestSource") + .AddLegacySource("TestLegacySource") + .SetSampler(); bool configureServicesCalled = false; builder.ConfigureServices(services => @@ -324,9 +360,22 @@ private static void RunBuilderServiceLifecycleTest( { configureBuilderInvocations++; + var baseBuilder = builder as TracerProviderBuilderBase; + Assert.NotNull(baseBuilder?.State); + + builder + .AddSource("TestSource2") + .AddLegacySource("TestLegacySource2"); + + Assert.Contains(baseBuilder.State.Sources, s => s == "TestSource"); + Assert.Contains(baseBuilder.State.Sources, s => s == "TestSource2"); + Assert.Contains(baseBuilder.State.LegacyActivityOperationNames, s => s == "TestLegacySource"); + Assert.Contains(baseBuilder.State.LegacyActivityOperationNames, s => s == "TestLegacySource2"); + // Note: Services can't be configured at this stage Assert.Throws( () => builder.ConfigureServices(services => services.TryAddSingleton())); + Assert.Throws(() => builder.GetServices()); builder.AddProcessor(sp.GetRequiredService()); From ae64512bc4812e7ac4eb3c01531bb851278b994f Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 19 Aug 2022 15:33:10 -0700 Subject: [PATCH 29/30] More test coverage. --- .../Resources/ResourceBuilder.cs | 10 ++-- .../TracerProviderBuilderExtensionsTest.cs | 49 ++++++++++++++++++- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/src/OpenTelemetry/Resources/ResourceBuilder.cs b/src/OpenTelemetry/Resources/ResourceBuilder.cs index 3abb89ea750..fec087699c1 100644 --- a/src/OpenTelemetry/Resources/ResourceBuilder.cs +++ b/src/OpenTelemetry/Resources/ResourceBuilder.cs @@ -25,7 +25,7 @@ namespace OpenTelemetry.Resources /// public class ResourceBuilder { - private readonly List resources = new(); + internal readonly List Resources = new(); static ResourceBuilder() { @@ -83,7 +83,7 @@ public static ResourceBuilder CreateEmpty() /// for chaining. public ResourceBuilder Clear() { - this.resources.Clear(); + this.Resources.Clear(); return this; } @@ -96,7 +96,7 @@ public Resource Build() { Resource finalResource = Resource.Empty; - foreach (Resource resource in this.resources) + foreach (Resource resource in this.Resources) { finalResource = finalResource.Merge(resource); } @@ -112,7 +112,7 @@ public ResourceBuilder AddDetector(IResourceDetector resourceDetector) if (resource != null) { - this.resources.Add(resource); + this.Resources.Add(resource); } return this; @@ -122,7 +122,7 @@ internal ResourceBuilder AddResource(Resource resource) { Guard.ThrowIfNull(resource); - this.resources.Add(resource); + this.Resources.Add(resource); return this; } diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs index 97eddf8a0cd..fc278d01917 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs @@ -15,10 +15,12 @@ // using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using OpenTelemetry.Resources; using Xunit; namespace OpenTelemetry.Trace.Tests @@ -245,6 +247,44 @@ public void AddProcessorUsingDependencyInjectionTest() Assert.True(processor.Head.Next?.Value is MyProcessor); } + [Fact] + public void SetAndConfigureResourceTest() + { + var builder = Sdk.CreateTracerProviderBuilder(); + + int configureInvocations = 0; + + builder.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService("Test")); + builder.ConfigureResource(builder => + { + configureInvocations++; + + Assert.Single(builder.Resources); + + builder.AddAttributes(new Dictionary() { ["key1"] = "value1" }); + + Assert.Equal(2, builder.Resources.Count); + }); + builder.SetResourceBuilder(ResourceBuilder.CreateEmpty()); + builder.ConfigureResource(builder => + { + configureInvocations++; + + Assert.Empty(builder.Resources); + + builder.AddAttributes(new Dictionary() { ["key2"] = "value2" }); + + Assert.Single(builder.Resources); + }); + + using var provider = builder.Build() as TracerProviderSdk; + + Assert.Equal(2, configureInvocations); + + Assert.Single(provider.Resource.Attributes); + Assert.Contains(provider.Resource.Attributes, kvp => kvp.Key == "key2" && (string)kvp.Value == "value2"); + } + [Fact] public void AddExporterTest() { @@ -379,17 +419,22 @@ private static void RunBuilderServiceLifecycleTest( builder.AddProcessor(sp.GetRequiredService()); - builder.ConfigureBuilder((_, _) => + builder.ConfigureBuilder((_, b) => { // Note: ConfigureBuilder calls can be nested, this is supported configureBuilderInvocations++; + + b.Configure((_, _) => + { + configureBuilderInvocations++; + }); }); }); var provider = buildFunc(); Assert.True(configureServicesCalled); - Assert.Equal(2, configureBuilderInvocations); + Assert.Equal(3, configureBuilderInvocations); Assert.True(provider.Sampler is MySampler); Assert.Single(provider.Instrumentations); From 856c7511fc407fce09e1ffcf0f83b591a161454b Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Tue, 23 Aug 2022 09:18:56 -0700 Subject: [PATCH 30/30] Code review. --- .../netstandard2.0/PublicAPI.Unshipped.txt | 3 + .../Trace/TracerProviderBuilderExtensions.cs | 56 +++++++++++++++++++ .../.publicApi/net462/PublicAPI.Unshipped.txt | 2 - .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 2 - .../netstandard2.0/PublicAPI.Unshipped.txt | 2 - .../netstandard2.1/PublicAPI.Unshipped.txt | 2 - .../TracerProviderBuilderExtensions.cs | 34 ----------- .../TracerProviderBuilderExtensionsTest.cs | 4 +- 8 files changed, 60 insertions(+), 45 deletions(-) create mode 100644 src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs diff --git a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 066b671ddd1..93835864ab7 100644 --- a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,5 +1,6 @@ Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions OpenTelemetry.Metrics.MeterProviderBuilderExtensions +OpenTelemetry.Trace.TracerProviderBuilderExtensions static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection @@ -9,3 +10,5 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this Op static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.Build(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.IServiceProvider serviceProvider) -> OpenTelemetry.Metrics.MeterProvider static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.Configure(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action configure) -> OpenTelemetry.Metrics.MeterProviderBuilder static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.GetServices(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder) -> Microsoft.Extensions.DependencyInjection.IServiceCollection +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 diff --git a/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs new file mode 100644 index 00000000000..95b3a57d2a1 --- /dev/null +++ b/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs @@ -0,0 +1,56 @@ +// +// 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 Microsoft.Extensions.DependencyInjection; + +namespace OpenTelemetry.Trace +{ + /// + /// Contains extension methods for the class. + /// + public static class TracerProviderBuilderExtensions + { + /// + /// Register a callback action to configure the once the application is available. + /// + /// . + /// Configuration callback. + /// The supplied for chaining. + [Obsolete("Call ConfigureBuilder instead this method will be removed in a future version.")] + public static TracerProviderBuilder Configure(this TracerProviderBuilder tracerProviderBuilder, Action configure) + { + return tracerProviderBuilder.ConfigureBuilder(configure); + } + + /// + /// Gets the application attached to + /// the . + /// + /// . + /// or + /// if services are unavailable. + [Obsolete("Call ConfigureServices instead this method will be removed in a future version.")] + public static IServiceCollection GetServices(this TracerProviderBuilder tracerProviderBuilder) + { + IServiceCollection services = null; + tracerProviderBuilder.ConfigureServices(s => services = s); + return services; + } + } +} diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index 599397f7aac..029e596e0cd 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -36,10 +36,8 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this O static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index 599397f7aac..029e596e0cd 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -36,10 +36,8 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this O static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 4f87f710807..440dabec6ea 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -36,10 +36,8 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this O static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index 599397f7aac..029e596e0cd 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -36,10 +36,8 @@ static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this O static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(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! static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider! static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions! diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs index eee8016a328..d431c521fc5 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs @@ -283,26 +283,6 @@ public static TracerProviderBuilder ConfigureServices( return tracerProviderBuilder; } - /// - /// Gets the application attached to - /// the . - /// - /// . - /// or - /// if services are unavailable. - [Obsolete("Call ConfigureServices instead this method will be removed in a future version.")] - public static IServiceCollection? GetServices(this TracerProviderBuilder tracerProviderBuilder) - { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) - { - IServiceCollection? services = null; - tracerProviderBuilderBase.ConfigureServices(s => services = s); - return services; - } - - return null; - } - /// /// Register a callback action to configure the once the application - /// Register a callback action to configure the once the application is available. - /// - /// . - /// Configuration callback. - /// The supplied for chaining. - [Obsolete("Call ConfigureBuilder instead this method will be removed in a future version.")] - public static TracerProviderBuilder Configure( - this TracerProviderBuilder tracerProviderBuilder, - Action configure) - => ConfigureBuilder(tracerProviderBuilder, configure); - /// /// Run the given actions to initialize the . /// diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs index fc278d01917..cbb6dd9afa2 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs @@ -372,7 +372,6 @@ private static void RunBuilderServiceLifecycleTest( { var baseBuilder = builder as TracerProviderBuilderBase; Assert.Null(baseBuilder.State); - Assert.NotNull(baseBuilder.GetServices()); builder .AddSource("TestSource") @@ -415,7 +414,6 @@ private static void RunBuilderServiceLifecycleTest( // Note: Services can't be configured at this stage Assert.Throws( () => builder.ConfigureServices(services => services.TryAddSingleton())); - Assert.Throws(() => builder.GetServices()); builder.AddProcessor(sp.GetRequiredService()); @@ -424,7 +422,7 @@ private static void RunBuilderServiceLifecycleTest( // Note: ConfigureBuilder calls can be nested, this is supported configureBuilderInvocations++; - b.Configure((_, _) => + b.ConfigureBuilder((_, _) => { configureBuilderInvocations++; });