diff --git a/examples/MicroserviceExample/WorkerService/Program.cs b/examples/MicroserviceExample/WorkerService/Program.cs index d037e727cfb..88a8cfd8dcf 100644 --- a/examples/MicroserviceExample/WorkerService/Program.cs +++ b/examples/MicroserviceExample/WorkerService/Program.cs @@ -37,7 +37,7 @@ public static IHostBuilder CreateHostBuilder(string[] args) => services.AddSingleton(); - services.AddOpenTelemetryTracing((builder) => + services.AddOpenTelemetryTracing(builder => { builder .AddSource(nameof(MessageReceiver)) 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..93835864ab7 100644 --- a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -10,9 +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.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/CHANGELOG.md b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md index 4aa086f8260..bb3df948aad 100644 --- a/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md +++ b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +* Dependency injection support when configuring + `TracerProvider` has been moved into the SDK. + ([#3533](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3533)) + ## 1.0.0-rc9.6 Released 2022-Aug-18 diff --git a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs index 1551667aa86..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 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/Implementation/TracerProviderBuilderHosting.cs b/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs deleted file mode 100644 index aa678dfd8ff..00000000000 --- a/src/OpenTelemetry.Extensions.Hosting/Implementation/TracerProviderBuilderHosting.cs +++ /dev/null @@ -1,62 +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.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 - { - private readonly List> configurationActions = new(); - - public TracerProviderBuilderHosting(IServiceCollection services) - { - Guard.ThrowIfNull(services); - - this.Services = services; - } - - public IServiceCollection Services { get; } - - public TracerProviderBuilder Configure(Action configure) - { - Guard.ThrowIfNull(configure); - - this.configurationActions.Add(configure); - return this; - } - - public TracerProvider Build(IServiceProvider serviceProvider) - { - 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++) - { - this.configurationActions[i](serviceProvider, this); - } - - return this.Build(); - } - } -} 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/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index d003c37a769..44a41e1e5c2 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -32,28 +32,38 @@ namespace Microsoft.Extensions.DependencyInjection public static class OpenTelemetryServicesExtensions { /// - /// Adds OpenTelemetry TracerProvider to the specified . + /// Configure OpenTelemetry and register a + /// to automatically start tracing services in the supplied . /// - /// The to add services to. - /// The so that additional calls can be chained. + /// + /// 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) - { - return services.AddOpenTelemetryTracing(builder => { }); - } + => AddOpenTelemetryTracing(services, (b) => { }); /// - /// Adds OpenTelemetry TracerProvider to the specified . + /// Configure OpenTelemetry and register a + /// to automatically start tracing services in the supplied . /// - /// The to add services to. + /// + /// . /// Callback action to configure the . - /// The so that additional calls can be chained. + /// Supplied for chaining calls. public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action configure) { - Guard.ThrowIfNull(configure); + Guard.ThrowIfNull(services); - var builder = new TracerProviderBuilderHosting(services); - configure(builder); - return services.AddOpenTelemetryTracing(sp => builder.Build(sp)); + services.ConfigureOpenTelemetryTracing(configure); + + services.TryAddEnumerable(ServiceDescriptor.Singleton()); + + return services; } /// @@ -81,34 +91,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. - /// 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) - { - Guard.ThrowIfNull(services); - Guard.ThrowIfNull(createTracerProvider); - - // 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.AddSingleton(s => createTracerProvider(s)); - } - catch (Exception ex) - { - HostingExtensionsEventSource.Log.FailedInitialize(ex); - } - - return services; - } - /// /// Adds OpenTelemetry MeterProvider to the specified . /// 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(); } diff --git a/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs index ca26671edfa..95b3a57d2a1 100644 --- a/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs @@ -15,7 +15,6 @@ // using System; -using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; namespace OpenTelemetry.Trace @@ -25,60 +24,6 @@ namespace OpenTelemetry.Trace /// 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 (this TracerProviderBuilder tra /// . /// 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) { - if (tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) - { - deferredTracerProviderBuilder.Configure(configure); - } - - return tracerProviderBuilder; + return tracerProviderBuilder.ConfigureBuilder(configure); } /// @@ -104,35 +45,12 @@ public static TracerProviderBuilder Configure(this TracerProviderBuilder tracerP /// . /// 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 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; + IServiceCollection services = null; + tracerProviderBuilder.ConfigureServices(s => services = s); + return services; } } } diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Shipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Shipped.txt index 352877fe2fe..663e45228b0 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 @@ static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.M 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 5f9d0a1ac8c..029e596e0cd 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 @@ -19,11 +20,28 @@ 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 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.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.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! 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.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 +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 352877fe2fe..663e45228b0 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 @@ static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.M 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 5f9d0a1ac8c..029e596e0cd 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 @@ -19,11 +20,28 @@ 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 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.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.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! 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.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 +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 352877fe2fe..663e45228b0 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 @@ static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.M 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 a840723ef46..440dabec6ea 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 @@ -19,11 +20,28 @@ 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 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.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.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! 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.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 +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 352877fe2fe..663e45228b0 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 @@ static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.M 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 5f9d0a1ac8c..029e596e0cd 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 @@ -19,11 +20,28 @@ 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 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.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.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! 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.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 +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! 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/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 6f209740d7c..b0657593758 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -10,6 +10,10 @@ Released 2022-Aug-18 injection scenarios when configuring `OpenTelemetryLoggerProvider` ([#3504](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3504)) +* 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 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/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs new file mode 100644 index 00000000000..0fd85d2a37d --- /dev/null +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -0,0 +1,341 @@ +// +// 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 + { + internal 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(TracerProviderBuilderState state) + { + Debug.Assert(state != null, "state was null"); + + this.State = state; + } + + // This ctor is for AddOpenTelemetryTracing scenario where the builder + // is bound to an external service collection. + internal TracerProviderBuilderBase(IServiceCollection services) + { + Guard.ThrowIfNull(services); + + services.AddOptions(); + services.TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: false)); + + this.services = services; + this.ownsServices = false; + } + + // This ctor is for Sdk.CreateTracerProviderBuilder where the builder + // owns its services and service provider. + protected TracerProviderBuilderBase() + { + var services = new ServiceCollection(); + + services.AddOptions(); + + this.services = services; + this.ownsServices = true; + } + + /// + 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) + { + configure(this.State.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( + BuildExportProcessor(state.ServiceProvider, 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( + BuildExportProcessor(state.ServiceProvider, 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 new TracerProviderSdk(serviceProvider, ownsServiceProvider: true); + } + + 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 + { + 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) + { + configure!(this.State.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(); + } + } + } +} diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs new file mode 100644 index 00000000000..d431c521fc5 --- /dev/null +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs @@ -0,0 +1,321 @@ +// +// 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 OpenTelemetry.Resources; + +namespace OpenTelemetry.Trace +{ + /// + /// Contains extension methods for the class. + /// + public static class TracerProviderBuilderExtensions + { + /// + /// Sets whether the status of + /// should be set to Status.Error when it ended abnormally due to an unhandled exception. + /// + /// . + /// Enabled or not. Default value is true. + /// Returns for chaining. + public static TracerProviderBuilder SetErrorStatusOnException(this TracerProviderBuilder tracerProviderBuilder, bool enabled = true) + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.SetErrorStatusOnException(enabled); + } + + return tracerProviderBuilder; + } + + /// + /// Sets sampler. + /// + /// . + /// Sampler instance. + /// Returns for chaining. + public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracerProviderBuilder, Sampler sampler) + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.SetSampler(sampler); + } + + return tracerProviderBuilder; + } + + /// + /// 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 + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.SetSampler(); + } + + return tracerProviderBuilder; + } + + /// + /// Sets the from which the Resource associated with + /// this provider is built from. Overwrites currently set ResourceBuilder. + /// You should usually use instead + /// (call if desired). + /// + /// . + /// from which Resource will be built. + /// Returns for chaining. + public static TracerProviderBuilder SetResourceBuilder(this TracerProviderBuilder tracerProviderBuilder, ResourceBuilder resourceBuilder) + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.SetResourceBuilder(resourceBuilder); + } + + return tracerProviderBuilder; + } + + /// + /// Modify the from which the Resource associated with + /// this provider is built from in-place. + /// + /// . + /// An action which modifies the provided in-place. + /// Returns for chaining. + public static TracerProviderBuilder ConfigureResource(this TracerProviderBuilder tracerProviderBuilder, Action configure) + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.ConfigureResource(configure); + } + + return tracerProviderBuilder; + } + + /// + /// Adds a processor to the provider. + /// + /// . + /// Activity processor to add. + /// Returns for chaining. + public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder, BaseProcessor processor) + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.AddProcessor(processor); + } + + return tracerProviderBuilder; + } + + /// + /// 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. + /// . + /// The supplied for chaining. + public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder) + where T : BaseProcessor + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.AddProcessor(); + } + + return tracerProviderBuilder; + } + + /// + /// Adds an exporter to the provider. + /// + /// . + /// . + /// Activity exporter to add. + /// Returns for chaining. + public static TracerProviderBuilder AddExporter( + this TracerProviderBuilder tracerProviderBuilder, + ExportProcessorType exportProcessorType, + BaseExporter exporter) + => AddExporter(tracerProviderBuilder, exportProcessorType, exporter, o => { }); + + /// + /// Adds an exporter to the provider. + /// + /// . + /// . + /// 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) + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.AddExporter(exportProcessorType, exporter, configure); + } + + 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. + /// . + /// . + /// 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. + /// . + /// . + /// Callback action to configure . Only invoked when is . + /// The supplied for chaining. + public static TracerProviderBuilder AddExporter( + this TracerProviderBuilder tracerProviderBuilder, + ExportProcessorType exportProcessorType, + Action configure) + where T : BaseExporter + { + 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 + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.AddInstrumentation(); + } + + return tracerProviderBuilder; + } + + /// + /// 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 TracerProviderBuilderBase tracerProviderBuilderBase) + { + tracerProviderBuilderBase.ConfigureServices(configure); + } + + 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) + { + if (tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) + { + deferredTracerProviderBuilder.Configure(configure); + } + + return tracerProviderBuilder; + } + + /// + /// Run the given actions to initialize the . + /// + /// . + /// . + public static TracerProvider? Build(this TracerProviderBuilder tracerProviderBuilder) + { + if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + { + return tracerProviderBuilderBase.InvokeBuild(); + } + + return null; + } + } +} diff --git a/src/OpenTelemetry/Trace/TracerProviderBuilderSdk.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs similarity index 68% rename from src/OpenTelemetry/Trace/TracerProviderBuilderSdk.cs rename to src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs index ba9291e5851..a13d105e8db 100644 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs @@ -14,10 +14,26 @@ // limitations under the License. // +#nullable enable + +using Microsoft.Extensions.DependencyInjection; + namespace OpenTelemetry.Trace { internal sealed class TracerProviderBuilderSdk : TracerProviderBuilderBase { - internal TracerProvider BuildSdk() => this.Build(); + public TracerProviderBuilderSdk() + { + } + + public TracerProviderBuilderSdk(IServiceCollection services) + : base(services) + { + } + + public TracerProviderBuilderSdk(TracerProviderBuilderState state) + : base(state) + { + } } } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs new file mode 100644 index 00000000000..8b37f9080fb --- /dev/null +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs @@ -0,0 +1,77 @@ +// +// 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 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 +{ + /// + /// Configures OpenTelemetry tracing services in the supplied . + /// + /// + /// Notes: + /// + /// A will not be created automatically + /// using this method. Either use the + /// IServiceCollection.AddOpenTelemetryTracing 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 ConfigureOpenTelemetryTracing(this IServiceCollection services) + => ConfigureOpenTelemetryTracing(services, (b) => { }); + + /// + /// 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 ConfigureOpenTelemetryTracing(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; + } +} diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs new file mode 100644 index 00000000000..ae68e0881b5 --- /dev/null +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionHelper.cs @@ -0,0 +1,81 @@ +// +// 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; + +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, state.Builder)); + } + + 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..0f6be92701a --- /dev/null +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs @@ -0,0 +1,145 @@ +// +// 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 IServiceProvider ServiceProvider; + 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; + + 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, + 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/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/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs deleted file mode 100644 index 708c7bc45b1..00000000000 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderBase.cs +++ /dev/null @@ -1,213 +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.Collections.Generic; -using System.Diagnostics; -using OpenTelemetry.Internal; -using OpenTelemetry.Resources; - -namespace OpenTelemetry.Trace -{ - /// - /// Build TracerProvider with Resource, Sampler, Processors and Instrumentation. - /// - public abstract class TracerProviderBuilderBase : TracerProviderBuilder - { - 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()); - - protected TracerProviderBuilderBase() - { - } - - /// - /// Gets or sets the from which the Resource associated with - /// this provider is built from. Setting this overwrites currently set ResourceBuilder. - /// - internal ResourceBuilder ResourceBuilder - { - get => this.resourceBuilder; - set - { - Guard.ThrowIfNull(value); - this.resourceBuilder = value; - } - } - - /// - 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; - } - - /// - /// 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; - } - - /// - /// 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 new TracerProviderSdk( - this.resourceBuilder.Build(), - this.sources, - this.instrumentationFactories, - this.sampler, - this.processors, - this.legacyActivityOperationNames); - } - - 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/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs deleted file mode 100644 index 24f26e98e01..00000000000 --- a/src/OpenTelemetry/Trace/TracerProviderBuilderExtensions.cs +++ /dev/null @@ -1,137 +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 OpenTelemetry.Internal; -using OpenTelemetry.Resources; - -namespace OpenTelemetry.Trace -{ - /// - /// Contains extension methods for the class. - /// - 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) - { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) - { - tracerProviderBuilderBase.SetErrorStatusOnException(enabled); - } - - return tracerProviderBuilder; - } - - /// - /// Sets sampler. - /// - /// TracerProviderBuilder instance. - /// Sampler instance. - /// Returns for chaining. - public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracerProviderBuilder, Sampler sampler) - { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) - { - tracerProviderBuilderBase.SetSampler(sampler); - } - - return tracerProviderBuilder; - } - - /// - /// Sets the from which the Resource associated with - /// this provider is built from. Overwrites currently set ResourceBuilder. - /// 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; - } - - return tracerProviderBuilder; - } - - /// - /// 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(tracerProviderBuilder, nameof(tracerProviderBuilder)); - Guard.ThrowIfNull(configure, nameof(configure)); - - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) - { - configure(tracerProviderBuilderBase.ResourceBuilder); - } - - return tracerProviderBuilder; - } - - /// - /// Adds processor to the provider. - /// - /// TracerProviderBuilder instance. - /// Activity processor to add. - /// Returns for chaining. - public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder, BaseProcessor processor) - { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) - { - tracerProviderBuilderBase.AddProcessor(processor); - } - - return tracerProviderBuilder; - } - - /// - /// Run the given actions to initialize the . - /// - /// . - /// . - public static TracerProvider Build(this TracerProviderBuilder tracerProviderBuilder) - { - if (tracerProviderBuilder is IDeferredTracerProviderBuilder) - { - throw new NotSupportedException($"'{nameof(TracerProviderBuilder)}' requires a '{nameof(IServiceProvider)}' to build"); - } - - if (tracerProviderBuilder is TracerProviderBuilderSdk tracerProviderBuilderSdk) - { - return tracerProviderBuilderSdk.BuildSdk(); - } - - return null; - } - } -} 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..adf1738b174 100644 --- a/src/OpenTelemetry/Trace/TracerProviderSdk.cs +++ b/src/OpenTelemetry/Trace/TracerProviderSdk.cs @@ -14,6 +14,8 @@ // limitations under the License. // +#nullable enable + using System; using System.Collections.Generic; using System.Diagnostics; @@ -26,65 +28,76 @@ 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 BaseProcessor processor; - private bool disposed; + private BaseProcessor? processor; internal TracerProviderSdk( - Resource resource, - IEnumerable sources, - IEnumerable instrumentationFactories, - Sampler sampler, - List> processors, - HashSet legacyActivityOperationNames) + IServiceProvider serviceProvider, + bool ownsServiceProvider) { - this.Resource = resource; - this.sampler = sampler; - this.supportLegacyActivity = legacyActivityOperationNames.Count > 0; + if (ownsServiceProvider) + { + this.OwnedServiceProvider = serviceProvider as IDisposable; + Debug.Assert(this.OwnedServiceProvider != null, "serviceProvider was not IDisposable"); + } + + var state = new TracerProviderBuilderState(serviceProvider); + + 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(); if (this.supportLegacyActivity) { - Func legacyActivityPredicate = null; + Func? legacyActivityPredicate = null; if (legacyActivityWildcardMode) { legacyActivityPredicate = activity => legacyActivityWildcardModeRegex.IsMatch(activity.OperationName); } else { - legacyActivityPredicate = activity => legacyActivityOperationNames.Contains(activity.OperationName); + legacyActivityPredicate = activity => state.LegacyActivityOperationNames.Contains(activity.OperationName); } listener.ActivityStarted = activity => @@ -100,7 +113,7 @@ internal TracerProviderSdk( // unless suppressed. if (!Sdk.SuppressInstrumentation) { - this.getRequestedDataAction(activity); + this.getRequestedDataAction!(activity); } else { @@ -190,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; @@ -206,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. @@ -229,7 +242,7 @@ internal TracerProviderSdk( } else { - var activitySources = new HashSet(sources, StringComparer.OrdinalIgnoreCase); + var activitySources = new HashSet(state.Sources, StringComparer.OrdinalIgnoreCase); if (this.supportLegacyActivity) { @@ -257,7 +270,7 @@ internal TracerProviderSdk( internal List Instrumentations => this.instrumentations; - internal BaseProcessor Processor => this.processor; + internal BaseProcessor? Processor => this.processor; internal Sampler Sampler => this.sampler; @@ -331,7 +344,7 @@ internal bool OnShutdown(int timeoutMilliseconds) protected override void Dispose(bool disposing) { - if (!this.disposed) + if (!this.Disposed) { if (disposing) { @@ -355,9 +368,11 @@ 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; + this.Disposed = true; OpenTelemetrySdkEventSource.Log.ProviderDisposed(nameof(TracerProvider)); } diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs index b897dd42098..131e9038139 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() @@ -182,40 +182,25 @@ public void AddOpenTelemetryTracerProvider_ConfigureCallbacksUsingExtensions() Assert.True(tracerProvider.Sampler is TestSampler); } - [Fact(Skip = "Known limitation. See issue 1215.")] - public void AddOpenTelemetryTracerProvider_Idempotent() + [Fact] + public void AddOpenTelemetryTracing_MultipleCallsConfigureSingleProvider() { - 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("TestSourceBuilder1")); + services.AddOpenTelemetryTracing(); + services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSourceBuilder2")); - var serviceProvider = services.BuildServiceProvider(); + using var serviceProvider = services.BuildServiceProvider(); - var tracerFactory = serviceProvider.GetRequiredService(); - Assert.NotNull(tracerFactory); + var providers = serviceProvider.GetServices(); - Assert.False(testInstrumentation1.Disposed); - Assert.False(testInstrumentation2.Disposed); - serviceProvider.Dispose(); - Assert.True(testInstrumentation1.Disposed); - Assert.True(testInstrumentation2.Disposed); + Assert.Single(providers); } 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(); } diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs index 8464325e3c4..cbb6dd9afa2 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs @@ -15,7 +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 @@ -106,5 +111,365 @@ 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; + + // Note: Build can only be called once + Assert.Throws(() => builder.Build()); + + 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); + } + + [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 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() + { + 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, + Action postAction) + { + var baseBuilder = builder as TracerProviderBuilderBase; + Assert.Null(baseBuilder.State); + + builder + .AddSource("TestSource") + .AddLegacySource("TestLegacySource") + .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++; + + 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())); + + builder.AddProcessor(sp.GetRequiredService()); + + builder.ConfigureBuilder((_, b) => + { + // Note: ConfigureBuilder calls can be nested, this is supported + configureBuilderInvocations++; + + b.ConfigureBuilder((_, _) => + { + configureBuilderInvocations++; + }); + }); + }); + + var provider = buildFunc(); + + Assert.True(configureServicesCalled); + Assert.Equal(3, 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 + { + } + + private sealed class MyExporter : BaseExporter + { + public override ExportResult Export(in Batch batch) + { + return ExportResult.Success; + } + } } } 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 {