From e860623d8c64833be283b30c0760567c49f10719 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 9 Feb 2023 10:47:33 -0800 Subject: [PATCH 01/11] Move AddOpenTelemetry & OpenTelemetryBuilder into Hosting package. --- .../getting-started-aspnetcore/Program.cs | 4 +- examples/AspNetCore/Program.cs | 4 +- examples/GrpcService/Startup.cs | 4 +- .../MicroserviceExample/WebApi/Startup.cs | 4 +- .../WorkerService/Program.cs | 4 +- .../netstandard2.0/PublicAPI.Shipped.txt | 1 + .../netstandard2.0/PublicAPI.Unshipped.txt | 26 +++++---- .../Metrics/MeterProviderBuilderExtensions.cs | 19 ++++++- .../OpenTelemetry.Extensions.Hosting.csproj | 6 +- .../OpenTelemetryBuilder.cs | 4 +- .../OpenTelemetryBuilderHostingExtensions.cs | 54 ------------------ .../OpenTelemetryServicesExtensions.cs | 38 +++++++++++-- .../Trace/TracerProviderBuilderExtensions.cs | 19 ++++++- .../.publicApi/net462/PublicAPI.Unshipped.txt | 9 --- .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 9 --- .../netstandard2.0/PublicAPI.Unshipped.txt | 9 --- .../netstandard2.1/PublicAPI.Unshipped.txt | 9 --- src/OpenTelemetry/AssemblyInfo.cs | 1 + ...penTelemetryServiceCollectionExtensions.cs | 55 ------------------- 19 files changed, 92 insertions(+), 187 deletions(-) rename src/{OpenTelemetry => OpenTelemetry.Extensions.Hosting}/OpenTelemetryBuilder.cs (99%) delete mode 100644 src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs delete mode 100644 src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs diff --git a/docs/trace/getting-started-aspnetcore/Program.cs b/docs/trace/getting-started-aspnetcore/Program.cs index 2feba0bd229..d6cc344cd05 100644 --- a/docs/trace/getting-started-aspnetcore/Program.cs +++ b/docs/trace/getting-started-aspnetcore/Program.cs @@ -15,7 +15,6 @@ // using System.Diagnostics; -using OpenTelemetry; using OpenTelemetry.Resources; using OpenTelemetry.Trace; @@ -27,8 +26,7 @@ .AddService(serviceName: "OTel.NET Getting Started")) .WithTracing(builder => builder .AddAspNetCoreInstrumentation() - .AddConsoleExporter()) - .StartWithHost(); + .AddConsoleExporter()); var app = appBuilder.Build(); diff --git a/examples/AspNetCore/Program.cs b/examples/AspNetCore/Program.cs index 53245406d57..3b37ea9ca5f 100644 --- a/examples/AspNetCore/Program.cs +++ b/examples/AspNetCore/Program.cs @@ -15,7 +15,6 @@ // using Examples.AspNetCore; -using OpenTelemetry; using OpenTelemetry.Exporter; using OpenTelemetry.Instrumentation.AspNetCore; using OpenTelemetry.Logs; @@ -127,8 +126,7 @@ builder.AddConsoleExporter(); break; } - }) - .StartWithHost(); + }); // Clear default logging providers used by WebApplication host. appBuilder.Logging.ClearProviders(); diff --git a/examples/GrpcService/Startup.cs b/examples/GrpcService/Startup.cs index 2c875eae04b..0b2e09566f1 100644 --- a/examples/GrpcService/Startup.cs +++ b/examples/GrpcService/Startup.cs @@ -14,7 +14,6 @@ // limitations under the License. // -using OpenTelemetry; using OpenTelemetry.Resources; using OpenTelemetry.Trace; @@ -61,8 +60,7 @@ public void ConfigureServices(IServiceCollection services) builder.AddConsoleExporter(); break; } - }) - .StartWithHost(); + }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) diff --git a/examples/MicroserviceExample/WebApi/Startup.cs b/examples/MicroserviceExample/WebApi/Startup.cs index 90e66783302..b6218891da9 100644 --- a/examples/MicroserviceExample/WebApi/Startup.cs +++ b/examples/MicroserviceExample/WebApi/Startup.cs @@ -14,7 +14,6 @@ // limitations under the License. // -using OpenTelemetry; using OpenTelemetry.Trace; using Utils.Messaging; @@ -43,8 +42,7 @@ public void ConfigureServices(IServiceCollection services) { var zipkinHostName = Environment.GetEnvironmentVariable("ZIPKIN_HOSTNAME") ?? "localhost"; b.Endpoint = new Uri($"http://{zipkinHostName}:9411/api/v2/spans"); - })) - .StartWithHost(); + })); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) diff --git a/examples/MicroserviceExample/WorkerService/Program.cs b/examples/MicroserviceExample/WorkerService/Program.cs index 665265cedd4..c92602eac7d 100644 --- a/examples/MicroserviceExample/WorkerService/Program.cs +++ b/examples/MicroserviceExample/WorkerService/Program.cs @@ -14,7 +14,6 @@ // limitations under the License. // -using OpenTelemetry; using OpenTelemetry.Trace; using Utils.Messaging; @@ -42,8 +41,7 @@ public static IHostBuilder CreateHostBuilder(string[] args) => { var zipkinHostName = Environment.GetEnvironmentVariable("ZIPKIN_HOSTNAME") ?? "localhost"; b.Endpoint = new Uri($"http://{zipkinHostName}:9411/api/v2/spans"); - })) - .StartWithHost(); + })); }); } } diff --git a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Shipped.txt b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Shipped.txt index e69de29bb2d..7dc5c58110b 100644 --- a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Shipped.txt +++ b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Shipped.txt @@ -0,0 +1 @@ +#nullable enable 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 dbee0f5b37d..5e8365829f9 100644 --- a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,13 +1,19 @@ Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions OpenTelemetry.Metrics.MeterProviderBuilderExtensions -OpenTelemetry.OpenTelemetryBuilderHostingExtensions +OpenTelemetry.OpenTelemetryBuilder +OpenTelemetry.OpenTelemetryBuilder.ConfigureResource(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! +OpenTelemetry.OpenTelemetryBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +OpenTelemetry.OpenTelemetryBuilder.WithMetrics() -> OpenTelemetry.OpenTelemetryBuilder! +OpenTelemetry.OpenTelemetryBuilder.WithMetrics(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! +OpenTelemetry.OpenTelemetryBuilder.WithTracing() -> OpenTelemetry.OpenTelemetryBuilder! +OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! OpenTelemetry.Trace.TracerProviderBuilderExtensions -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection -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.OpenTelemetryBuilderHostingExtensions.StartWithHost(this OpenTelemetry.OpenTelemetryBuilder builder) -> OpenTelemetry.OpenTelemetryBuilder -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 Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetry(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> OpenTelemetry.OpenTelemetryBuilder! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions.AddOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.Configure(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.GetServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.TracerProviderBuilderExtensions.GetServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! diff --git a/src/OpenTelemetry.Extensions.Hosting/Metrics/MeterProviderBuilderExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/Metrics/MeterProviderBuilderExtensions.cs index a70666ce5fd..e2af1280573 100644 --- a/src/OpenTelemetry.Extensions.Hosting/Metrics/MeterProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/Metrics/MeterProviderBuilderExtensions.cs @@ -15,6 +15,7 @@ // using Microsoft.Extensions.DependencyInjection; +using OpenTelemetry.Internal; namespace OpenTelemetry.Metrics { @@ -34,7 +35,12 @@ public static class MeterProviderBuilderExtensions [Obsolete("Configure has been replaced by factory extensions. This method will be removed in a future version.")] public static MeterProviderBuilder Configure(this MeterProviderBuilder meterProviderBuilder, Action configure) { - return (meterProviderBuilder as IDeferredMeterProviderBuilder)?.Configure(configure); + if (meterProviderBuilder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder) + { + deferredMeterProviderBuilder.Configure(configure); + } + + return meterProviderBuilder; } /// @@ -47,8 +53,17 @@ public static MeterProviderBuilder Configure(this MeterProviderBuilder meterProv [Obsolete("Call ConfigureServices instead this method will be removed in a future version.")] public static IServiceCollection GetServices(this MeterProviderBuilder meterProviderBuilder) { - IServiceCollection services = null; + Guard.ThrowIfNull(meterProviderBuilder); + + IServiceCollection? services = null; + meterProviderBuilder.ConfigureServices(s => services = s); + + if (services == null) + { + throw new NotSupportedException($"GetServices is not supported on the '{meterProviderBuilder.GetType()}' builder type."); + } + return services; } } diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj index ee9f1287241..21f9aa4b039 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj @@ -1,13 +1,11 @@ - + netstandard2.0 Contains extensions to start OpenTelemetry in applications using Microsoft.Extensions.Hosting OpenTelemetry core- - - - disable + enable diff --git a/src/OpenTelemetry/OpenTelemetryBuilder.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilder.cs similarity index 99% rename from src/OpenTelemetry/OpenTelemetryBuilder.cs rename to src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilder.cs index f817e0bfe68..3290d7a8686 100644 --- a/src/OpenTelemetry/OpenTelemetryBuilder.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilder.cs @@ -14,8 +14,6 @@ // limitations under the License. // -#nullable enable - using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; using OpenTelemetry.Metrics; @@ -28,7 +26,7 @@ namespace OpenTelemetry; /// Contains methods for configuring the OpenTelemetry SDK inside an . /// -public class OpenTelemetryBuilder +public sealed class OpenTelemetryBuilder { internal OpenTelemetryBuilder(IServiceCollection services) { diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs deleted file mode 100644 index 646ca614f44..00000000000 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs +++ /dev/null @@ -1,54 +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 Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Hosting; -using OpenTelemetry.Extensions.Hosting.Implementation; -using OpenTelemetry.Internal; - -namespace OpenTelemetry; - -/// -/// Contains hosting extension methods for the class. -/// -public static class OpenTelemetryBuilderHostingExtensions -{ - /// - /// Registers an to automatically start all - /// configured OpenTelemetry services in the supplied . - /// - /// - /// Note: This is safe to be called multiple times. Only a single will be created for a given . This should generally be called by hosting - /// application code and NOT library authors. - /// - /// . - /// The supplied for chaining - /// calls. - public static OpenTelemetryBuilder StartWithHost(this OpenTelemetryBuilder builder) - { - Guard.ThrowIfNull(builder); - - builder.Services.TryAddEnumerable( - ServiceDescriptor.Singleton()); - - return builder; - } -} diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index 64e837fbf16..7ebc142b358 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -14,8 +14,11 @@ // limitations under the License. // +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; using OpenTelemetry; +using OpenTelemetry.Extensions.Hosting.Implementation; +using OpenTelemetry.Internal; using OpenTelemetry.Metrics; using OpenTelemetry.Trace; @@ -27,6 +30,29 @@ namespace Microsoft.Extensions.DependencyInjection; /// public static class OpenTelemetryServicesExtensions { + /// + /// Adds OpenTelemetry SDK services into the supplied . + /// + /// + /// Note: This is safe to be called multiple times and by library authors. + /// Only a single and/or will be created for a given . + /// + /// . + /// The supplied for chaining + /// calls. + public static OpenTelemetryBuilder AddOpenTelemetry(this IServiceCollection services) + { + Guard.ThrowIfNull(services); + + services.TryAddEnumerable( + ServiceDescriptor.Singleton()); + + return new(services); + } + /// /// Configure OpenTelemetry and register a /// to automatically start tracing services in the supplied . /// Supplied for chaining /// calls. - [Obsolete("Use the AddOpenTelemetry().WithTracing(configure).StartWithHost() pattern instead. This method will be removed in a future version.")] + [Obsolete("Use the AddOpenTelemetry().WithTracing(configure) pattern instead. This method will be removed in a future version.")] public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) => AddOpenTelemetryTracing(services, b => { }); @@ -68,10 +94,10 @@ public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection /// cref="TracerProviderBuilder"/>. /// Supplied for chaining /// calls. - [Obsolete("Use the AddOpenTelemetry().WithTracing(configure).StartWithHost() pattern instead. This method will be removed in a future version.")] + [Obsolete("Use the AddOpenTelemetry().WithTracing(configure) pattern instead. This method will be removed in a future version.")] public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action configure) { - services.AddOpenTelemetry().WithTracing(configure).StartWithHost(); + services.AddOpenTelemetry().WithTracing(configure); return services; } @@ -100,7 +126,7 @@ public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection /// . /// Supplied for chaining /// calls. - [Obsolete("Use the AddOpenTelemetry().WithMetrics(configure).StartWithHost() pattern instead. This method will be removed in a future version.")] + [Obsolete("Use the AddOpenTelemetry().WithMetrics(configure) pattern instead. This method will be removed in a future version.")] public static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollection services) => AddOpenTelemetryMetrics(services, b => { }); @@ -117,10 +143,10 @@ public static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollection /// cref="TracerProviderBuilder"/>. /// Supplied for chaining /// calls. - [Obsolete("Use the AddOpenTelemetry().WithMetrics(configure).StartWithHost() pattern instead. This method will be removed in a future version.")] + [Obsolete("Use the AddOpenTelemetry().WithMetrics(configure) pattern instead. This method will be removed in a future version.")] public static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollection services, Action configure) { - services.AddOpenTelemetry().WithMetrics(configure).StartWithHost(); + services.AddOpenTelemetry().WithMetrics(configure); return services; } diff --git a/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs index 01402559a68..55e6629c8a7 100644 --- a/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/Trace/TracerProviderBuilderExtensions.cs @@ -15,6 +15,7 @@ // using Microsoft.Extensions.DependencyInjection; +using OpenTelemetry.Internal; namespace OpenTelemetry.Trace { @@ -34,7 +35,12 @@ public static class TracerProviderBuilderExtensions [Obsolete("Configure has been replaced by factory extensions. This method will be removed in a future version.")] public static TracerProviderBuilder Configure(this TracerProviderBuilder tracerProviderBuilder, Action configure) { - return (tracerProviderBuilder as IDeferredTracerProviderBuilder)?.Configure(configure); + if (tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) + { + deferredTracerProviderBuilder.Configure(configure); + } + + return tracerProviderBuilder; } /// @@ -47,8 +53,17 @@ public static TracerProviderBuilder Configure(this TracerProviderBuilder tracerP [Obsolete("Call ConfigureServices instead this method will be removed in a future version.")] public static IServiceCollection GetServices(this TracerProviderBuilder tracerProviderBuilder) { - IServiceCollection services = null; + Guard.ThrowIfNull(tracerProviderBuilder); + + IServiceCollection? services = null; + tracerProviderBuilder.ConfigureServices(s => services = s); + + if (services == null) + { + throw new NotSupportedException($"GetServices is not supported on the '{tracerProviderBuilder.GetType()}' builder type."); + } + return services; } } diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index 88503e8c781..c7e1bde089f 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -12,16 +12,7 @@ OpenTelemetry.Metrics.HistogramConfiguration.HistogramConfiguration() -> void OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool -OpenTelemetry.OpenTelemetryBuilder -OpenTelemetry.OpenTelemetryBuilder.ConfigureResource(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics() -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing() -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryServiceCollectionExtensions static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! implementationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetry(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> OpenTelemetry.OpenTelemetryBuilder! static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string? OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string! traceStateString) -> void diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index 88503e8c781..c7e1bde089f 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -12,16 +12,7 @@ OpenTelemetry.Metrics.HistogramConfiguration.HistogramConfiguration() -> void OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool -OpenTelemetry.OpenTelemetryBuilder -OpenTelemetry.OpenTelemetryBuilder.ConfigureResource(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics() -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing() -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryServiceCollectionExtensions static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! implementationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetry(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> OpenTelemetry.OpenTelemetryBuilder! static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string? OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string! traceStateString) -> void diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 88503e8c781..c7e1bde089f 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -12,16 +12,7 @@ OpenTelemetry.Metrics.HistogramConfiguration.HistogramConfiguration() -> void OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool -OpenTelemetry.OpenTelemetryBuilder -OpenTelemetry.OpenTelemetryBuilder.ConfigureResource(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics() -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing() -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryServiceCollectionExtensions static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! implementationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetry(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> OpenTelemetry.OpenTelemetryBuilder! static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string? OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string! traceStateString) -> void diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index 88503e8c781..c7e1bde089f 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -12,16 +12,7 @@ OpenTelemetry.Metrics.HistogramConfiguration.HistogramConfiguration() -> void OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool -OpenTelemetry.OpenTelemetryBuilder -OpenTelemetry.OpenTelemetryBuilder.ConfigureResource(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics() -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing() -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryServiceCollectionExtensions static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! implementationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetry(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> OpenTelemetry.OpenTelemetryBuilder! static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string? OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string! traceStateString) -> void diff --git a/src/OpenTelemetry/AssemblyInfo.cs b/src/OpenTelemetry/AssemblyInfo.cs index 38bc9f164dd..f953f6323fd 100644 --- a/src/OpenTelemetry/AssemblyInfo.cs +++ b/src/OpenTelemetry/AssemblyInfo.cs @@ -21,5 +21,6 @@ [assembly: InternalsVisibleTo("OpenTelemetry.Exporter.Prometheus.AspNetCore" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("OpenTelemetry.Exporter.Prometheus.HttpListener.Tests" + AssemblyInfo.PublicKey)] +[assembly: InternalsVisibleTo("OpenTelemetry.Extensions.Hosting" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2" + AssemblyInfo.MoqPublicKey)] [assembly: InternalsVisibleTo("Benchmarks" + AssemblyInfo.PublicKey)] diff --git a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs deleted file mode 100644 index 2541a85f7bb..00000000000 --- a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs +++ /dev/null @@ -1,55 +0,0 @@ -// -// Copyright The OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#nullable enable - -using Microsoft.Extensions.DependencyInjection; -using OpenTelemetry.Metrics; -using OpenTelemetry.Trace; - -namespace OpenTelemetry; - -/// -/// Contains extension methods for registering OpenTelemetry SDK artifacts. -/// -public static class OpenTelemetryServiceCollectionExtensions -{ - /// - /// Adds OpenTelemetry SDK services into the supplied . - /// - /// - /// Notes: - /// - /// A and/or - /// will not be created automatically using this method. To begin collecting - /// traces and/or metrics either use the - /// OpenTelemetryBuilder.StartWithHost extension in the - /// OpenTelemetry.Extensions.Hosting package or access the and/or through the - /// application . - /// This is safe to be called multiple times and by library authors. - /// Only a single and/or will be created for a given . - /// - /// - /// . - /// The supplied for chaining - /// calls. - public static OpenTelemetryBuilder AddOpenTelemetry(this IServiceCollection services) - => new(services); -} From d1cfc77e3f6d45c4fc5c59fb9537ac751e5545a0 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 9 Feb 2023 11:12:17 -0800 Subject: [PATCH 02/11] Added Azure Functions warning. --- .../Implementation/TelemetryHostedService.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs index 78e50395b59..e0057979b10 100644 --- a/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs +++ b/src/OpenTelemetry.Extensions.Hosting/Implementation/TelemetryHostedService.cs @@ -20,6 +20,10 @@ using OpenTelemetry.Metrics; using OpenTelemetry.Trace; +// Warning: Do not change the namespace or class name in this file! Azure +// Functions has taken a dependency on the specific details: +// https://github.com/Azure/azure-functions-host/blob/d4655cc4fbb34fc14e6861731991118a9acd02ed/src/WebJobs.Script.WebHost/DependencyInjection/DependencyValidator/DependencyValidator.cs#L57 + namespace OpenTelemetry.Extensions.Hosting.Implementation; internal sealed class TelemetryHostedService : IHostedService From 856b57fd4c5ca279df32ac21cd25252fe9f6b1a5 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 9 Feb 2023 13:52:14 -0800 Subject: [PATCH 03/11] Test fixes. --- .../HostingMeterExtensionTests.cs | 6 ++---- .../HostingTracerExtensionTests.cs | 6 ++---- .../InMemoryExporterMetricsExtensionsTests.cs | 2 +- .../OpenTelemetry.Extensions.Hosting.Tests.csproj | 2 ++ .../TelemetryHostedServiceTests.cs | 7 +++---- .../BasicTests.cs | 6 ++---- .../DependencyInjectionConfigTests.cs | 6 ++---- ...IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs | 3 +-- 8 files changed, 15 insertions(+), 23 deletions(-) diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs index fe267d558a5..1086022fce0 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs @@ -37,8 +37,7 @@ public async Task AddOpenTelemetry_StartWithHost_CreationAndDisposal() { callbackRun = true; return new object(); - })) - .StartWithHost(); + })); }); var host = builder.Build(); @@ -89,8 +88,7 @@ public async Task AddOpenTelemetry_StartWithHost_HostConfigurationHonoredTest() Assert.Equal("TEST_KEY_VALUE", testKeyValue); }); } - }) - .StartWithHost(); + }); }); var host = builder.Build(); diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs index 1122a9a8e86..1f09d7a098d 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs @@ -37,8 +37,7 @@ public async Task AddOpenTelemetry_StartWithHost_CreationAndDisposal() { callbackRun = true; return new object(); - })) - .StartWithHost(); + })); }); var host = builder.Build(); @@ -89,8 +88,7 @@ public async Task AddOpenTelemetry_StartWithHost_HostConfigurationHonoredTest() Assert.Equal("TEST_KEY_VALUE", testKeyValue); }); } - }) - .StartWithHost(); + }); }); var host = builder.Build(); diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/InMemoryExporterMetricsExtensionsTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/InMemoryExporterMetricsExtensionsTests.cs index f32a85aedf3..c68b494b702 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/InMemoryExporterMetricsExtensionsTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/InMemoryExporterMetricsExtensionsTests.cs @@ -89,7 +89,7 @@ private static async Task RunMetricsTest(Action configure, using var host = await new HostBuilder() .ConfigureWebHost(webBuilder => webBuilder .UseTestServer() - .ConfigureServices(services => services.AddOpenTelemetry().WithMetrics(configure).StartWithHost()) + .ConfigureServices(services => services.AddOpenTelemetry().WithMetrics(configure)) .Configure(app => app.Run(httpContext => { testAction.Invoke(); diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj index ae38b644000..00ae7246aed 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetry.Extensions.Hosting.Tests.csproj @@ -12,7 +12,9 @@ + + diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/TelemetryHostedServiceTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/TelemetryHostedServiceTests.cs index 3900a74028f..933e165d3fc 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/TelemetryHostedServiceTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/TelemetryHostedServiceTests.cs @@ -14,6 +14,7 @@ // limitations under the License. // +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using OpenTelemetry.Trace; using Xunit; @@ -27,8 +28,7 @@ public async Task StartWithoutProvidersDoesNotThrow() { var builder = new HostBuilder().ConfigureServices(services => { - services.AddOpenTelemetry() - .StartWithHost(); + services.AddOpenTelemetry(); }); var host = builder.Build(); @@ -66,8 +66,7 @@ public async Task StartWithExceptionsThrows() } }); } - }) - .StartWithHost(); + }); }); var host = builder.Build(); diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs index cc7ffcee3c4..cb51bd437c4 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs @@ -653,8 +653,7 @@ public async Task ActivitiesStartedInMiddlewareBySettingHostActivityToNullShould .WithTracing(builder => builder .AddAspNetCoreInstrumentation() .AddSource(activitySourceName) - .AddInMemoryExporter(exportedItems)) - .StartWithHost(); + .AddInMemoryExporter(exportedItems)); }); builder.ConfigureLogging(loggingBuilder => loggingBuilder.ClearProviders()); }) @@ -692,8 +691,7 @@ void ConfigureTestServices(IServiceCollection services) services.AddOpenTelemetry() .WithTracing(builder => builder .AddAspNetCoreInstrumentation() - .AddInMemoryExporter(exportedItems)) - .StartWithHost(); + .AddInMemoryExporter(exportedItems)); // Register ActivitySource here so that it will be used // by ASP.NET Core to create activities diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs index 16136110509..3631ca9a1ef 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs @@ -46,8 +46,7 @@ void ConfigureTestServices(IServiceCollection services) { services.AddOpenTelemetry() .WithTracing(builder => builder - .AddAspNetCoreInstrumentation(name, configureAspNetCoreInstrumentationOptions: null)) - .StartWithHost(); + .AddAspNetCoreInstrumentation(name, configureAspNetCoreInstrumentationOptions: null)); services.Configure(name, options => { @@ -78,8 +77,7 @@ void ConfigureTestServices(IServiceCollection services) { services.AddOpenTelemetry() .WithMetrics(builder => builder - .AddAspNetCoreInstrumentation(name, configureAspNetCoreInstrumentationOptions: null)) - .StartWithHost(); + .AddAspNetCoreInstrumentation(name, configureAspNetCoreInstrumentationOptions: null)); services.Configure(name, options => { diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs index 971920474e9..8500ac00a22 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs @@ -63,8 +63,7 @@ public async Task SuccessfulTemplateControllerCallGeneratesASpan( services.AddOpenTelemetry() .WithTracing(builder => builder .AddAspNetCoreInstrumentation(options => options.RecordException = recordException) - .AddInMemoryExporter(exportedItems)) - .StartWithHost(); + .AddInMemoryExporter(exportedItems)); }); builder.ConfigureLogging(loggingBuilder => loggingBuilder.ClearProviders()); }) From 884e70fe04cf5a64c986096956edc792c6576f2b Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 9 Feb 2023 14:32:22 -0800 Subject: [PATCH 04/11] Test fixes. --- src/OpenTelemetry/AssemblyInfo.cs | 1 + .../OpenTelemetryServicesExtensionsTests.cs | 191 ++++++++++++++++++ .../TelemetryHostedServiceTests.cs | 86 -------- .../MeterProviderBuilderExtensionsTests.cs | 79 +------- .../TracerProviderBuilderExtensionsTest.cs | 79 +------- 5 files changed, 196 insertions(+), 240 deletions(-) create mode 100644 test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs delete mode 100644 test/OpenTelemetry.Extensions.Hosting.Tests/TelemetryHostedServiceTests.cs diff --git a/src/OpenTelemetry/AssemblyInfo.cs b/src/OpenTelemetry/AssemblyInfo.cs index f953f6323fd..6b94f59eb69 100644 --- a/src/OpenTelemetry/AssemblyInfo.cs +++ b/src/OpenTelemetry/AssemblyInfo.cs @@ -22,5 +22,6 @@ [assembly: InternalsVisibleTo("OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("OpenTelemetry.Exporter.Prometheus.HttpListener.Tests" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("OpenTelemetry.Extensions.Hosting" + AssemblyInfo.PublicKey)] +[assembly: InternalsVisibleTo("OpenTelemetry.Extensions.Hosting.Tests" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2" + AssemblyInfo.MoqPublicKey)] [assembly: InternalsVisibleTo("Benchmarks" + AssemblyInfo.PublicKey)] diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs new file mode 100644 index 00000000000..3878bda793f --- /dev/null +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs @@ -0,0 +1,191 @@ +// +// 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 Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; +using Xunit; + +namespace OpenTelemetry.Extensions.Hosting.Tests; + +public class OpenTelemetryServicesExtensionsTests +{ + [Fact] + public async Task AddOpenTelemetry_StartWithoutProvidersDoesNotThrow() + { + var builder = new HostBuilder().ConfigureServices(services => + { + services.AddOpenTelemetry(); + }); + + var host = builder.Build(); + + await host.StartAsync().ConfigureAwait(false); + + await host.StopAsync().ConfigureAwait(false); + } + + [Fact] + public async Task AddOpenTelemetry_StartWithExceptionsThrows() + { + bool expectedInnerExceptionThrown = false; + + var builder = new HostBuilder().ConfigureServices(services => + { + services.AddOpenTelemetry() + .WithTracing(builder => + { + if (builder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) + { + deferredTracerProviderBuilder.Configure((sp, sdkBuilder) => + { + try + { + // Note: This throws because services cannot be + // registered after IServiceProvider has been + // created. + sdkBuilder.SetSampler(); + } + catch (NotSupportedException) + { + expectedInnerExceptionThrown = true; + throw; + } + }); + } + }); + }); + + var host = builder.Build(); + + await Assert.ThrowsAsync(() => host.StartAsync()).ConfigureAwait(false); + + await host.StopAsync().ConfigureAwait(false); + + Assert.True(expectedInnerExceptionThrown); + } + + [Fact] + public void AddOpenTelemetry_WithTracing_SingleProviderForServiceCollectionTest() + { + var services = new ServiceCollection(); + + services.AddOpenTelemetry().WithTracing(builder => { }); + + services.AddOpenTelemetry().WithTracing(builder => { }); + + using var serviceProvider = services.BuildServiceProvider(); + + Assert.NotNull(serviceProvider); + + var tracerProviders = serviceProvider.GetServices(); + + Assert.Single(tracerProviders); + } + + [Fact] + public void AddOpenTelemetry_WithTracing_DisposalTest() + { + var services = new ServiceCollection(); + + bool testRun = false; + + services.AddOpenTelemetry().WithTracing(builder => + { + testRun = true; + + // Note: Build can't be called directly on builder tied to external services + Assert.Throws(() => builder.Build()); + }); + + Assert.True(testRun); + + var serviceProvider = services.BuildServiceProvider(); + + var provider = serviceProvider.GetRequiredService() as TracerProviderSdk; + + Assert.NotNull(provider); + Assert.Null(provider.OwnedServiceProvider); + + Assert.NotNull(serviceProvider); + Assert.NotNull(provider); + + Assert.False(provider.Disposed); + + serviceProvider.Dispose(); + + Assert.True(provider.Disposed); + } + + [Fact] + public void AddOpenTelemetry_WithMetrics_SingleProviderForServiceCollectionTest() + { + var services = new ServiceCollection(); + + services.AddOpenTelemetry().WithMetrics(builder => { }); + + services.AddOpenTelemetry().WithMetrics(builder => { }); + + using var serviceProvider = services.BuildServiceProvider(); + + Assert.NotNull(serviceProvider); + + var meterProviders = serviceProvider.GetServices(); + + Assert.Single(meterProviders); + } + + [Fact] + public void AddOpenTelemetry_WithMetrics_DisposalTest() + { + var services = new ServiceCollection(); + + bool testRun = false; + + services.AddOpenTelemetry().WithMetrics(builder => + { + testRun = true; + + // Note: Build can't be called directly on builder tied to external services + Assert.Throws(() => builder.Build()); + }); + + Assert.True(testRun); + + var serviceProvider = services.BuildServiceProvider(); + + var provider = serviceProvider.GetRequiredService() as MeterProviderSdk; + + Assert.NotNull(provider); + Assert.Null(provider.OwnedServiceProvider); + + Assert.NotNull(serviceProvider); + Assert.NotNull(provider); + + Assert.False(provider.Disposed); + + serviceProvider.Dispose(); + + Assert.True(provider.Disposed); + } + + private sealed class MySampler : Sampler + { + public override SamplingResult ShouldSample(in SamplingParameters samplingParameters) + => new(SamplingDecision.RecordAndSample); + } +} diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/TelemetryHostedServiceTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/TelemetryHostedServiceTests.cs deleted file mode 100644 index 933e165d3fc..00000000000 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/TelemetryHostedServiceTests.cs +++ /dev/null @@ -1,86 +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 Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using OpenTelemetry.Trace; -using Xunit; - -namespace OpenTelemetry.Extensions.Hosting.Tests; - -public class TelemetryHostedServiceTests -{ - [Fact] - public async Task StartWithoutProvidersDoesNotThrow() - { - var builder = new HostBuilder().ConfigureServices(services => - { - services.AddOpenTelemetry(); - }); - - var host = builder.Build(); - - await host.StartAsync().ConfigureAwait(false); - - await host.StopAsync().ConfigureAwait(false); - } - - [Fact] - public async Task StartWithExceptionsThrows() - { - bool expectedInnerExceptionThrown = false; - - var builder = new HostBuilder().ConfigureServices(services => - { - services.AddOpenTelemetry() - .WithTracing(builder => - { - if (builder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) - { - deferredTracerProviderBuilder.Configure((sp, sdkBuilder) => - { - try - { - // Note: This throws because services cannot be - // registered after IServiceProvider has been - // created. - sdkBuilder.SetSampler(); - } - catch (NotSupportedException) - { - expectedInnerExceptionThrown = true; - throw; - } - }); - } - }); - }); - - var host = builder.Build(); - - await Assert.ThrowsAsync(() => host.StartAsync()).ConfigureAwait(false); - - await host.StopAsync().ConfigureAwait(false); - - Assert.True(expectedInnerExceptionThrown); - } - - private sealed class MySampler : Sampler - { - public override SamplingResult ShouldSample(in SamplingParameters samplingParameters) - => new SamplingResult(SamplingDecision.RecordAndSample); - } -} diff --git a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs index abb07547690..cbd89733f71 100644 --- a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs @@ -56,81 +56,6 @@ public void ServiceLifecycleAvailableToSDKBuilderTest() Assert.True(myInstrumentation.Disposed); } - [Fact] - public void ServiceLifecycleAvailableToServicesBuilderTest() - { - var services = new ServiceCollection(); - - bool testRun = false; - - ServiceProvider serviceProvider = null; - MeterProviderSdk provider = null; - - services.AddOpenTelemetry().WithMetrics(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 MeterProviderSdk; - - 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.AddOpenTelemetry().WithMetrics(builder => - { - builder.AddInstrumentation(() => new()); - }); - - services.AddOpenTelemetry().WithMetrics(builder => - { - builder.AddInstrumentation(() => new()); - }); - - using var serviceProvider = services.BuildServiceProvider(); - - Assert.NotNull(serviceProvider); - - var meterProviders = serviceProvider.GetServices(); - - Assert.Single(meterProviders); - - var provider = meterProviders.First() as MeterProviderSdk; - - Assert.NotNull(provider); - - Assert.Equal(2, provider.Instrumentations.Count); - } - [Fact] public void AddReaderUsingDependencyInjectionTest() { @@ -268,7 +193,7 @@ public void MeterProviderNestedResolutionUsingBuilderTest(bool callNestedConfigu { if (callNestedConfigure) { - services.AddOpenTelemetry().WithMetrics(builder => { }); + services.ConfigureOpenTelemetryMeterProvider((sp, builder) => { }); } }) .ConfigureBuilder((sp, builder) => @@ -290,7 +215,7 @@ public void MeterProviderNestedResolutionUsingConfigureTest() var services = new ServiceCollection(); - services.AddOpenTelemetry().WithMetrics(builder => + services.ConfigureOpenTelemetryMeterProvider((sp, builder) => { builder.ConfigureBuilder((sp, builder) => { diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs index fa0a8383f6b..2af025734ac 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs @@ -144,81 +144,6 @@ public void ServiceLifecycleAvailableToSDKBuilderTest() Assert.True(myInstrumentation.Disposed); } - [Fact] - public void ServiceLifecycleAvailableToServicesBuilderTest() - { - var services = new ServiceCollection(); - - bool testRun = false; - - ServiceProvider serviceProvider = null; - TracerProviderSdk provider = null; - - services.AddOpenTelemetry().WithTracing(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.AddOpenTelemetry().WithTracing(builder => - { - builder.AddInstrumentation(() => new()); - }); - - services.AddOpenTelemetry().WithTracing(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() { @@ -356,7 +281,7 @@ public void TracerProviderNestedResolutionUsingBuilderTest(bool callNestedConfig { if (callNestedConfigure) { - services.AddOpenTelemetry().WithTracing(builder => { }); + services.ConfigureOpenTelemetryTracerProvider((sp, builder) => { }); } }) .ConfigureBuilder((sp, builder) => @@ -378,7 +303,7 @@ public void TracerProviderNestedResolutionUsingConfigureTest() var services = new ServiceCollection(); - services.AddOpenTelemetry().WithTracing(builder => + services.ConfigureOpenTelemetryTracerProvider((sp, builder) => { builder.ConfigureBuilder((sp, builder) => { From 5ff32a6dc3d8b77bb2f06ec9d15dde385e6aca01 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 9 Feb 2023 14:35:47 -0800 Subject: [PATCH 05/11] Patch CHANGELOGs. --- src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md | 5 +++++ src/OpenTelemetry/CHANGELOG.md | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md index 8e7983ec511..a5061ea58c0 100644 --- a/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md +++ b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md @@ -2,6 +2,11 @@ ## Unreleased +* Added `AddOpenTelemetry` extension from SDK and removed `StartWithHost`. + `AddOpenTelemetry` now registers the `IHostedService` used to start collecting + traces and/or metrics. + ([#4174](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4174)) + ## 1.4.0-rc.3 Released 2023-Feb-01 diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index 9940288268f..27a0ed3413d 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -5,6 +5,11 @@ * Removed the dependency on System.Reflection.Emit.Lightweight ([#4140](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4140)) +* Moved the `AddOpenTelemetry` extension into the + `OpenTelemetry.Extensions.Hosting` package so that the `StartWithHost` API + could be removed. + ([#4174](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4174)) + ## 1.4.0-rc.3 Released 2023-Feb-01 From 89988494c8e1198dad4a2b88c067ec32cf5b4ce9 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 9 Feb 2023 14:45:29 -0800 Subject: [PATCH 06/11] Hosting README updates. --- .../README.md | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/README.md b/src/OpenTelemetry.Extensions.Hosting/README.md index a1703580f07..c024ea1b963 100644 --- a/src/OpenTelemetry.Extensions.Hosting/README.md +++ b/src/OpenTelemetry.Extensions.Hosting/README.md @@ -23,12 +23,40 @@ and metrics (`MeterProvider`) in [ASP.NET ### Current OpenTelemetry SDK v1.4.0 and newer extensions -Targeting `OpenTelemetry.OpenTelemetryBuilder`: +Targeting `Microsoft.Extensions.DependencyInjection.IServiceCollection`: -* `StartWithHost`: Registers an +* `AddOpenTelemetry`: Registers an [IHostedService](https://learn.microsoft.com/dotnet/api/microsoft.extensions.hosting.ihostedservice) to automatically start tracing and/or metric services in the supplied - [IServiceCollection](https://learn.microsoft.com/dotnet/api/microsoft.extensions.dependencyinjection.iservicecollection). + [IServiceCollection](https://learn.microsoft.com/dotnet/api/microsoft.extensions.dependencyinjection.iservicecollection) + and then returns an `OpenTelemetryBuilder` class. + + > **Note** + > `AddOpenTelemetry` should be called by application host code only. Library + authors see: [Registration extension method guidance for library + authors](../../docs/trace/extending-the-sdk/README.md#registration-extension-method-guidance-for-library-authors). + + > **Note** + > Multiple calls to `AddOpenTelemetry` will **NOT** result in multiple + providers. Only a single `TracerProvider` and/or `MeterProvider` will be + created in the target `IServiceCollection`. To establish multiple providers + use the `Sdk.CreateTracerProviderBuilder()` and/or + `Sdk.CreateMeterProviderBuilder()` methods. See [TracerProvider + configuration](../../docs/trace/customizing-the-sdk/README.md#tracerprovider-configuration) + and [Building a + MeterProvider](../../docs/metrics/customizing-the-sdk/README.md#building-a-meterprovider) + for more details. + + `OpenTelemetryBuilder` methods: + + * `ConfigureResource`: Registers a callback action to configure the + `ResourceBuilder` for tracing and metric providers. + + * `WithTracing`: Enables tracing and optionally configures the + `TracerProvider`. + + * `WithMetrics`: Enables metrics and optionally configures the + `MeterProvider`. ### Obsolete OpenTelemetry SDK pre-1.4.0 extensions From b0f24eedb052857f1582874633718220697bb837 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 9 Feb 2023 14:46:17 -0800 Subject: [PATCH 07/11] Comment tweak. --- examples/AspNetCore/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/AspNetCore/Program.cs b/examples/AspNetCore/Program.cs index 3b37ea9ca5f..6018cad6090 100644 --- a/examples/AspNetCore/Program.cs +++ b/examples/AspNetCore/Program.cs @@ -44,7 +44,7 @@ appBuilder.Services.AddSingleton(); // Configure OpenTelemetry tracing & metrics with auto-start using the -// StartWithHost extension from OpenTelemetry.Extensions.Hosting. +// AddOpenTelemetry extension from OpenTelemetry.Extensions.Hosting. appBuilder.Services.AddOpenTelemetry() .ConfigureResource(configureResource) .WithTracing(builder => From 5bf1072fecd5ce58fc408f6fda0b6916d7086b4f Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 9 Feb 2023 14:50:33 -0800 Subject: [PATCH 08/11] Clean up. --- src/OpenTelemetry.Exporter.Jaeger/README.md | 3 +-- .../README.md | 3 +-- .../README.md | 3 +-- src/OpenTelemetry.Exporter.Zipkin/README.md | 3 +-- .../OpenTelemetryBuilder.cs | 26 +++---------------- .../README.md | 4 +-- .../README.md | 12 +++------ .../README.md | 3 +-- 8 files changed, 15 insertions(+), 42 deletions(-) diff --git a/src/OpenTelemetry.Exporter.Jaeger/README.md b/src/OpenTelemetry.Exporter.Jaeger/README.md index 411e3d40283..643d9874819 100644 --- a/src/OpenTelemetry.Exporter.Jaeger/README.md +++ b/src/OpenTelemetry.Exporter.Jaeger/README.md @@ -98,8 +98,7 @@ services.AddOpenTelemetry() client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value"); return client; }; - })) - .StartWithHost(); + })); ``` For users using diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/README.md b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/README.md index 369b6e1574e..177f9639443 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/README.md +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/README.md @@ -135,8 +135,7 @@ services.AddOpenTelemetry() client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value"); return client; }; - })) - .StartWithHost(); + })); ``` For users using diff --git a/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/README.md b/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/README.md index 6bcd236b5bb..e6676934961 100644 --- a/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/README.md +++ b/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/README.md @@ -28,8 +28,7 @@ dotnet add package --prerelease OpenTelemetry.Exporter.Prometheus.AspNetCore ```csharp services.AddOpenTelemetry() .WithMetrics(builder => builder - .AddPrometheusExporter()) - .StartWithHost(); + .AddPrometheusExporter()); ``` * Or configure directly: diff --git a/src/OpenTelemetry.Exporter.Zipkin/README.md b/src/OpenTelemetry.Exporter.Zipkin/README.md index 20d794c051d..aa277b7fdc2 100644 --- a/src/OpenTelemetry.Exporter.Zipkin/README.md +++ b/src/OpenTelemetry.Exporter.Zipkin/README.md @@ -87,8 +87,7 @@ services.AddOpenTelemetry() HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value"); return client; - })) - .StartWithHost(); + })); ``` For users using diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilder.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilder.cs index 3290d7a8686..110d2b89915 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilder.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilder.cs @@ -72,18 +72,9 @@ public OpenTelemetryBuilder ConfigureResource( /// Adds metric services into the builder. /// /// - /// Notes: - /// - /// A will not be created automatically - /// using this method. To begin collecting metrics either use the - /// OpenTelemetryBuilder.StartWithHost extension in the - /// OpenTelemetry.Extensions.Hosting package or access the through the application . - /// This is safe to be called multiple times and by library authors. + /// Note: This is safe to be called multiple times and by library authors. /// Only a single will be created for a given - /// . - /// + /// . /// /// The supplied for chaining /// calls. @@ -113,18 +104,9 @@ public OpenTelemetryBuilder WithMetrics(Action configure) /// Adds tracing services into the builder. /// /// - /// Notes: - /// - /// A will not be created automatically - /// using this method. To begin collecting traces either use the - /// OpenTelemetryBuilder.StartWithHost extension in the - /// OpenTelemetry.Extensions.Hosting package or access the through the application . - /// This is safe to be called multiple times and by library authors. + /// Note: This is safe to be called multiple times and by library authors. /// Only a single will be created for a given - /// . - /// + /// . /// /// The supplied for chaining /// calls. diff --git a/src/OpenTelemetry.Extensions.Hosting/README.md b/src/OpenTelemetry.Extensions.Hosting/README.md index c024ea1b963..45a80700317 100644 --- a/src/OpenTelemetry.Extensions.Hosting/README.md +++ b/src/OpenTelemetry.Extensions.Hosting/README.md @@ -101,9 +101,9 @@ using OpenTelemetry.Trace; var appBuilder = WebApplication.CreateBuilder(args); appBuilder.Services.AddOpenTelemetry() + .ConfigureResource(builder => builder.AddService(serviceName: "MyService")) .WithTracing(builder => builder.AddConsoleExporter()) - .WithMetrics(builder => builder.AddConsoleExporter()) - .StartWithHost(); + .WithMetrics(builder => builder.AddConsoleExporter()); var app = appBuilder.Build(); diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/README.md b/src/OpenTelemetry.Instrumentation.AspNetCore/README.md index 59e489b8676..fd535b1682c 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/README.md +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/README.md @@ -58,8 +58,7 @@ public void ConfigureServices(IServiceCollection services) services.AddOpenTelemetry() .WithTracing(builder => builder .AddAspNetCoreInstrumentation() - .AddJaegerExporter()) - .StartWithHost(); + .AddJaegerExporter()); } ``` @@ -88,8 +87,7 @@ services.Configure(options => services.AddOpenTelemetry() .WithTracing(builder => builder .AddAspNetCoreInstrumentation() - .AddJaegerExporter()) - .StartWithHost(); + .AddJaegerExporter()); ``` ### Filter @@ -112,8 +110,7 @@ services.AddOpenTelemetry() // only collect telemetry about HTTP GET requests return httpContext.Request.Method.Equals("GET"); }) - .AddJaegerExporter()) - .StartWithHost(); + .AddJaegerExporter()); ``` It is important to note that this `Filter` option is specific to this @@ -150,8 +147,7 @@ services.AddOpenTelemetry() { activity.SetTag("exceptionType", exception.GetType().ToString()); }; - })) - .StartWithHost(); + })); ``` [Processor](../../docs/trace/extending-the-sdk/README.md#processor), diff --git a/src/OpenTelemetry.Instrumentation.GrpcNetClient/README.md b/src/OpenTelemetry.Instrumentation.GrpcNetClient/README.md index 62bb0853aea..bfb6dfbb701 100644 --- a/src/OpenTelemetry.Instrumentation.GrpcNetClient/README.md +++ b/src/OpenTelemetry.Instrumentation.GrpcNetClient/README.md @@ -120,8 +120,7 @@ services.AddOpenTelemetry() { activity.SetTag("responseVersion", httpResponseMessage.Version); }; - }) - .StartWithHost(); + }); ``` [Processor](../../docs/trace/extending-the-sdk/README.md#processor), From a7061bcb6137c7465056343703e5a4de7ad9f2de Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 9 Feb 2023 14:53:54 -0800 Subject: [PATCH 09/11] Test cleanup. --- .../HostingMeterExtensionTests.cs | 107 ------------------ .../HostingTracerExtensionTests.cs | 107 ------------------ .../OpenTelemetryServicesExtensionsTests.cs | 95 ++++++++++++++++ 3 files changed, 95 insertions(+), 214 deletions(-) delete mode 100644 test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs delete mode 100644 test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs deleted file mode 100644 index 1086022fce0..00000000000 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs +++ /dev/null @@ -1,107 +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 Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using OpenTelemetry.Metrics; -using Xunit; - -namespace OpenTelemetry.Extensions.Hosting.Tests -{ - public class HostingMeterExtensionTests - { - [Fact] - public async Task AddOpenTelemetry_StartWithHost_CreationAndDisposal() - { - var callbackRun = false; - - var builder = new HostBuilder().ConfigureServices(services => - { - services.AddOpenTelemetry() - .WithMetrics(builder => builder - .AddInstrumentation(() => - { - callbackRun = true; - return new object(); - })); - }); - - var host = builder.Build(); - - Assert.False(callbackRun); - - await host.StartAsync().ConfigureAwait(false); - - Assert.True(callbackRun); - - await host.StopAsync().ConfigureAwait(false); - - Assert.True(callbackRun); - - host.Dispose(); - - Assert.True(callbackRun); - } - - [Fact] - public async Task AddOpenTelemetry_StartWithHost_HostConfigurationHonoredTest() - { - bool configureBuilderCalled = false; - - var builder = new HostBuilder() - .ConfigureAppConfiguration(builder => - { - builder.AddInMemoryCollection(new Dictionary - { - ["TEST_KEY"] = "TEST_KEY_VALUE", - }); - }) - .ConfigureServices(services => - { - services.AddOpenTelemetry() - .WithMetrics(builder => - { - if (builder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder) - { - deferredMeterProviderBuilder.Configure((sp, builder) => - { - configureBuilderCalled = true; - - var configuration = sp.GetRequiredService(); - - var testKeyValue = configuration.GetValue("TEST_KEY", null); - - Assert.Equal("TEST_KEY_VALUE", testKeyValue); - }); - } - }); - }); - - var host = builder.Build(); - - Assert.False(configureBuilderCalled); - - await host.StartAsync().ConfigureAwait(false); - - Assert.True(configureBuilderCalled); - - await host.StopAsync().ConfigureAwait(false); - - host.Dispose(); - } - } -} diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs deleted file mode 100644 index 1f09d7a098d..00000000000 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs +++ /dev/null @@ -1,107 +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 Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using OpenTelemetry.Trace; -using Xunit; - -namespace OpenTelemetry.Extensions.Hosting.Tests -{ - public class HostingTracerExtensionTests - { - [Fact] - public async Task AddOpenTelemetry_StartWithHost_CreationAndDisposal() - { - var callbackRun = false; - - var builder = new HostBuilder().ConfigureServices(services => - { - services.AddOpenTelemetry() - .WithTracing(builder => builder - .AddInstrumentation(() => - { - callbackRun = true; - return new object(); - })); - }); - - var host = builder.Build(); - - Assert.False(callbackRun); - - await host.StartAsync().ConfigureAwait(false); - - Assert.True(callbackRun); - - await host.StopAsync().ConfigureAwait(false); - - Assert.True(callbackRun); - - host.Dispose(); - - Assert.True(callbackRun); - } - - [Fact] - public async Task AddOpenTelemetry_StartWithHost_HostConfigurationHonoredTest() - { - bool configureBuilderCalled = false; - - var builder = new HostBuilder() - .ConfigureAppConfiguration(builder => - { - builder.AddInMemoryCollection(new Dictionary - { - ["TEST_KEY"] = "TEST_KEY_VALUE", - }); - }) - .ConfigureServices(services => - { - services.AddOpenTelemetry() - .WithTracing(builder => - { - if (builder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) - { - deferredTracerProviderBuilder.Configure((sp, builder) => - { - configureBuilderCalled = true; - - var configuration = sp.GetRequiredService(); - - var testKeyValue = configuration.GetValue("TEST_KEY", null); - - Assert.Equal("TEST_KEY_VALUE", testKeyValue); - }); - } - }); - }); - - var host = builder.Build(); - - Assert.False(configureBuilderCalled); - - await host.StartAsync().ConfigureAwait(false); - - Assert.True(configureBuilderCalled); - - await host.StopAsync().ConfigureAwait(false); - - host.Dispose(); - } - } -} diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs index 3878bda793f..f863ceb8739 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs @@ -14,6 +14,7 @@ // limitations under the License. // +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using OpenTelemetry.Metrics; @@ -131,6 +132,53 @@ public void AddOpenTelemetry_WithTracing_DisposalTest() Assert.True(provider.Disposed); } + [Fact] + public async Task AddOpenTelemetry_WithTracing_HostConfigurationHonoredTest() + { + bool configureBuilderCalled = false; + + var builder = new HostBuilder() + .ConfigureAppConfiguration(builder => + { + builder.AddInMemoryCollection(new Dictionary + { + ["TEST_KEY"] = "TEST_KEY_VALUE", + }); + }) + .ConfigureServices(services => + { + services.AddOpenTelemetry() + .WithTracing(builder => + { + if (builder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) + { + deferredTracerProviderBuilder.Configure((sp, builder) => + { + configureBuilderCalled = true; + + var configuration = sp.GetRequiredService(); + + var testKeyValue = configuration.GetValue("TEST_KEY", null); + + Assert.Equal("TEST_KEY_VALUE", testKeyValue); + }); + } + }); + }); + + var host = builder.Build(); + + Assert.False(configureBuilderCalled); + + await host.StartAsync().ConfigureAwait(false); + + Assert.True(configureBuilderCalled); + + await host.StopAsync().ConfigureAwait(false); + + host.Dispose(); + } + [Fact] public void AddOpenTelemetry_WithMetrics_SingleProviderForServiceCollectionTest() { @@ -183,6 +231,53 @@ public void AddOpenTelemetry_WithMetrics_DisposalTest() Assert.True(provider.Disposed); } + [Fact] + public async Task AddOpenTelemetry_WithMetrics_HostConfigurationHonoredTest() + { + bool configureBuilderCalled = false; + + var builder = new HostBuilder() + .ConfigureAppConfiguration(builder => + { + builder.AddInMemoryCollection(new Dictionary + { + ["TEST_KEY"] = "TEST_KEY_VALUE", + }); + }) + .ConfigureServices(services => + { + services.AddOpenTelemetry() + .WithMetrics(builder => + { + if (builder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder) + { + deferredMeterProviderBuilder.Configure((sp, builder) => + { + configureBuilderCalled = true; + + var configuration = sp.GetRequiredService(); + + var testKeyValue = configuration.GetValue("TEST_KEY", null); + + Assert.Equal("TEST_KEY_VALUE", testKeyValue); + }); + } + }); + }); + + var host = builder.Build(); + + Assert.False(configureBuilderCalled); + + await host.StartAsync().ConfigureAwait(false); + + Assert.True(configureBuilderCalled); + + await host.StopAsync().ConfigureAwait(false); + + host.Dispose(); + } + private sealed class MySampler : Sampler { public override SamplingResult ShouldSample(in SamplingParameters samplingParameters) From e3ea3e807764b35cb47058be26fb891dd4427143 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 9 Feb 2023 14:55:25 -0800 Subject: [PATCH 10/11] MD lint. --- src/OpenTelemetry.Extensions.Hosting/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/README.md b/src/OpenTelemetry.Extensions.Hosting/README.md index 45a80700317..6b907b55792 100644 --- a/src/OpenTelemetry.Extensions.Hosting/README.md +++ b/src/OpenTelemetry.Extensions.Hosting/README.md @@ -35,7 +35,8 @@ Targeting `Microsoft.Extensions.DependencyInjection.IServiceCollection`: > `AddOpenTelemetry` should be called by application host code only. Library authors see: [Registration extension method guidance for library authors](../../docs/trace/extending-the-sdk/README.md#registration-extension-method-guidance-for-library-authors). - + > **Note** > Multiple calls to `AddOpenTelemetry` will **NOT** result in multiple providers. Only a single `TracerProvider` and/or `MeterProvider` will be From 258fac3f844e37dc3fca813617eb3ab8637dbb36 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 9 Feb 2023 16:15:57 -0800 Subject: [PATCH 11/11] Test fixes. --- .../OpenTelemetryServicesExtensionsTests.cs | 48 +++++++++++++++++++ .../MeterProviderBuilderExtensionsTests.cs | 23 --------- .../TracerProviderBuilderExtensionsTest.cs | 23 --------- 3 files changed, 48 insertions(+), 46 deletions(-) diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs index f863ceb8739..a0d1265799c 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/OpenTelemetryServicesExtensionsTests.cs @@ -179,6 +179,30 @@ public async Task AddOpenTelemetry_WithTracing_HostConfigurationHonoredTest() host.Dispose(); } + [Fact] + public void AddOpenTelemetry_WithTracing_NestedResolutionUsingConfigureTest() + { + bool innerTestExecuted = false; + + var services = new ServiceCollection(); + + services.AddOpenTelemetry().WithTracing(builder => + { + if (builder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) + { + deferredTracerProviderBuilder.Configure((sp, builder) => + { + innerTestExecuted = true; + Assert.Throws(() => sp.GetService()); + }); + } + }); + + using var serviceProvider = services.BuildServiceProvider(); + var resolvedProvider = serviceProvider.GetRequiredService(); + Assert.True(innerTestExecuted); + } + [Fact] public void AddOpenTelemetry_WithMetrics_SingleProviderForServiceCollectionTest() { @@ -278,6 +302,30 @@ public async Task AddOpenTelemetry_WithMetrics_HostConfigurationHonoredTest() host.Dispose(); } + [Fact] + public void AddOpenTelemetry_WithMetrics_NestedResolutionUsingConfigureTest() + { + bool innerTestExecuted = false; + + var services = new ServiceCollection(); + + services.AddOpenTelemetry().WithMetrics(builder => + { + if (builder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder) + { + deferredMeterProviderBuilder.Configure((sp, builder) => + { + innerTestExecuted = true; + Assert.Throws(() => sp.GetService()); + }); + } + }); + + using var serviceProvider = services.BuildServiceProvider(); + var resolvedProvider = serviceProvider.GetRequiredService(); + Assert.True(innerTestExecuted); + } + private sealed class MySampler : Sampler { public override SamplingResult ShouldSample(in SamplingParameters samplingParameters) diff --git a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs index cbd89733f71..f4012b52d11 100644 --- a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs @@ -208,29 +208,6 @@ public void MeterProviderNestedResolutionUsingBuilderTest(bool callNestedConfigu Assert.Throws(() => provider.GetServiceProvider()?.GetService()); } - [Fact] - public void MeterProviderNestedResolutionUsingConfigureTest() - { - bool innerTestExecuted = false; - - var services = new ServiceCollection(); - - services.ConfigureOpenTelemetryMeterProvider((sp, builder) => - { - builder.ConfigureBuilder((sp, builder) => - { - innerTestExecuted = true; - Assert.Throws(() => sp.GetService()); - }); - }); - - using var serviceProvider = services.BuildServiceProvider(); - - var resolvedProvider = serviceProvider.GetRequiredService(); - - Assert.True(innerTestExecuted); - } - [Fact] public void MeterProviderAddReaderFactoryTest() { diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs index 2af025734ac..8b042d488ae 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs @@ -296,29 +296,6 @@ public void TracerProviderNestedResolutionUsingBuilderTest(bool callNestedConfig Assert.Throws(() => provider.GetServiceProvider()?.GetService()); } - [Fact] - public void TracerProviderNestedResolutionUsingConfigureTest() - { - bool innerTestExecuted = false; - - var services = new ServiceCollection(); - - services.ConfigureOpenTelemetryTracerProvider((sp, builder) => - { - builder.ConfigureBuilder((sp, builder) => - { - innerTestExecuted = true; - Assert.Throws(() => sp.GetService()); - }); - }); - - using var serviceProvider = services.BuildServiceProvider(); - - var resolvedProvider = serviceProvider.GetRequiredService(); - - Assert.True(innerTestExecuted); - } - [Fact] public void TracerProviderSetSamplerFactoryTest() {