From 0521dfac9870c3817f3b3ef7bb137441d3258d4f Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 18 Nov 2022 14:09:18 -0800 Subject: [PATCH 01/48] Introduce OpenTelemetry.DependencyInjection and refactor SDK. --- OpenTelemetry.sln | 12 +- build/Common.props | 1 + .../.publicApi/net462/PublicAPI.Shipped.txt | 1 + .../.publicApi/net462/PublicAPI.Unshipped.txt | 0 .../netstandard2.0/PublicAPI.Shipped.txt | 1 + .../netstandard2.0/PublicAPI.Unshipped.txt | 0 .../AssemblyInfo.cs | 33 ++ .../CHANGELOG.md | 3 + ...ConfigureProviderBuilderCallbackWrapper.cs | 38 +++ .../IConfigureProviderBuilder.cs | 24 ++ .../IProviderBuilder.cs | 30 ++ .../Metrics/DeferredMeterProviderBuilder.cs | 98 ++++++ ...derBuilderDependencyInjectionExtensions.cs | 145 +++++++++ ...viderBuilderServiceCollectionExtensions.cs | 11 +- .../OpenTelemetry.DependencyInjection.csproj | 25 ++ .../README.md | 3 + .../Trace/DeferredTracerProviderBuilder.cs | 111 +++++++ ...derBuilderDependencyInjectionExtensions.cs | 145 +++++++++ ...viderBuilderServiceCollectionExtensions.cs | 11 +- .../OpenTelemetryServicesExtensions.cs | 4 + ...rBuilderServiceCollectionCallbackHelper.cs | 83 ----- ...viderBuilderServiceCollectionExtensions.cs | 18 +- .../Internal/Builder/ProviderBuilderState.cs | 107 ------ .../Builder/MeterProviderBuilderBase.cs | 305 ++---------------- .../Builder/MeterProviderBuilderExtensions.cs | 183 ++++++----- .../Builder/MeterProviderBuilderSdk.cs | 180 ++++++++++- .../Builder/MeterProviderBuilderState.cs | 81 ----- src/OpenTelemetry/Metrics/MeterProviderSdk.cs | 17 +- src/OpenTelemetry/OpenTelemetry.csproj | 2 +- ...penTelemetryServiceCollectionExtensions.cs | 17 + src/OpenTelemetry/Sdk.cs | 4 +- .../Builder/TracerProviderBuilderBase.cs | 302 +++-------------- .../TracerProviderBuilderExtensions.cs | 139 ++++---- .../Trace/Builder/TracerProviderBuilderSdk.cs | 187 ++++++++++- .../Builder/TracerProviderBuilderState.cs | 98 ------ src/OpenTelemetry/Trace/TracerProviderSdk.cs | 22 +- .../HostingMeterExtensionTests.cs | 4 +- .../HostingTracerExtensionTests.cs | 6 +- .../MeterProviderBuilderExtensionsTests.cs | 17 +- .../Metrics/MetricAPITest.cs | 12 +- .../TracerProviderBuilderExtensionsTest.cs | 21 +- 41 files changed, 1334 insertions(+), 1167 deletions(-) create mode 100644 src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Shipped.txt create mode 100644 src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt create mode 100644 src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Shipped.txt create mode 100644 src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt create mode 100644 src/OpenTelemetry.DependencyInjection/AssemblyInfo.cs create mode 100644 src/OpenTelemetry.DependencyInjection/CHANGELOG.md create mode 100644 src/OpenTelemetry.DependencyInjection/ConfigureProviderBuilderCallbackWrapper.cs create mode 100644 src/OpenTelemetry.DependencyInjection/IConfigureProviderBuilder.cs create mode 100644 src/OpenTelemetry.DependencyInjection/IProviderBuilder.cs create mode 100644 src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs create mode 100644 src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderDependencyInjectionExtensions.cs rename src/{OpenTelemetry/Metrics/Builder => OpenTelemetry.DependencyInjection/Metrics}/MeterProviderBuilderServiceCollectionExtensions.cs (88%) create mode 100644 src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj create mode 100644 src/OpenTelemetry.DependencyInjection/README.md create mode 100644 src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs create mode 100644 src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderDependencyInjectionExtensions.cs rename src/{OpenTelemetry/Trace/Builder => OpenTelemetry.DependencyInjection/Trace}/TracerProviderBuilderServiceCollectionExtensions.cs (88%) delete mode 100644 src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionCallbackHelper.cs delete mode 100644 src/OpenTelemetry/Internal/Builder/ProviderBuilderState.cs delete mode 100644 src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderState.cs create mode 100644 src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs delete mode 100644 src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs diff --git a/OpenTelemetry.sln b/OpenTelemetry.sln index 471a28502a8..101b96bd785 100644 --- a/OpenTelemetry.sln +++ b/OpenTelemetry.sln @@ -92,9 +92,9 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{E69578EB-B456-4062-A645-877CD964528B}" ProjectSection(SolutionItems) = preProject .github\workflows\apicompatibility.yml = .github\workflows\apicompatibility.yml - .github\workflows\code-coverage.yml = .github\workflows\code-coverage.yml - .github\workflows\ci.yml = .github\workflows\ci.yml .github\workflows\ci-md.yml = .github\workflows\ci-md.yml + .github\workflows\ci.yml = .github\workflows\ci.yml + .github\workflows\code-coverage.yml = .github\workflows\code-coverage.yml .github\workflows\codeql-analysis.yml = .github\workflows\codeql-analysis.yml .github\workflows\docfx.yml = .github\workflows\docfx.yml .github\workflows\dotnet-format-md.yml = .github\workflows\dotnet-format-md.yml @@ -210,7 +210,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "source-generation", "docs\l EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "getting-started-prometheus-grafana", "docs\metrics\getting-started-prometheus-grafana\getting-started-prometheus-grafana.csproj", "{41B784AA-3301-4126-AF9F-1D59BD04B0BF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenTelemetry.SemanticConventions", "src\OpenTelemetry.SemanticConventions\OpenTelemetry.SemanticConventions.csproj", "{D4519DF6-CC72-4AC4-A851-E21383098D11}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.SemanticConventions", "src\OpenTelemetry.SemanticConventions\OpenTelemetry.SemanticConventions.csproj", "{D4519DF6-CC72-4AC4-A851-E21383098D11}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "customizing-the-sdk", "docs\logs\customizing-the-sdk\customizing-the-sdk.csproj", "{6C7A1595-36D6-4229-BBB5-5A6B5791791D}" EndProject @@ -236,6 +236,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestApp.AspNetCore", "test\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "redaction", "docs\logs\redaction\redaction.csproj", "{A2DF46DE-50D7-4887-8C9D-4BD79CA19FAA}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.DependencyInjection", "src\OpenTelemetry.DependencyInjection\OpenTelemetry.DependencyInjection.csproj", "{171A87CB-393C-4296-913F-E704CD8CEAE9}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -486,6 +488,10 @@ Global {A2DF46DE-50D7-4887-8C9D-4BD79CA19FAA}.Debug|Any CPU.Build.0 = Debug|Any CPU {A2DF46DE-50D7-4887-8C9D-4BD79CA19FAA}.Release|Any CPU.ActiveCfg = Release|Any CPU {A2DF46DE-50D7-4887-8C9D-4BD79CA19FAA}.Release|Any CPU.Build.0 = Release|Any CPU + {171A87CB-393C-4296-913F-E704CD8CEAE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {171A87CB-393C-4296-913F-E704CD8CEAE9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {171A87CB-393C-4296-913F-E704CD8CEAE9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {171A87CB-393C-4296-913F-E704CD8CEAE9}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/build/Common.props b/build/Common.props index 0906bb0a67b..014f0a77551 100644 --- a/build/Common.props +++ b/build/Common.props @@ -32,6 +32,7 @@ [3.3.3] [17.3.0] [3.1.0,) + [3.1.0,) [2.1.0,) [3.1.0,) [3.1.0,) diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Shipped.txt b/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Shipped.txt new file mode 100644 index 00000000000..7dc5c58110b --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Shipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Shipped.txt b/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Shipped.txt new file mode 100644 index 00000000000..7dc5c58110b --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Shipped.txt @@ -0,0 +1 @@ +#nullable enable diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/OpenTelemetry.DependencyInjection/AssemblyInfo.cs b/src/OpenTelemetry.DependencyInjection/AssemblyInfo.cs new file mode 100644 index 00000000000..7ccb6e5c98b --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/AssemblyInfo.cs @@ -0,0 +1,33 @@ +// +// 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.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("OpenTelemetry.DependencyInjection.Tests" + AssemblyInfo.PublicKey)] + +#if SIGNED +internal static class AssemblyInfo +{ + public const string PublicKey = ", PublicKey=002400000480000094000000060200000024000052534131000400000100010051C1562A090FB0C9F391012A32198B5E5D9A60E9B80FA2D7B434C9E5CCB7259BD606E66F9660676AFC6692B8CDC6793D190904551D2103B7B22FA636DCBB8208839785BA402EA08FC00C8F1500CCEF28BBF599AA64FFB1E1D5DC1BF3420A3777BADFE697856E9D52070A50C3EA5821C80BEF17CA3ACFFA28F89DD413F096F898"; + public const string MoqPublicKey = ", PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7"; +} +#else +internal static class AssemblyInfo +{ + public const string PublicKey = ""; + public const string MoqPublicKey = ""; +} +#endif diff --git a/src/OpenTelemetry.DependencyInjection/CHANGELOG.md b/src/OpenTelemetry.DependencyInjection/CHANGELOG.md new file mode 100644 index 00000000000..1512c421622 --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/CHANGELOG.md @@ -0,0 +1,3 @@ +# Changelog + +## Unreleased diff --git a/src/OpenTelemetry.DependencyInjection/ConfigureProviderBuilderCallbackWrapper.cs b/src/OpenTelemetry.DependencyInjection/ConfigureProviderBuilderCallbackWrapper.cs new file mode 100644 index 00000000000..8acd94c12e7 --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/ConfigureProviderBuilderCallbackWrapper.cs @@ -0,0 +1,38 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using System; +using OpenTelemetry; +using OpenTelemetry.Internal; + +namespace Microsoft.Extensions.DependencyInjection; + +internal sealed class ConfigureProviderBuilderCallbackWrapper : IConfigureProviderBuilder +{ + private readonly Action configure; + + public ConfigureProviderBuilderCallbackWrapper(Action configure) + { + Guard.ThrowIfNull(configure); + + this.configure = configure; + } + + public void ConfigureBuilder(IServiceProvider serviceProvider, TProviderBuilder providerBuilder) + { + this.configure(serviceProvider, providerBuilder); + } +} diff --git a/src/OpenTelemetry.DependencyInjection/IConfigureProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/IConfigureProviderBuilder.cs new file mode 100644 index 00000000000..9b56cd76ea8 --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/IConfigureProviderBuilder.cs @@ -0,0 +1,24 @@ +// +// 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; + +namespace OpenTelemetry; + +public interface IConfigureProviderBuilder +{ + void ConfigureBuilder(IServiceProvider serviceProvider, TProviderBuilder providerBuilder); +} diff --git a/src/OpenTelemetry.DependencyInjection/IProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/IProviderBuilder.cs new file mode 100644 index 00000000000..4fad16f9f6f --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/IProviderBuilder.cs @@ -0,0 +1,30 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using System; +using Microsoft.Extensions.DependencyInjection; + +namespace OpenTelemetry; + +public interface IProviderBuilder + where TProvider : BaseProvider +{ + TProvider? Provider { get; } + + TProviderBuilder ConfigureServices(Action configure); + + TProviderBuilder ConfigureBuilder(Action configure); +} diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs new file mode 100644 index 00000000000..66130af393e --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs @@ -0,0 +1,98 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using System; +using Microsoft.Extensions.DependencyInjection.Extensions; +using OpenTelemetry; +using OpenTelemetry.Internal; +using OpenTelemetry.Metrics; + +namespace Microsoft.Extensions.DependencyInjection; + +public class DeferredMeterProviderBuilder : MeterProviderBuilder, IProviderBuilder, IDeferredMeterProviderBuilder +{ + public DeferredMeterProviderBuilder(IServiceCollection services) + { + Guard.ThrowIfNull(services); + + this.Services = services; + + services.TryAddSingleton(sp => throw new NotSupportedException("The OpenTelemetry SDK has not been initialized. Call AddOpenTelemetry to register the SDK.")); + + this.ConfigureBuilder((sp, builder) => this.Services = null); + } + + /// + MeterProvider? IProviderBuilder.Provider => null; + + protected IServiceCollection? Services { get; set; } + + /// + public override MeterProviderBuilder AddInstrumentation(Func instrumentationFactory) + { + Guard.ThrowIfNull(instrumentationFactory); + + this.ConfigureBuilder((sp, builder) => + { + builder.AddInstrumentation(instrumentationFactory); + }); + + return this; + } + + /// + public override MeterProviderBuilder AddMeter(params string[] names) + { + Guard.ThrowIfNull(names); + + this.ConfigureBuilder((sp, builder) => + { + builder.AddMeter(names); + }); + + return this; + } + + /// + public MeterProviderBuilder ConfigureBuilder(Action configure) + { + this.ConfigureServices(services => services.AddSingleton>( + new ConfigureProviderBuilderCallbackWrapper(configure))); + + return this; + } + + /// + public MeterProviderBuilder 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; + } + + /// + MeterProviderBuilder IDeferredMeterProviderBuilder.Configure(Action configure) + => this.ConfigureBuilder(configure); +} diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderDependencyInjectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderDependencyInjectionExtensions.cs new file mode 100644 index 00000000000..bebdd28b8b0 --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderDependencyInjectionExtensions.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. +// + +using System; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using OpenTelemetry.Internal; + +namespace OpenTelemetry.Metrics; + +/// +/// Contains extension methods for the class. +/// +public static class MeterProviderBuilderDependencyInjectionExtensions +{ + /// + /// 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 MeterProviderBuilder AddInstrumentation(this MeterProviderBuilder meterProviderBuilder) + where T : class + { + meterProviderBuilder.ConfigureServices(services => services.TryAddSingleton()); + + meterProviderBuilder.ConfigureBuilder((sp, builder) => + { + builder.AddInstrumentation(() => sp.GetRequiredService()); + }); + + return meterProviderBuilder; + } + + public static MeterProviderBuilder AddInstrumentation(this MeterProviderBuilder meterProviderBuilder, T instrumentation) + where T : class + { + Guard.ThrowIfNull(instrumentation); + + meterProviderBuilder.ConfigureBuilder((sp, builder) => + { + builder.AddInstrumentation(() => instrumentation); + }); + + return meterProviderBuilder; + } + + public static MeterProviderBuilder AddInstrumentation( + this MeterProviderBuilder meterProviderBuilder, + Func instrumentationFactory) + where T : class + { + Guard.ThrowIfNull(instrumentationFactory); + + meterProviderBuilder.ConfigureBuilder((sp, builder) => + { + builder.AddInstrumentation(() => instrumentationFactory(sp)); + }); + + return meterProviderBuilder; + } + + public static MeterProviderBuilder AddInstrumentation( + this MeterProviderBuilder meterProviderBuilder, + Func instrumentationFactory) + where T : class + { + Guard.ThrowIfNull(instrumentationFactory); + + meterProviderBuilder.ConfigureBuilder((sp, builder) => + { + if (builder is IProviderBuilder providerBuilder + && providerBuilder.Provider != null) + { + builder.AddInstrumentation(() => instrumentationFactory(sp, providerBuilder.Provider)); + } + }); + + return meterProviderBuilder; + } + + /// + /// 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 MeterProviderBuilder ConfigureServices( + this MeterProviderBuilder meterProviderBuilder, + Action configure) + { + if (meterProviderBuilder is IProviderBuilder providerBuilder) + { + providerBuilder.ConfigureServices(configure); + } + + return meterProviderBuilder; + } + + /// + /// Register a callback action to configure the once the application is available. + /// + /// . + /// Configuration callback. + /// The supplied for chaining. + public static MeterProviderBuilder ConfigureBuilder( + this MeterProviderBuilder meterProviderBuilder, + Action configure) + { + if (meterProviderBuilder is IProviderBuilder providerBuilder) + { + providerBuilder.ConfigureBuilder(configure); + } + else if (meterProviderBuilder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder) + { + deferredMeterProviderBuilder.Configure(configure); + } + + return meterProviderBuilder; + } +} diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderServiceCollectionExtensions.cs similarity index 88% rename from src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderServiceCollectionExtensions.cs rename to src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderServiceCollectionExtensions.cs index 8e34bd4b5a3..0572c34be31 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderServiceCollectionExtensions.cs @@ -14,10 +14,7 @@ // limitations under the License. // -#nullable enable - using System; -using OpenTelemetry; using OpenTelemetry.Internal; using OpenTelemetry.Metrics; @@ -62,13 +59,7 @@ public static IServiceCollection ConfigureOpenTelemetryMetrics(this IServiceColl 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 MeterProviderBuilderSdk(services); + var builder = new DeferredMeterProviderBuilder(services); configure(builder); diff --git a/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj b/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj new file mode 100644 index 00000000000..8150c073de0 --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj @@ -0,0 +1,25 @@ + + + + + netstandard2.0;net462 + OpenTelemetry .NET dependency injection extensions + OpenTelemetry + core- + enable + latest-all + + + + + + + + + + + + + + + diff --git a/src/OpenTelemetry.DependencyInjection/README.md b/src/OpenTelemetry.DependencyInjection/README.md new file mode 100644 index 00000000000..5671d1f9bd7 --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/README.md @@ -0,0 +1,3 @@ +# OpenTelemetry .NET DependencyInjection + +TODO diff --git a/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs new file mode 100644 index 00000000000..032235ab414 --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs @@ -0,0 +1,111 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using System; +using Microsoft.Extensions.DependencyInjection.Extensions; +using OpenTelemetry; +using OpenTelemetry.Internal; +using OpenTelemetry.Trace; + +namespace Microsoft.Extensions.DependencyInjection; + +public class DeferredTracerProviderBuilder : TracerProviderBuilder, IProviderBuilder, IDeferredTracerProviderBuilder +{ + public DeferredTracerProviderBuilder(IServiceCollection services) + { + Guard.ThrowIfNull(services); + + this.Services = services; + + services.TryAddSingleton(sp => throw new NotSupportedException("The OpenTelemetry SDK has not been initialized. Call AddOpenTelemetry to register the SDK.")); + + this.ConfigureBuilder((sp, builder) => this.Services = null); + } + + /// + TracerProvider? IProviderBuilder.Provider => null; + + protected IServiceCollection? Services { get; set; } + + /// + public override TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) + { + Guard.ThrowIfNull(instrumentationFactory); + + this.ConfigureBuilder((sp, builder) => + { + builder.AddInstrumentation(instrumentationFactory); + }); + + return this; + } + + /// + public override TracerProviderBuilder AddSource(params string[] names) + { + Guard.ThrowIfNull(names); + + this.ConfigureBuilder((sp, builder) => + { + builder.AddSource(names); + }); + + return this; + } + + /// + public override TracerProviderBuilder AddLegacySource(string operationName) + { + Guard.ThrowIfNullOrWhitespace(operationName); + + this.ConfigureBuilder((sp, builder) => + { + builder.AddLegacySource(operationName); + }); + + return this; + } + + /// + public TracerProviderBuilder ConfigureBuilder(Action configure) + { + this.ConfigureServices(services => services.AddSingleton>( + new ConfigureProviderBuilderCallbackWrapper(configure))); + + return this; + } + + /// + public 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; + } + + /// + TracerProviderBuilder IDeferredTracerProviderBuilder.Configure(Action configure) + => this.ConfigureBuilder(configure); +} diff --git a/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderDependencyInjectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderDependencyInjectionExtensions.cs new file mode 100644 index 00000000000..6cca00dc3ea --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderDependencyInjectionExtensions.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. +// + +using System; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using OpenTelemetry.Internal; + +namespace OpenTelemetry.Trace; + +/// +/// Contains extension methods for the class. +/// +public static class TracerProviderBuilderDependencyInjectionExtensions +{ + /// + /// 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 + { + tracerProviderBuilder.ConfigureServices(services => services.TryAddSingleton()); + + tracerProviderBuilder.ConfigureBuilder((sp, builder) => + { + builder.AddInstrumentation(() => sp.GetRequiredService()); + }); + + return tracerProviderBuilder; + } + + public static TracerProviderBuilder AddInstrumentation(this TracerProviderBuilder tracerProviderBuilder, T instrumentation) + where T : class + { + Guard.ThrowIfNull(instrumentation); + + tracerProviderBuilder.ConfigureBuilder((sp, builder) => + { + builder.AddInstrumentation(() => instrumentation); + }); + + return tracerProviderBuilder; + } + + public static TracerProviderBuilder AddInstrumentation( + this TracerProviderBuilder tracerProviderBuilder, + Func instrumentationFactory) + where T : class + { + Guard.ThrowIfNull(instrumentationFactory); + + tracerProviderBuilder.ConfigureBuilder((sp, builder) => + { + builder.AddInstrumentation(() => instrumentationFactory(sp)); + }); + + return tracerProviderBuilder; + } + + public static TracerProviderBuilder AddInstrumentation( + this TracerProviderBuilder tracerProviderBuilder, + Func instrumentationFactory) + where T : class + { + Guard.ThrowIfNull(instrumentationFactory); + + tracerProviderBuilder.ConfigureBuilder((sp, builder) => + { + if (builder is IProviderBuilder providerBuilder + && providerBuilder.Provider != null) + { + builder.AddInstrumentation(() => instrumentationFactory(sp, providerBuilder.Provider)); + } + }); + + 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 IProviderBuilder providerBuilder) + { + providerBuilder.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 IProviderBuilder providerBuilder) + { + providerBuilder.ConfigureBuilder(configure); + } + else if (tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) + { + deferredTracerProviderBuilder.Configure(configure); + } + + return tracerProviderBuilder; + } +} diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderServiceCollectionExtensions.cs similarity index 88% rename from src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs rename to src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderServiceCollectionExtensions.cs index 8b37f9080fb..38fd2ad9cc6 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderServiceCollectionExtensions.cs @@ -14,10 +14,7 @@ // limitations under the License. // -#nullable enable - using System; -using OpenTelemetry; using OpenTelemetry.Internal; using OpenTelemetry.Trace; @@ -62,13 +59,7 @@ public static IServiceCollection ConfigureOpenTelemetryTracing(this IServiceColl 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); + var builder = new DeferredTracerProviderBuilder(services); configure(builder); diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index 3fcbc7b2e08..bab30c06a0d 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -74,6 +74,8 @@ public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection { Guard.ThrowIfNull(services); + services.AddOpenTelemetry(); + services.ConfigureOpenTelemetryTracing(configure); services.TryAddEnumerable(ServiceDescriptor.Singleton()); @@ -125,6 +127,8 @@ public static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollection { Guard.ThrowIfNull(services); + services.AddOpenTelemetry(); + services.ConfigureOpenTelemetryMetrics(configure); services.TryAddEnumerable(ServiceDescriptor.Singleton()); diff --git a/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionCallbackHelper.cs b/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionCallbackHelper.cs deleted file mode 100644 index 0e5d995a98e..00000000000 --- a/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionCallbackHelper.cs +++ /dev/null @@ -1,83 +0,0 @@ -// -// Copyright The OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#nullable enable - -using System; -using System.Diagnostics; -using Microsoft.Extensions.DependencyInjection; - -namespace OpenTelemetry; - -internal static class ProviderBuilderServiceCollectionCallbackHelper - where TState : ProviderBuilderState -{ - public static IServiceCollection RegisterConfigureBuilderCallback( - IServiceCollection services, - Action configure) - { - Debug.Assert(configure != null, "configure was null"); - - return RegisterConfigureStateCallback( - services, - (sp, state) => configure!(sp, state.Builder)); - } - - public 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 ConfigureProviderBuilderStateCallbackRegistration(configure!)); - } - - public static void InvokeRegisteredConfigureStateCallbacks( - IServiceProvider serviceProvider, - TState 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 ConfigureProviderBuilderStateCallbackRegistration - { - private readonly Action configure; - - public ConfigureProviderBuilderStateCallbackRegistration( - Action configure) - { - this.configure = configure; - } - - public void Configure(IServiceProvider serviceProvider, TState state) - { - Debug.Assert(serviceProvider != null, "serviceProvider was null"); - Debug.Assert(state != null, "state was null"); - - this.configure(serviceProvider!, state!); - } - } -} diff --git a/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs b/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs index fb2a3c06301..56912041039 100644 --- a/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs @@ -19,6 +19,7 @@ using System.Diagnostics; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection.Extensions; +using OpenTelemetry; using OpenTelemetry.Internal; using OpenTelemetry.Metrics; using OpenTelemetry.Trace; @@ -31,7 +32,8 @@ public static IServiceCollection AddOpenTelemetryMeterProviderBuilderServices(th { services.AddOpenTelemetryProviderBuilderServices(); - services.TryAddSingleton(); + services.TryAddSingleton(sp => new MeterProviderSdk(sp, ownsServiceProvider: false)); + services.TryAddSingleton(); services.RegisterOptionsFactory(configuration => new MetricReaderOptions(configuration)); return services; @@ -41,16 +43,21 @@ public static IServiceCollection AddOpenTelemetryTracerProviderBuilderServices(t { services.AddOpenTelemetryProviderBuilderServices(); - services.TryAddSingleton(); + services.TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: false)); + services.TryAddSingleton(); services.RegisterOptionsFactory(configuration => new BatchExportActivityProcessorOptions(configuration)); return services; } - private static IServiceCollection AddOpenTelemetryProviderBuilderServices(this IServiceCollection services) + private static void AddOpenTelemetryProviderBuilderServices(this IServiceCollection services) { Debug.Assert(services != null, "services was null"); + // Accessing Sdk class is just to trigger its static ctor, + // which sets default Propagators and default Activity Id format + _ = Sdk.SuppressInstrumentation; + services.AddOptions(); // Note: When using a host builder IConfiguration is automatically @@ -58,8 +65,7 @@ private static IServiceCollection AddOpenTelemetryProviderBuilderServices(this I // Sdk.Create* style or when manually creating a ServiceCollection. The // point of this registration is to make IConfiguration available in // those cases. - services!.TryAddSingleton(sp => new ConfigurationBuilder().AddEnvironmentVariables().Build()); - - return services!; + services!.TryAddSingleton( + sp => new ConfigurationBuilder().AddEnvironmentVariables().Build()); } } diff --git a/src/OpenTelemetry/Internal/Builder/ProviderBuilderState.cs b/src/OpenTelemetry/Internal/Builder/ProviderBuilderState.cs deleted file mode 100644 index 3862f7a2120..00000000000 --- a/src/OpenTelemetry/Internal/Builder/ProviderBuilderState.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. -// - -#nullable enable - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using OpenTelemetry.Resources; - -namespace OpenTelemetry; - -internal abstract class ProviderBuilderState -{ - private TProvider? provider; - - protected ProviderBuilderState(IServiceProvider serviceProvider) - { - Debug.Assert(serviceProvider != null, "serviceProvider was null"); - - this.ServiceProvider = serviceProvider!; - } - - public IServiceProvider ServiceProvider { get; } - - public abstract TBuilder Builder { get; } - - public TProvider Provider - { - get => this.provider ?? throw new InvalidOperationException("Provider has not been set on state."); - } - - public List Instrumentation { get; } = new(); - - public ResourceBuilder? ResourceBuilder { get; protected set; } - - public void RegisterProvider(string providerTypeName, TProvider provider) - { - Debug.Assert(provider != null, "provider was null"); - - if (this.provider != null) - { - throw new NotSupportedException($"{providerTypeName} cannot be accessed while build is executing."); - } - - this.provider = provider; - } - - 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 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; - } - - 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/Metrics/Builder/MeterProviderBuilderBase.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs index 52cb6f9a780..a8735251e9f 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs @@ -17,298 +17,49 @@ #nullable enable using System; -using System.Diagnostics; -using System.Diagnostics.Metrics; -using System.Text.RegularExpressions; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using OpenTelemetry.Internal; -using OpenTelemetry.Resources; -using CallbackHelper = OpenTelemetry.ProviderBuilderServiceCollectionCallbackHelper< - OpenTelemetry.Metrics.MeterProviderBuilderSdk, - OpenTelemetry.Metrics.MeterProviderSdk, - OpenTelemetry.Metrics.MeterProviderBuilderState>; +namespace OpenTelemetry.Metrics; -namespace OpenTelemetry.Metrics +/// +/// Contains methods for building instances. +/// +public class MeterProviderBuilderBase : DeferredMeterProviderBuilder { - /// - /// Contains methods for building instances. - /// - public abstract class MeterProviderBuilderBase : MeterProviderBuilder, IDeferredMeterProviderBuilder + public MeterProviderBuilderBase() + : base(new ServiceCollection()) { - internal readonly MeterProviderBuilderState? State; - - private readonly bool ownsServices; - private IServiceCollection? services; - - // This ctor is for a builder created from MeterProviderBuilderState which - // happens after the service provider has been created. - internal MeterProviderBuilderBase(MeterProviderBuilderState state) - { - Debug.Assert(state != null, "state was null"); - - this.State = state; - } - - // This ctor is for ConfigureOpenTelemetryMetrics + - // AddOpenTelemetryMetrics scenarios where the builder is bound to an - // external service collection. - internal MeterProviderBuilderBase(IServiceCollection services) - { - Guard.ThrowIfNull(services); - - services.AddOpenTelemetryMeterProviderBuilderServices(); - services.TryAddSingleton(sp => new MeterProviderSdk(sp, ownsServiceProvider: false)); - - this.services = services; - this.ownsServices = false; - } - - // This ctor is for Sdk.CreateMeterProviderBuilder where the builder - // owns its services and service provider. - protected MeterProviderBuilderBase() - { - var services = new ServiceCollection(); - - services.AddOpenTelemetryMeterProviderBuilderServices(); - services.AddSingleton( - sp => throw new NotSupportedException("External MeterProvider created through Sdk.CreateMeterProviderBuilder cannot be accessed using service provider.")); - - this.services = services; - this.ownsServices = true; - } - - /// - public override MeterProviderBuilder AddInstrumentation(Func instrumentationFactory) - { - Guard.ThrowIfNull(instrumentationFactory); - - return this.AddInstrumentation((sp) => instrumentationFactory()); - } - - /// - public override MeterProviderBuilder AddMeter(params string[] names) - { - Guard.ThrowIfNull(names); - - return this.ConfigureState((sp, state) => state.AddMeter(names)); - } - - /// - MeterProviderBuilder IDeferredMeterProviderBuilder.Configure( - Action configure) - { - Guard.ThrowIfNull(configure); - - if (this.State != null) - { - configure(this.State.ServiceProvider, this); - } - else - { - this.ConfigureServices(services - => CallbackHelper.RegisterConfigureBuilderCallback(services, configure)); - } - - return this; - } - - internal MeterProviderBuilder AddInstrumentation() - where T : class - { - this.TryAddSingleton(); - this.AddInstrumentation((sp) => sp.GetRequiredService()); - - return this; - } - - internal MeterProviderBuilder AddReader() - where T : MetricReader - { - this.TryAddSingleton(); - this.ConfigureState((sp, state) => state.AddReader(sp.GetRequiredService())); - - return this; - } - - internal MeterProviderBuilder AddReader(MetricReader reader) - { - Guard.ThrowIfNull(reader); - - return this.ConfigureState((sp, state) => state.AddReader(reader)); - } - - internal MeterProviderBuilder AddView(string instrumentName, string name) - { - if (!MeterProviderBuilderSdk.IsValidInstrumentName(name)) - { - throw new ArgumentException($"Custom view name {name} is invalid.", nameof(name)); - } - - if (instrumentName.IndexOf('*') != -1) - { - throw new ArgumentException( - $"Instrument selection criteria is invalid. Instrument name '{instrumentName}' " + - $"contains a wildcard character. This is not allowed when using a view to " + - $"rename a metric stream as it would lead to conflicting metric stream names.", - nameof(instrumentName)); - } - - return this.AddView( - instrumentName, - new MetricStreamConfiguration - { - Name = name, - }); - } - - internal MeterProviderBuilder AddView(string instrumentName, MetricStreamConfiguration metricStreamConfiguration) - { - Guard.ThrowIfNullOrWhitespace(instrumentName); - Guard.ThrowIfNull(metricStreamConfiguration); - - if (metricStreamConfiguration.Name != null && instrumentName.IndexOf('*') != -1) - { - throw new ArgumentException( - $"Instrument selection criteria is invalid. Instrument name '{instrumentName}' " + - $"contains a wildcard character. This is not allowed when using a view to " + - $"rename a metric stream as it would lead to conflicting metric stream names.", - nameof(instrumentName)); - } - - if (instrumentName.IndexOf('*') != -1) - { - var pattern = '^' + Regex.Escape(instrumentName).Replace("\\*", ".*"); - var regex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); - return this.AddView(instrument => regex.IsMatch(instrument.Name) ? metricStreamConfiguration : null); - } - else - { - return this.AddView(instrument => instrument.Name.Equals(instrumentName, StringComparison.OrdinalIgnoreCase) ? metricStreamConfiguration : null); - } - } - - internal MeterProviderBuilder AddView(Func viewConfig) - { - Guard.ThrowIfNull(viewConfig); - - this.ConfigureState((sp, state) => state.AddView(viewConfig)); - - return this; - } - - internal MeterProviderBuilder ConfigureResource(Action configure) - { - Guard.ThrowIfNull(configure); - - return this.ConfigureState((sp, state) => state.ConfigureResource(configure)); - } - - internal MeterProviderBuilder 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 MeterProvider InvokeBuild() - => this.Build(); - - internal MeterProviderBuilder SetMaxMetricStreams(int maxMetricStreams) - { - Guard.ThrowIfOutOfRange(maxMetricStreams, min: 1); + this.ConfigureServices(services => services + .AddOpenTelemetryMeterProviderBuilderServices() + .AddSingleton( + sp => throw new NotSupportedException("External MeterProvider created through Sdk.CreateMeterProviderBuilder cannot be accessed using service provider."))); + } - return this.ConfigureState((sp, state) => state.MaxMetricStreams = maxMetricStreams); - } + internal MeterProvider InvokeBuild() + => this.Build(); - internal MeterProviderBuilder SetMaxMetricPointsPerMetricStream(int maxMetricPointsPerMetricStream) - { - Guard.ThrowIfOutOfRange(maxMetricPointsPerMetricStream, min: 1); - - return this.ConfigureState((sp, state) => state.MaxMetricPointsPerMetricStream = maxMetricPointsPerMetricStream); - } + /// + /// Run the configured actions to initialize the . + /// + /// . + protected MeterProvider Build() + { + var services = this.Services; - internal MeterProviderBuilder SetResourceBuilder(ResourceBuilder resourceBuilder) + if (services == null) { - Guard.ThrowIfNull(resourceBuilder); - - return this.ConfigureState((sp, state) => state.SetResourceBuilder(resourceBuilder)); + throw new NotSupportedException("MeterProviderBuilder build method cannot be called multiple times."); } - /// - /// Run the configured actions to initialize the . - /// - /// . - protected MeterProvider Build() - { - if (!this.ownsServices || this.State != null) - { - throw new NotSupportedException("Build cannot be called directly on MeterProviderBuilder tied to external services."); - } - - var services = this.services; - - if (services == null) - { - throw new NotSupportedException("MeterProviderBuilder build method cannot be called multiple times."); - } - - this.services = null; + this.Services = null; #if DEBUG - bool validateScopes = true; + bool validateScopes = true; #else - bool validateScopes = false; + bool validateScopes = false; #endif - var serviceProvider = services.BuildServiceProvider(validateScopes); - - return new MeterProviderSdk(serviceProvider, ownsServiceProvider: true); - } + var serviceProvider = services.BuildServiceProvider(validateScopes); - private MeterProviderBuilder 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 MeterProviderBuilder ConfigureState(Action configure) - { - Debug.Assert(configure != null, "configure was null"); - - if (this.State != null) - { - configure!(this.State.ServiceProvider, this.State); - } - else - { - this.ConfigureServices(services => CallbackHelper.RegisterConfigureStateCallback(services, configure!)); - } - - return this; - } - - private void TryAddSingleton() - where T : class - { - var services = this.services; - - services?.TryAddSingleton(); - } + return new MeterProviderSdk(serviceProvider, ownsServiceProvider: true); } } diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderExtensions.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderExtensions.cs index 7342a734a07..68d92693912 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderExtensions.cs @@ -18,7 +18,10 @@ using System; using System.Diagnostics.Metrics; +using System.Text.RegularExpressions; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using OpenTelemetry.Internal; using OpenTelemetry.Resources; namespace OpenTelemetry.Metrics @@ -28,27 +31,6 @@ namespace OpenTelemetry.Metrics /// public static class MeterProviderBuilderExtensions { - /// - /// 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 MeterProviderBuilder AddInstrumentation(this MeterProviderBuilder meterProviderBuilder) - where T : class - { - if (meterProviderBuilder is MeterProviderBuilderBase meterProviderBuilderBase) - { - meterProviderBuilderBase.AddInstrumentation(); - } - - return meterProviderBuilder; - } - /// /// Adds a reader to the provider. /// @@ -57,10 +39,15 @@ public static MeterProviderBuilder AddInstrumentation(this MeterProviderBuild /// The supplied for chaining. public static MeterProviderBuilder AddReader(this MeterProviderBuilder meterProviderBuilder, MetricReader reader) { - if (meterProviderBuilder is MeterProviderBuilderBase meterProviderBuilderBase) + Guard.ThrowIfNull(reader); + + meterProviderBuilder.ConfigureBuilder((sp, builder) => { - meterProviderBuilderBase.AddReader(reader); - } + if (builder is MeterProviderBuilderSdk meterProviderBuilderSdk) + { + meterProviderBuilderSdk.AddReader(reader); + } + }); return meterProviderBuilder; } @@ -78,10 +65,15 @@ public static MeterProviderBuilder AddReader(this MeterProviderBuilder meterProv public static MeterProviderBuilder AddReader(this MeterProviderBuilder meterProviderBuilder) where T : MetricReader { - if (meterProviderBuilder is MeterProviderBuilderBase meterProviderBuilderBase) + meterProviderBuilder.ConfigureServices(services => services.TryAddSingleton()); + + meterProviderBuilder.ConfigureBuilder((sp, builder) => { - meterProviderBuilderBase.AddReader(); - } + if (builder is MeterProviderBuilderSdk meterProviderBuilderSdk) + { + meterProviderBuilderSdk.AddReader(sp.GetRequiredService()); + } + }); return meterProviderBuilder; } @@ -97,11 +89,22 @@ public static MeterProviderBuilder AddReader(this MeterProviderBuilder meterP /// The supplied for chaining. public static MeterProviderBuilder AddView(this MeterProviderBuilder meterProviderBuilder, string instrumentName, string name) { - if (meterProviderBuilder is MeterProviderBuilderBase meterProviderBuilderBase) + if (!MeterProviderBuilderSdk.IsValidInstrumentName(name)) { - meterProviderBuilderBase.AddView(instrumentName, name); + throw new ArgumentException($"Custom view name {name} is invalid.", nameof(name)); } + if (instrumentName.IndexOf('*') != -1) + { + throw new ArgumentException( + $"Instrument selection criteria is invalid. Instrument name '{instrumentName}' " + + $"contains a wildcard character. This is not allowed when using a view to " + + $"rename a metric stream as it would lead to conflicting metric stream names.", + nameof(instrumentName)); + } + + meterProviderBuilder.AddView(instrumentName, new MetricStreamConfiguration { Name = name }); + return meterProviderBuilder; } @@ -116,11 +119,35 @@ public static MeterProviderBuilder AddView(this MeterProviderBuilder meterProvid /// The supplied for chaining. public static MeterProviderBuilder AddView(this MeterProviderBuilder meterProviderBuilder, string instrumentName, MetricStreamConfiguration metricStreamConfiguration) { - if (meterProviderBuilder is MeterProviderBuilderBase meterProviderBuilderBase) + Guard.ThrowIfNullOrWhitespace(instrumentName); + Guard.ThrowIfNull(metricStreamConfiguration); + + if (metricStreamConfiguration.Name != null && instrumentName.IndexOf('*') != -1) { - meterProviderBuilderBase.AddView(instrumentName, metricStreamConfiguration); + throw new ArgumentException( + $"Instrument selection criteria is invalid. Instrument name '{instrumentName}' " + + $"contains a wildcard character. This is not allowed when using a view to " + + $"rename a metric stream as it would lead to conflicting metric stream names.", + nameof(instrumentName)); } + meterProviderBuilder.ConfigureBuilder((sp, builder) => + { + if (builder is MeterProviderBuilderSdk meterProviderBuilderSdk) + { + if (instrumentName.IndexOf('*') != -1) + { + var pattern = '^' + Regex.Escape(instrumentName).Replace("\\*", ".*"); + var regex = new Regex(pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); + meterProviderBuilderSdk.AddView(instrument => regex.IsMatch(instrument.Name) ? metricStreamConfiguration : null); + } + else + { + meterProviderBuilderSdk.AddView(instrument => instrument.Name.Equals(instrumentName, StringComparison.OrdinalIgnoreCase) ? metricStreamConfiguration : null); + } + } + }); + return meterProviderBuilder; } @@ -142,10 +169,15 @@ public static MeterProviderBuilder AddView(this MeterProviderBuilder meterProvid /// The supplied for chaining. public static MeterProviderBuilder AddView(this MeterProviderBuilder meterProviderBuilder, Func viewConfig) { - if (meterProviderBuilder is MeterProviderBuilderBase meterProviderBuilderBase) + Guard.ThrowIfNull(viewConfig); + + meterProviderBuilder.ConfigureBuilder((sp, builder) => { - meterProviderBuilderBase.AddView(viewConfig); - } + if (builder is MeterProviderBuilderSdk meterProviderBuilderSdk) + { + meterProviderBuilderSdk.AddView(viewConfig); + } + }); return meterProviderBuilder; } @@ -166,10 +198,15 @@ public static MeterProviderBuilder AddView(this MeterProviderBuilder meterProvid /// The supplied for chaining. public static MeterProviderBuilder SetMaxMetricStreams(this MeterProviderBuilder meterProviderBuilder, int maxMetricStreams) { - if (meterProviderBuilder is MeterProviderBuilderBase meterProviderBuilderBase) + Guard.ThrowIfOutOfRange(maxMetricStreams, min: 1); + + meterProviderBuilder.ConfigureBuilder((sp, builder) => { - meterProviderBuilderBase.SetMaxMetricStreams(maxMetricStreams); - } + if (builder is MeterProviderBuilderSdk meterProviderBuilderSdk) + { + meterProviderBuilderSdk.SetMaxMetricStreams(maxMetricStreams); + } + }); return meterProviderBuilder; } @@ -189,10 +226,15 @@ public static MeterProviderBuilder SetMaxMetricStreams(this MeterProviderBuilder /// The supplied for chaining. public static MeterProviderBuilder SetMaxMetricPointsPerMetricStream(this MeterProviderBuilder meterProviderBuilder, int maxMetricPointsPerMetricStream) { - if (meterProviderBuilder is MeterProviderBuilderBase meterProviderBuilderBase) + Guard.ThrowIfOutOfRange(maxMetricPointsPerMetricStream, min: 1); + + meterProviderBuilder.ConfigureBuilder((sp, builder) => { - meterProviderBuilderBase.SetMaxMetricPointsPerMetricStream(maxMetricPointsPerMetricStream); - } + if (builder is MeterProviderBuilderSdk meterProviderBuilderSdk) + { + meterProviderBuilderSdk.SetMaxMetricPointsPerMetricStream(maxMetricPointsPerMetricStream); + } + }); return meterProviderBuilder; } @@ -208,10 +250,13 @@ public static MeterProviderBuilder SetMaxMetricPointsPerMetricStream(this MeterP /// The supplied for chaining. public static MeterProviderBuilder SetResourceBuilder(this MeterProviderBuilder meterProviderBuilder, ResourceBuilder resourceBuilder) { - if (meterProviderBuilder is MeterProviderBuilderBase meterProviderBuilderBase) + meterProviderBuilder.ConfigureBuilder((sp, builder) => { - meterProviderBuilderBase.SetResourceBuilder(resourceBuilder); - } + if (builder is MeterProviderBuilderSdk meterProviderBuilderSdk) + { + meterProviderBuilderSdk.SetResourceBuilder(resourceBuilder); + } + }); return meterProviderBuilder; } @@ -225,53 +270,13 @@ public static MeterProviderBuilder SetResourceBuilder(this MeterProviderBuilder /// The supplied for chaining. public static MeterProviderBuilder ConfigureResource(this MeterProviderBuilder meterProviderBuilder, Action configure) { - if (meterProviderBuilder is MeterProviderBuilderBase meterProviderBuilderBase) - { - meterProviderBuilderBase.ConfigureResource(configure); - } - - return meterProviderBuilder; - } - - /// - /// Register a callback action to configure the where metric services are configured. - /// - /// - /// Note: Metric services are only available during the application - /// configuration phase. - /// - /// . - /// Configuration callback. - /// The supplied for chaining. - public static MeterProviderBuilder ConfigureServices( - this MeterProviderBuilder meterProviderBuilder, - Action configure) - { - if (meterProviderBuilder is MeterProviderBuilderBase meterProviderBuilderBase) + meterProviderBuilder.ConfigureBuilder((sp, builder) => { - meterProviderBuilderBase.ConfigureServices(configure); - } - - return meterProviderBuilder; - } - - /// - /// Register a callback action to configure the once the application is available. - /// - /// . - /// Configuration callback. - /// The supplied for chaining. - public static MeterProviderBuilder ConfigureBuilder( - this MeterProviderBuilder meterProviderBuilder, - Action configure) - { - if (meterProviderBuilder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder) - { - deferredMeterProviderBuilder.Configure(configure); - } + if (builder is MeterProviderBuilderSdk meterProviderBuilderSdk) + { + meterProviderBuilderSdk.ConfigureResource(configure); + } + }); return meterProviderBuilder; } diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs index b8db1029f74..ceaca364eb2 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs @@ -16,29 +16,51 @@ #nullable enable +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.Metrics; using System.Text.RegularExpressions; using Microsoft.Extensions.DependencyInjection; +using OpenTelemetry.Internal; +using OpenTelemetry.Resources; namespace OpenTelemetry.Metrics { - internal sealed class MeterProviderBuilderSdk : MeterProviderBuilderBase + /// + /// Stores state used to build a . + /// + internal sealed class MeterProviderBuilderSdk : MeterProviderBuilder, IProviderBuilder, IDeferredMeterProviderBuilder { + public const int MaxMetricsDefault = 1000; + public const int MaxMetricPointsPerMetricDefault = 2000; + private static readonly Regex InstrumentNameRegex = new( @"^[a-z][a-z0-9-._]{0,62}$", RegexOptions.IgnoreCase | RegexOptions.Compiled); - public MeterProviderBuilderSdk() - { - } + private readonly IServiceProvider serviceProvider; + private MeterProviderSdk? meterProvider; - public MeterProviderBuilderSdk(IServiceCollection services) - : base(services) + public MeterProviderBuilderSdk(IServiceProvider serviceProvider) { + this.serviceProvider = serviceProvider; } - public MeterProviderBuilderSdk(MeterProviderBuilderState state) - : base(state) - { - } + public List Instrumentation { get; } = new(); + + public ResourceBuilder? ResourceBuilder { get; private set; } + + public MeterProvider? Provider => this.meterProvider; + + public List Readers { get; } = new(); + + public List MeterSources { get; } = new(); + + public List> ViewConfigs { get; } = new(); + + public int MaxMetricStreams { get; private set; } = MaxMetricsDefault; + + public int MaxMetricPointsPerMetricStream { get; private set; } = MaxMetricPointsPerMetricDefault; /// /// Returns whether the given instrument name is valid according to the specification. @@ -72,5 +94,143 @@ public static bool IsValidViewName(string customViewName) return InstrumentNameRegex.IsMatch(customViewName); } + + public void RegisterProvider(MeterProviderSdk meterProvider) + { + Debug.Assert(meterProvider != null, "meterProvider was null"); + + if (this.meterProvider != null) + { + throw new NotSupportedException("MeterProvider cannot be accessed while build is executing."); + } + + this.meterProvider = meterProvider; + } + + public override MeterProviderBuilder AddInstrumentation( + Func instrumentationFactory) + { + Debug.Assert(instrumentationFactory != null, "instrumentationFactory was null"); + + return this.AddInstrumentation( + typeof(TInstrumentation).Name, + "semver:" + typeof(TInstrumentation).Assembly.GetName().Version, + instrumentationFactory()); + } + + public MeterProviderBuilder 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!)); + + return this; + } + + public MeterProviderBuilder ConfigureResource(Action configure) + { + Debug.Assert(configure != null, "configure was null"); + + var resourceBuilder = this.ResourceBuilder ??= ResourceBuilder.CreateDefault(); + + configure!(resourceBuilder); + + return this; + } + + public MeterProviderBuilder SetResourceBuilder(ResourceBuilder resourceBuilder) + { + Debug.Assert(resourceBuilder != null, "resourceBuilder was null"); + + this.ResourceBuilder = resourceBuilder; + + return this; + } + + public override MeterProviderBuilder AddMeter(params string[] names) + { + Debug.Assert(names != null, "names was null"); + + foreach (var name in names!) + { + Guard.ThrowIfNullOrWhitespace(name); + + this.MeterSources.Add(name); + } + + return this; + } + + public MeterProviderBuilder AddReader(MetricReader reader) + { + Debug.Assert(reader != null, "reader was null"); + + this.Readers.Add(reader!); + + return this; + } + + public MeterProviderBuilder AddView(Func viewConfig) + { + Debug.Assert(viewConfig != null, "viewConfig was null"); + + this.ViewConfigs.Add(viewConfig!); + + return this; + } + + public MeterProviderBuilder SetMaxMetricStreams(int maxMetricStreams) + { + this.MaxMetricStreams = maxMetricStreams; + + return this; + } + + public MeterProviderBuilder SetMaxMetricPointsPerMetricStream(int maxMetricPointsPerMetricStream) + { + this.MaxMetricPointsPerMetricStream = maxMetricPointsPerMetricStream; + + return this; + } + + public MeterProviderBuilder ConfigureBuilder(Action configure) + { + Debug.Assert(configure != null, "configure was null"); + + configure(this.serviceProvider, this); + + return this; + } + + public MeterProviderBuilder ConfigureServices(Action configure) + { + throw new NotSupportedException("Services cannot be configured after ServiceProvider has been created."); + } + + MeterProviderBuilder IDeferredMeterProviderBuilder.Configure(Action configure) + => this.ConfigureBuilder(configure); + + 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/Metrics/Builder/MeterProviderBuilderState.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderState.cs deleted file mode 100644 index ebd9b81e53b..00000000000 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderState.cs +++ /dev/null @@ -1,81 +0,0 @@ -// -// Copyright The OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#nullable enable - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Diagnostics.Metrics; -using OpenTelemetry.Internal; - -namespace OpenTelemetry.Metrics -{ - /// - /// Stores state used to build a . - /// - internal sealed class MeterProviderBuilderState : ProviderBuilderState - { - public const int MaxMetricsDefault = 1000; - public const int MaxMetricPointsPerMetricDefault = 2000; - - private MeterProviderBuilderSdk? builder; - - public MeterProviderBuilderState(IServiceProvider serviceProvider) - : base(serviceProvider) - { - } - - public override MeterProviderBuilderSdk Builder - => this.builder ??= new MeterProviderBuilderSdk(this); - - public List Readers { get; } = new(); - - public List MeterSources { get; } = new(); - - public List> ViewConfigs { get; } = new(); - - public int MaxMetricStreams { get; set; } = MaxMetricsDefault; - - public int MaxMetricPointsPerMetricStream { get; set; } = MaxMetricPointsPerMetricDefault; - - public void AddMeter(params string[] names) - { - Debug.Assert(names != null, "names was null"); - - foreach (var name in names!) - { - Guard.ThrowIfNullOrWhitespace(name); - - this.MeterSources.Add(name); - } - } - - public void AddReader(MetricReader reader) - { - Debug.Assert(reader != null, "reader was null"); - - this.Readers.Add(reader!); - } - - public void AddView(Func viewConfig) - { - Debug.Assert(viewConfig != null, "viewConfig was null"); - - this.ViewConfigs.Add(viewConfig!); - } - } -} diff --git a/src/OpenTelemetry/Metrics/MeterProviderSdk.cs b/src/OpenTelemetry/Metrics/MeterProviderSdk.cs index 8a8ab77f9c8..d8cced1d8a3 100644 --- a/src/OpenTelemetry/Metrics/MeterProviderSdk.cs +++ b/src/OpenTelemetry/Metrics/MeterProviderSdk.cs @@ -26,11 +26,6 @@ using OpenTelemetry.Internal; using OpenTelemetry.Resources; -using CallbackHelper = OpenTelemetry.ProviderBuilderServiceCollectionCallbackHelper< - OpenTelemetry.Metrics.MeterProviderBuilderSdk, - OpenTelemetry.Metrics.MeterProviderSdk, - OpenTelemetry.Metrics.MeterProviderBuilderState>; - namespace OpenTelemetry.Metrics { internal sealed class MeterProviderSdk : MeterProvider @@ -53,8 +48,8 @@ internal MeterProviderSdk( { Debug.Assert(serviceProvider != null, "serviceProvider was null"); - var state = serviceProvider!.GetRequiredService(); - state.RegisterProvider(nameof(MeterProvider), this); + var state = serviceProvider!.GetRequiredService(); + state.RegisterProvider(this); this.ServiceProvider = serviceProvider!; @@ -66,9 +61,11 @@ internal MeterProviderSdk( OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent("Building MeterProvider."); - CallbackHelper.InvokeRegisteredConfigureStateCallbacks( - serviceProvider!, - state); + var configureProviderBuilders = serviceProvider.GetServices>(); + foreach (var configureProviderBuilder in configureProviderBuilders) + { + configureProviderBuilder.ConfigureBuilder(serviceProvider, state); + } StringBuilder exportersAdded = new StringBuilder(); StringBuilder instrumentationFactoriesAdded = new StringBuilder(); diff --git a/src/OpenTelemetry/OpenTelemetry.csproj b/src/OpenTelemetry/OpenTelemetry.csproj index c05c686b45b..e58aa2a9596 100644 --- a/src/OpenTelemetry/OpenTelemetry.csproj +++ b/src/OpenTelemetry/OpenTelemetry.csproj @@ -24,7 +24,7 @@ - + diff --git a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs new file mode 100644 index 00000000000..e62feaf1ded --- /dev/null +++ b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs @@ -0,0 +1,17 @@ + +using OpenTelemetry.Internal; + +namespace Microsoft.Extensions.DependencyInjection; + +public static class OpenTelemetryServiceCollectionExtensions +{ + public static IServiceCollection AddOpenTelemetry(this IServiceCollection services) + { + Guard.ThrowIfNull(services); + + services.AddOpenTelemetryTracerProviderBuilderServices(); + services.AddOpenTelemetryMeterProviderBuilderServices(); + + return services; + } +} diff --git a/src/OpenTelemetry/Sdk.cs b/src/OpenTelemetry/Sdk.cs index 62fb0da26d1..f903510b40c 100644 --- a/src/OpenTelemetry/Sdk.cs +++ b/src/OpenTelemetry/Sdk.cs @@ -68,7 +68,7 @@ public static void SetDefaultTextMapPropagator(TextMapPropagator textMapPropagat /// instance, which is used to build a . public static MeterProviderBuilder CreateMeterProviderBuilder() { - return new MeterProviderBuilderSdk(); + return new MeterProviderBuilderBase(); } /// @@ -81,7 +81,7 @@ public static MeterProviderBuilder CreateMeterProviderBuilder() /// instance, which is used to build a . public static TracerProviderBuilder CreateTracerProviderBuilder() { - return new TracerProviderBuilderSdk(); + return new TracerProviderBuilderBase(); } } } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index b5cf048d16b..c2f26a7ea9b 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -17,278 +17,78 @@ #nullable enable using System; -using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; using OpenTelemetry.Internal; -using OpenTelemetry.Resources; -using CallbackHelper = OpenTelemetry.ProviderBuilderServiceCollectionCallbackHelper< - OpenTelemetry.Trace.TracerProviderBuilderSdk, - OpenTelemetry.Trace.TracerProviderSdk, - OpenTelemetry.Trace.TracerProviderBuilderState>; +namespace OpenTelemetry.Trace; -namespace OpenTelemetry.Trace +/// +/// Contains methods for building instances. +/// +public class TracerProviderBuilderBase : DeferredTracerProviderBuilder { - /// - /// Contains methods for building instances. - /// - public abstract class TracerProviderBuilderBase : TracerProviderBuilder, IDeferredTracerProviderBuilder + public TracerProviderBuilderBase() + : base(new ServiceCollection()) { - 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 ConfigureOpenTelemetryTracing + - // AddOpenTelemetryTracing scenarios where the builder is bound to an - // external service collection. - internal TracerProviderBuilderBase(IServiceCollection services) - { - Guard.ThrowIfNull(services); - - services.AddOpenTelemetryTracerProviderBuilderServices(); - 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.AddOpenTelemetryTracerProviderBuilderServices(); - services.AddSingleton( - sp => throw new NotSupportedException("External TracerProvider created through Sdk.CreateTracerProviderBuilder cannot be accessed using service provider.")); - - 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 - => CallbackHelper.RegisterConfigureBuilderCallback(services, 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)); - } + this.ConfigureServices(services => services + .AddOpenTelemetryTracerProviderBuilderServices() + .AddSingleton( + sp => throw new NotSupportedException("External TracerProvider created through Sdk.CreateTracerProviderBuilder cannot be accessed using service provider."))); + } - internal TracerProviderBuilder ConfigureResource(Action configure) - { - Guard.ThrowIfNull(configure); + internal TracerProvider InvokeBuild() + => this.Build(); - return this.ConfigureState((sp, state) => state.ConfigureResource(configure)); - } + /// + /// 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); - internal TracerProviderBuilder ConfigureServices(Action configure) + return this.ConfigureBuilder((sp, builder) => { - Guard.ThrowIfNull(configure); - - var services = this.services; - - if (services == null) + if (builder is TracerProviderBuilderSdk tracerProviderBuilderState) { - 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( + tracerProviderBuilderState.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."); + instrumentationFactory); } + }); + } - var services = this.services; + /// + /// Run the configured actions to initialize the . + /// + /// . + protected TracerProvider Build() + { + var services = this.Services; - if (services == null) - { - throw new NotSupportedException("TracerProviderBuilder build method cannot be called multiple times."); - } + if (services == null) + { + throw new NotSupportedException("TracerProviderBuilder build method cannot be called multiple times."); + } - this.services = null; + this.Services = null; #if DEBUG - bool validateScopes = true; + bool validateScopes = true; #else - bool validateScopes = false; + bool validateScopes = false; #endif - var serviceProvider = services.BuildServiceProvider(validateScopes); - - return new TracerProviderSdk(serviceProvider, ownsServiceProvider: true); - } + var serviceProvider = services.BuildServiceProvider(validateScopes); - 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 => - CallbackHelper.RegisterConfigureStateCallback(services, configure!)); - } - - return this; - } - - private void TryAddSingleton() - where T : class - { - var services = this.services; - - services?.TryAddSingleton(); - } + return new TracerProviderSdk(serviceProvider, ownsServiceProvider: true); } } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs index 29e0e2512d3..19c79cedbbf 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderExtensions.cs @@ -19,6 +19,8 @@ using System; using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using OpenTelemetry.Internal; using OpenTelemetry.Resources; namespace OpenTelemetry.Trace @@ -37,10 +39,13 @@ public static class TracerProviderBuilderExtensions /// Returns for chaining. public static TracerProviderBuilder SetErrorStatusOnException(this TracerProviderBuilder tracerProviderBuilder, bool enabled = true) { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + tracerProviderBuilder.ConfigureBuilder((sp, builder) => { - tracerProviderBuilderBase.SetErrorStatusOnException(enabled); - } + if (builder is TracerProviderBuilderSdk tracerProviderBuilderSdk) + { + tracerProviderBuilderSdk.SetErrorStatusOnException(enabled); + } + }); return tracerProviderBuilder; } @@ -53,10 +58,15 @@ public static TracerProviderBuilder SetErrorStatusOnException(this TracerProvide /// Returns for chaining. public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracerProviderBuilder, Sampler sampler) { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + Guard.ThrowIfNull(sampler); + + tracerProviderBuilder.ConfigureBuilder((sp, builder) => { - tracerProviderBuilderBase.SetSampler(sampler); - } + if (builder is TracerProviderBuilderSdk tracerProviderBuilderSdk) + { + tracerProviderBuilderSdk.SetSampler(sampler); + } + }); return tracerProviderBuilder; } @@ -74,10 +84,15 @@ public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracer public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracerProviderBuilder) where T : Sampler { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + tracerProviderBuilder.ConfigureServices(services => services.TryAddSingleton()); + + tracerProviderBuilder.ConfigureBuilder((sp, builder) => { - tracerProviderBuilderBase.SetSampler(); - } + if (builder is TracerProviderBuilderSdk tracerProviderBuilderSdk) + { + tracerProviderBuilderSdk.SetSampler(sp.GetRequiredService()); + } + }); return tracerProviderBuilder; } @@ -93,10 +108,15 @@ public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tra /// Returns for chaining. public static TracerProviderBuilder SetResourceBuilder(this TracerProviderBuilder tracerProviderBuilder, ResourceBuilder resourceBuilder) { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + Guard.ThrowIfNull(resourceBuilder); + + tracerProviderBuilder.ConfigureBuilder((sp, builder) => { - tracerProviderBuilderBase.SetResourceBuilder(resourceBuilder); - } + if (builder is TracerProviderBuilderSdk tracerProviderBuilderSdk) + { + tracerProviderBuilderSdk.SetResourceBuilder(resourceBuilder); + } + }); return tracerProviderBuilder; } @@ -110,10 +130,15 @@ public static TracerProviderBuilder SetResourceBuilder(this TracerProviderBuilde /// Returns for chaining. public static TracerProviderBuilder ConfigureResource(this TracerProviderBuilder tracerProviderBuilder, Action configure) { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + Guard.ThrowIfNull(configure); + + tracerProviderBuilder.ConfigureBuilder((sp, builder) => { - tracerProviderBuilderBase.ConfigureResource(configure); - } + if (builder is TracerProviderBuilderSdk tracerProviderBuilderSdk) + { + tracerProviderBuilderSdk.ConfigureResource(configure); + } + }); return tracerProviderBuilder; } @@ -126,10 +151,15 @@ public static TracerProviderBuilder ConfigureResource(this TracerProviderBuilder /// Returns for chaining. public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder, BaseProcessor processor) { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) + Guard.ThrowIfNull(processor); + + tracerProviderBuilder.ConfigureBuilder((sp, builder) => { - tracerProviderBuilderBase.AddProcessor(processor); - } + if (builder is TracerProviderBuilderSdk tracerProviderBuilderSdk) + { + tracerProviderBuilderSdk.AddProcessor(processor); + } + }); return tracerProviderBuilder; } @@ -147,74 +177,15 @@ public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder trac public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder) where T : BaseProcessor { - if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase) - { - tracerProviderBuilderBase.AddProcessor(); - } - - return tracerProviderBuilder; - } + tracerProviderBuilder.ConfigureServices(services => services.TryAddSingleton()); - /// - /// 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) + tracerProviderBuilder.ConfigureBuilder((sp, builder) => { - 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); - } + if (builder is TracerProviderBuilderSdk tracerProviderBuilderSdk) + { + tracerProviderBuilderSdk.AddProcessor(sp.GetRequiredService()); + } + }); return tracerProviderBuilder; } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs index a13d105e8db..3fe16cba232 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs @@ -16,24 +16,199 @@ #nullable enable +using System; +using System.Collections.Generic; +using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; +using OpenTelemetry.Internal; +using OpenTelemetry.Resources; namespace OpenTelemetry.Trace { - internal sealed class TracerProviderBuilderSdk : TracerProviderBuilderBase + /// + /// Stores state used to build a . + /// + internal sealed class TracerProviderBuilderSdk : TracerProviderBuilder, IProviderBuilder, IDeferredTracerProviderBuilder { - public TracerProviderBuilderSdk() + private readonly IServiceProvider serviceProvider; + private TracerProviderSdk? tracerProvider; + + public TracerProviderBuilderSdk(IServiceProvider serviceProvider) + { + this.serviceProvider = serviceProvider; + } + + public List Instrumentation { get; } = new(); + + public ResourceBuilder? ResourceBuilder { get; private set; } + + public TracerProvider? Provider => this.tracerProvider; + + public List> Processors { get; } = new(); + + public List Sources { get; } = new(); + + public HashSet LegacyActivityOperationNames { get; } = new(StringComparer.OrdinalIgnoreCase); + + public Sampler? Sampler { get; private set; } + + public bool ExceptionProcessorEnabled { get; private set; } + + public void RegisterProvider(TracerProviderSdk tracerProvider) { + Debug.Assert(tracerProvider != null, "tracerProvider was null"); + + if (this.tracerProvider != null) + { + throw new NotSupportedException("TracerProvider cannot be accessed while build is executing."); + } + + this.tracerProvider = tracerProvider; } - public TracerProviderBuilderSdk(IServiceCollection services) - : base(services) + public override TracerProviderBuilder AddInstrumentation( + Func instrumentationFactory) { + Debug.Assert(instrumentationFactory != null, "instrumentationFactory was null"); + + return this.AddInstrumentation( + typeof(TInstrumentation).Name, + "semver:" + typeof(TInstrumentation).Assembly.GetName().Version, + instrumentationFactory()); } - public TracerProviderBuilderSdk(TracerProviderBuilderState state) - : base(state) + public TracerProviderBuilder 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!)); + + return this; + } + + public TracerProviderBuilder ConfigureResource(Action configure) + { + Debug.Assert(configure != null, "configure was null"); + + var resourceBuilder = this.ResourceBuilder ??= ResourceBuilder.CreateDefault(); + + configure!(resourceBuilder); + + return this; + } + + public TracerProviderBuilder SetResourceBuilder(ResourceBuilder resourceBuilder) + { + Debug.Assert(resourceBuilder != null, "resourceBuilder was null"); + + this.ResourceBuilder = resourceBuilder; + + return this; + } + + public override TracerProviderBuilder AddLegacySource(string operationName) + { + Debug.Assert(!string.IsNullOrWhiteSpace(operationName), "operationName was null or whitespace"); + + this.LegacyActivityOperationNames.Add(operationName); + + return this; + } + + public override TracerProviderBuilder 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); + } + + return this; + } + + public TracerProviderBuilder AddProcessor(BaseProcessor processor) + { + Debug.Assert(processor != null, "processor was null"); + + this.Processors.Add(processor!); + + return this; + } + + public TracerProviderBuilder SetSampler(Sampler sampler) + { + Debug.Assert(sampler != null, "sampler was null"); + + this.Sampler = sampler; + + return this; + } + + public TracerProviderBuilder SetErrorStatusOnException(bool enabled) + { + this.ExceptionProcessorEnabled = enabled; + + return this; + } + + public TracerProviderBuilder ConfigureBuilder(Action configure) + { + Debug.Assert(configure != null, "configure was null"); + + configure(this.serviceProvider, this); + + return this; + } + + public TracerProviderBuilder ConfigureServices(Action configure) + { + throw new NotSupportedException("Services cannot be configured after ServiceProvider has been created."); + } + + public void AddExceptionProcessorIfEnabled() + { + if (this.ExceptionProcessorEnabled) + { + try + { + this.Processors.Insert(0, new ExceptionProcessor()); + } + catch (Exception ex) + { + throw new NotSupportedException($"'{nameof(TracerProviderBuilderExtensions.SetErrorStatusOnException)}' is not supported on this platform", ex); + } + } + } + + TracerProviderBuilder IDeferredTracerProviderBuilder.Configure(Action configure) + => this.ConfigureBuilder(configure); + + 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/Builder/TracerProviderBuilderState.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs deleted file mode 100644 index f446834249b..00000000000 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderState.cs +++ /dev/null @@ -1,98 +0,0 @@ -// -// Copyright The OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#nullable enable - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using OpenTelemetry.Internal; - -namespace OpenTelemetry.Trace -{ - /// - /// Stores state used to build a . - /// - internal sealed class TracerProviderBuilderState : ProviderBuilderState - { - private TracerProviderBuilderSdk? builder; - - public TracerProviderBuilderState(IServiceProvider serviceProvider) - : base(serviceProvider) - { - } - - public override TracerProviderBuilderSdk Builder - => this.builder ??= new TracerProviderBuilderSdk(this); - - public List> Processors { get; } = new(); - - public List Sources { get; } = new(); - - public HashSet LegacyActivityOperationNames { get; } = new(StringComparer.OrdinalIgnoreCase); - - public Sampler? Sampler { get; private set; } - - public bool SetErrorStatusOnException { get; set; } - - 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 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); - } - } - } -} diff --git a/src/OpenTelemetry/Trace/TracerProviderSdk.cs b/src/OpenTelemetry/Trace/TracerProviderSdk.cs index 476ece22229..768063852e2 100644 --- a/src/OpenTelemetry/Trace/TracerProviderSdk.cs +++ b/src/OpenTelemetry/Trace/TracerProviderSdk.cs @@ -26,11 +26,6 @@ using OpenTelemetry.Internal; using OpenTelemetry.Resources; -using CallbackHelper = OpenTelemetry.ProviderBuilderServiceCollectionCallbackHelper< - OpenTelemetry.Trace.TracerProviderBuilderSdk, - OpenTelemetry.Trace.TracerProviderSdk, - OpenTelemetry.Trace.TracerProviderBuilderState>; - namespace OpenTelemetry.Trace { internal sealed class TracerProviderSdk : TracerProvider @@ -53,8 +48,8 @@ internal TracerProviderSdk( { Debug.Assert(serviceProvider != null, "serviceProvider was null"); - var state = serviceProvider!.GetRequiredService(); - state.RegisterProvider(nameof(TracerProvider), this); + var state = serviceProvider.GetRequiredService(); + state.RegisterProvider(this); this.ServiceProvider = serviceProvider!; @@ -66,17 +61,16 @@ internal TracerProviderSdk( OpenTelemetrySdkEventSource.Log.TracerProviderSdkEvent("Building TracerProvider."); - CallbackHelper.InvokeRegisteredConfigureStateCallbacks( - serviceProvider!, - state); + var configureProviderBuilders = serviceProvider.GetServices>(); + foreach (var configureProviderBuilder in configureProviderBuilders) + { + configureProviderBuilder.ConfigureBuilder(serviceProvider, state); + } StringBuilder processorsAdded = new StringBuilder(); StringBuilder instrumentationFactoriesAdded = new StringBuilder(); - if (state.SetErrorStatusOnException) - { - state.EnableErrorStatusOnException(); - } + state.AddExceptionProcessorIfEnabled(); var resourceBuilder = state.ResourceBuilder ?? ResourceBuilder.CreateDefault(); resourceBuilder.ServiceProvider = serviceProvider; diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs index 4553ae33926..80678f07e3c 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs @@ -168,8 +168,8 @@ public void AddOpenTelemetryMeterProvider_ConfigureCallbacksUsingExtensions() .ConfigureBuilder((sp1, builder1) => { builder1 - .AddInstrumentation() - .AddReader(); + .AddInstrumentation(sp1.GetRequiredService()) + .AddReader(sp1.GetRequiredService()); })); using var serviceProvider = services.BuildServiceProvider(); diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs index 22432e3f4a7..f8d5be9d6f0 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs @@ -170,9 +170,9 @@ public void AddOpenTelemetryTracerProvider_ConfigureCallbacksUsingExtensions() .ConfigureBuilder((sp1, builder1) => { builder1 - .AddInstrumentation() - .AddProcessor() - .SetSampler(); + .AddInstrumentation(sp1.GetRequiredService()) + .AddProcessor(sp1.GetRequiredService()) + .SetSampler(sp1.GetRequiredService()); })); using var serviceProvider = services.BuildServiceProvider(); diff --git a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs index 5fac30cdd53..ccb8c6f129d 100644 --- a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs @@ -66,6 +66,8 @@ public void ServiceLifecycleAvailableToServicesBuilderTest() { var services = new ServiceCollection(); + services.AddOpenTelemetry(); + bool testRun = false; ServiceProvider serviceProvider = null; @@ -80,7 +82,7 @@ public void ServiceLifecycleAvailableToServicesBuilderTest() () => { // Note: Build can't be called directly on builder tied to external services - Assert.Throws(() => builder.Build()); + Assert.Null(builder.Build()); serviceProvider = services.BuildServiceProvider(); @@ -111,6 +113,8 @@ public void SingleProviderForServiceCollectionTest() { var services = new ServiceCollection(); + services.AddOpenTelemetry(); + services.ConfigureOpenTelemetryMetrics(builder => { builder.AddInstrumentation(() => new()); @@ -295,6 +299,8 @@ public void MeterProviderNestedResolutionUsingConfigureTest() var serviceCollection = new ServiceCollection(); + serviceCollection.AddOpenTelemetry(); + serviceCollection.ConfigureOpenTelemetryMetrics(builder => { builder.ConfigureBuilder((sp, builder) => @@ -317,7 +323,6 @@ private static void RunBuilderServiceLifecycleTest( Action postAction) { var baseBuilder = builder as MeterProviderBuilderBase; - Assert.Null(baseBuilder.State); builder.AddMeter("TestSource"); @@ -342,13 +347,13 @@ private static void RunBuilderServiceLifecycleTest( { configureBuilderInvocations++; - var baseBuilder = builder as MeterProviderBuilderBase; - Assert.NotNull(baseBuilder?.State); + var sdkBuilder = builder as MeterProviderBuilderSdk; + Assert.NotNull(sdkBuilder); builder.AddMeter("TestSource2"); - Assert.Contains(baseBuilder.State.MeterSources, s => s == "TestSource"); - Assert.Contains(baseBuilder.State.MeterSources, s => s == "TestSource2"); + Assert.Contains(sdkBuilder.MeterSources, s => s == "TestSource"); + Assert.Contains(sdkBuilder.MeterSources, s => s == "TestSource2"); // Note: Services can't be configured at this stage Assert.Throws( diff --git a/test/OpenTelemetry.Tests/Metrics/MetricAPITest.cs b/test/OpenTelemetry.Tests/Metrics/MetricAPITest.cs index 342fffe7107..3d20f3833ca 100644 --- a/test/OpenTelemetry.Tests/Metrics/MetricAPITest.cs +++ b/test/OpenTelemetry.Tests/Metrics/MetricAPITest.cs @@ -1356,26 +1356,26 @@ int MetricPointCount() // for no tag point! // This may be changed later. counterLong.Add(10); - for (int i = 0; i < MeterProviderBuilderState.MaxMetricPointsPerMetricDefault + 1; i++) + for (int i = 0; i < MeterProviderBuilderSdk.MaxMetricPointsPerMetricDefault + 1; i++) { counterLong.Add(10, new KeyValuePair("key", "value" + i)); } meterProvider.ForceFlush(MaxTimeToAllowForFlush); - Assert.Equal(MeterProviderBuilderState.MaxMetricPointsPerMetricDefault, MetricPointCount()); + Assert.Equal(MeterProviderBuilderSdk.MaxMetricPointsPerMetricDefault, MetricPointCount()); exportedItems.Clear(); counterLong.Add(10); - for (int i = 0; i < MeterProviderBuilderState.MaxMetricPointsPerMetricDefault + 1; i++) + for (int i = 0; i < MeterProviderBuilderSdk.MaxMetricPointsPerMetricDefault + 1; i++) { counterLong.Add(10, new KeyValuePair("key", "value" + i)); } meterProvider.ForceFlush(MaxTimeToAllowForFlush); - Assert.Equal(MeterProviderBuilderState.MaxMetricPointsPerMetricDefault, MetricPointCount()); + Assert.Equal(MeterProviderBuilderSdk.MaxMetricPointsPerMetricDefault, MetricPointCount()); counterLong.Add(10); - for (int i = 0; i < MeterProviderBuilderState.MaxMetricPointsPerMetricDefault + 1; i++) + for (int i = 0; i < MeterProviderBuilderSdk.MaxMetricPointsPerMetricDefault + 1; i++) { counterLong.Add(10, new KeyValuePair("key", "value" + i)); } @@ -1386,7 +1386,7 @@ int MetricPointCount() counterLong.Add(10, new KeyValuePair("key", "valueC")); exportedItems.Clear(); meterProvider.ForceFlush(MaxTimeToAllowForFlush); - Assert.Equal(MeterProviderBuilderState.MaxMetricPointsPerMetricDefault, MetricPointCount()); + Assert.Equal(MeterProviderBuilderSdk.MaxMetricPointsPerMetricDefault, MetricPointCount()); } [Fact] diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs index f7b5149c1d6..50ecb0e14c5 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs @@ -157,6 +157,8 @@ public void ServiceLifecycleAvailableToServicesBuilderTest() ServiceProvider serviceProvider = null; TracerProviderSdk provider = null; + services.AddOpenTelemetry(); + services.ConfigureOpenTelemetryTracing(builder => { testRun = true; @@ -166,7 +168,7 @@ public void ServiceLifecycleAvailableToServicesBuilderTest() () => { // Note: Build can't be called directly on builder tied to external services - Assert.Throws(() => builder.Build()); + Assert.Null(builder.Build()); serviceProvider = services.BuildServiceProvider(); @@ -197,6 +199,8 @@ public void SingleProviderForServiceCollectionTest() { var services = new ServiceCollection(); + services.AddOpenTelemetry(); + services.ConfigureOpenTelemetryTracing(builder => { builder.AddInstrumentation(() => new()); @@ -381,6 +385,8 @@ public void TracerProviderNestedResolutionUsingConfigureTest() var serviceCollection = new ServiceCollection(); + serviceCollection.AddOpenTelemetry(); + serviceCollection.ConfigureOpenTelemetryTracing(builder => { builder.ConfigureBuilder((sp, builder) => @@ -403,7 +409,6 @@ private static void RunBuilderServiceLifecycleTest( Action postAction) { var baseBuilder = builder as TracerProviderBuilderBase; - Assert.Null(baseBuilder.State); builder .AddSource("TestSource") @@ -431,17 +436,17 @@ private static void RunBuilderServiceLifecycleTest( { configureBuilderInvocations++; - var baseBuilder = builder as TracerProviderBuilderBase; - Assert.NotNull(baseBuilder?.State); + var sdkBuilder = builder as TracerProviderBuilderSdk; + Assert.NotNull(sdkBuilder); 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"); + Assert.Contains(sdkBuilder.Sources, s => s == "TestSource"); + Assert.Contains(sdkBuilder.Sources, s => s == "TestSource2"); + Assert.Contains(sdkBuilder.LegacyActivityOperationNames, s => s == "TestLegacySource"); + Assert.Contains(sdkBuilder.LegacyActivityOperationNames, s => s == "TestLegacySource2"); // Note: Services can't be configured at this stage Assert.Throws( From 641fd3fdda725235a5e061cfc4a76cfe19afacdf Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Mon, 28 Nov 2022 14:32:17 -0800 Subject: [PATCH 02/48] Manual merge fixes. --- .../Metrics/Builder/MeterProviderBuilderSdk.cs | 7 ++++--- .../Trace/Builder/TracerProviderBuilderSdk.cs | 8 +++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs index ceaca364eb2..ff25a804091 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs @@ -34,6 +34,7 @@ internal sealed class MeterProviderBuilderSdk : MeterProviderBuilder, IProviderB { public const int MaxMetricsDefault = 1000; public const int MaxMetricPointsPerMetricDefault = 2000; + private const string DefaultInstrumentationVersion = "1.0.0.0"; private static readonly Regex InstrumentNameRegex = new( @"^[a-z][a-z0-9-._]{0,62}$", RegexOptions.IgnoreCase | RegexOptions.Compiled); @@ -114,8 +115,8 @@ public override MeterProviderBuilder AddInstrumentation( return this.AddInstrumentation( typeof(TInstrumentation).Name, - "semver:" + typeof(TInstrumentation).Assembly.GetName().Version, - instrumentationFactory()); + typeof(TInstrumentation).Assembly.GetName().Version?.ToString() ?? DefaultInstrumentationVersion, + instrumentationFactory!()); } public MeterProviderBuilder AddInstrumentation( @@ -206,7 +207,7 @@ public MeterProviderBuilder ConfigureBuilder(Action internal sealed class TracerProviderBuilderSdk : TracerProviderBuilder, IProviderBuilder, IDeferredTracerProviderBuilder { + private const string DefaultInstrumentationVersion = "1.0.0.0"; + private readonly IServiceProvider serviceProvider; private TracerProviderSdk? tracerProvider; @@ -73,8 +75,8 @@ public override TracerProviderBuilder AddInstrumentation( return this.AddInstrumentation( typeof(TInstrumentation).Name, - "semver:" + typeof(TInstrumentation).Assembly.GetName().Version, - instrumentationFactory()); + typeof(TInstrumentation).Assembly.GetName().Version?.ToString() ?? DefaultInstrumentationVersion, + instrumentationFactory!()); } public TracerProviderBuilder AddInstrumentation( @@ -169,7 +171,7 @@ public TracerProviderBuilder ConfigureBuilder(Action Date: Mon, 28 Nov 2022 16:09:11 -0800 Subject: [PATCH 03/48] Some refactoring. --- .../CHANGELOG.md | 2 + ...ConfigureProviderBuilderCallbackWrapper.cs | 38 ------------------- .../Metrics/DeferredMeterProviderBuilder.cs | 26 ++++++++++--- .../IConfigureMeterProviderBuilder.cs} | 8 ++-- .../IMeterProviderBuilder.cs} | 13 +++---- ...derBuilderDependencyInjectionExtensions.cs | 16 +++----- .../Trace/DeferredTracerProviderBuilder.cs | 26 ++++++++++--- .../Trace/IConfigureTracerProviderBuilder.cs | 24 ++++++++++++ .../Trace/ITracerProviderBuilder.cs | 29 ++++++++++++++ ...derBuilderDependencyInjectionExtensions.cs | 16 +++----- .../Builder/MeterProviderBuilderSdk.cs | 2 +- src/OpenTelemetry/Metrics/MeterProviderSdk.cs | 2 +- .../Trace/Builder/TracerProviderBuilderSdk.cs | 2 +- src/OpenTelemetry/Trace/TracerProviderSdk.cs | 2 +- 14 files changed, 123 insertions(+), 83 deletions(-) delete mode 100644 src/OpenTelemetry.DependencyInjection/ConfigureProviderBuilderCallbackWrapper.cs rename src/OpenTelemetry.DependencyInjection/{IConfigureProviderBuilder.cs => Metrics/IConfigureMeterProviderBuilder.cs} (69%) rename src/OpenTelemetry.DependencyInjection/{IProviderBuilder.cs => Metrics/IMeterProviderBuilder.cs} (62%) create mode 100644 src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs create mode 100644 src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs diff --git a/src/OpenTelemetry.DependencyInjection/CHANGELOG.md b/src/OpenTelemetry.DependencyInjection/CHANGELOG.md index 1512c421622..63bfc986bdc 100644 --- a/src/OpenTelemetry.DependencyInjection/CHANGELOG.md +++ b/src/OpenTelemetry.DependencyInjection/CHANGELOG.md @@ -1,3 +1,5 @@ # Changelog ## Unreleased + +Initial release. diff --git a/src/OpenTelemetry.DependencyInjection/ConfigureProviderBuilderCallbackWrapper.cs b/src/OpenTelemetry.DependencyInjection/ConfigureProviderBuilderCallbackWrapper.cs deleted file mode 100644 index 8acd94c12e7..00000000000 --- a/src/OpenTelemetry.DependencyInjection/ConfigureProviderBuilderCallbackWrapper.cs +++ /dev/null @@ -1,38 +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 OpenTelemetry; -using OpenTelemetry.Internal; - -namespace Microsoft.Extensions.DependencyInjection; - -internal sealed class ConfigureProviderBuilderCallbackWrapper : IConfigureProviderBuilder -{ - private readonly Action configure; - - public ConfigureProviderBuilderCallbackWrapper(Action configure) - { - Guard.ThrowIfNull(configure); - - this.configure = configure; - } - - public void ConfigureBuilder(IServiceProvider serviceProvider, TProviderBuilder providerBuilder) - { - this.configure(serviceProvider, providerBuilder); - } -} diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs index 66130af393e..3a69108c106 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs @@ -16,13 +16,12 @@ using System; using Microsoft.Extensions.DependencyInjection.Extensions; -using OpenTelemetry; using OpenTelemetry.Internal; using OpenTelemetry.Metrics; namespace Microsoft.Extensions.DependencyInjection; -public class DeferredMeterProviderBuilder : MeterProviderBuilder, IProviderBuilder, IDeferredMeterProviderBuilder +public class DeferredMeterProviderBuilder : MeterProviderBuilder, IMeterProviderBuilder { public DeferredMeterProviderBuilder(IServiceCollection services) { @@ -36,7 +35,7 @@ public DeferredMeterProviderBuilder(IServiceCollection services) } /// - MeterProvider? IProviderBuilder.Provider => null; + MeterProvider? IMeterProviderBuilder.Provider => null; protected IServiceCollection? Services { get; set; } @@ -69,8 +68,8 @@ public override MeterProviderBuilder AddMeter(params string[] names) /// public MeterProviderBuilder ConfigureBuilder(Action configure) { - this.ConfigureServices(services => services.AddSingleton>( - new ConfigureProviderBuilderCallbackWrapper(configure))); + this.ConfigureServices(services => services.AddSingleton( + new ConfigureMeterProviderBuilderCallbackWrapper(configure))); return this; } @@ -95,4 +94,21 @@ public MeterProviderBuilder ConfigureServices(Action configu /// MeterProviderBuilder IDeferredMeterProviderBuilder.Configure(Action configure) => this.ConfigureBuilder(configure); + + private sealed class ConfigureMeterProviderBuilderCallbackWrapper : IConfigureMeterProviderBuilder + { + private readonly Action configure; + + public ConfigureMeterProviderBuilderCallbackWrapper(Action configure) + { + Guard.ThrowIfNull(configure); + + this.configure = configure; + } + + public void ConfigureBuilder(IServiceProvider serviceProvider, MeterProviderBuilder meterProviderBuilder) + { + this.configure(serviceProvider, meterProviderBuilder); + } + } } diff --git a/src/OpenTelemetry.DependencyInjection/IConfigureProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs similarity index 69% rename from src/OpenTelemetry.DependencyInjection/IConfigureProviderBuilder.cs rename to src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs index 9b56cd76ea8..fdc8c3586b9 100644 --- a/src/OpenTelemetry.DependencyInjection/IConfigureProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs @@ -1,4 +1,4 @@ -// +// // Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,9 +16,9 @@ using System; -namespace OpenTelemetry; +namespace OpenTelemetry.Metrics; -public interface IConfigureProviderBuilder +public interface IConfigureMeterProviderBuilder { - void ConfigureBuilder(IServiceProvider serviceProvider, TProviderBuilder providerBuilder); + void ConfigureBuilder(IServiceProvider serviceProvider, MeterProviderBuilder meterProviderBuilder); } diff --git a/src/OpenTelemetry.DependencyInjection/IProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs similarity index 62% rename from src/OpenTelemetry.DependencyInjection/IProviderBuilder.cs rename to src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs index 4fad16f9f6f..5bba3d721c2 100644 --- a/src/OpenTelemetry.DependencyInjection/IProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs @@ -1,4 +1,4 @@ -// +// // Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -17,14 +17,13 @@ using System; using Microsoft.Extensions.DependencyInjection; -namespace OpenTelemetry; +namespace OpenTelemetry.Metrics; -public interface IProviderBuilder - where TProvider : BaseProvider +public interface IMeterProviderBuilder : IDeferredMeterProviderBuilder { - TProvider? Provider { get; } + MeterProvider? Provider { get; } - TProviderBuilder ConfigureServices(Action configure); + MeterProviderBuilder ConfigureServices(Action configure); - TProviderBuilder ConfigureBuilder(Action configure); + MeterProviderBuilder ConfigureBuilder(Action configure); } diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderDependencyInjectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderDependencyInjectionExtensions.cs index bebdd28b8b0..8600abe23ee 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderDependencyInjectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderDependencyInjectionExtensions.cs @@ -86,10 +86,10 @@ public static MeterProviderBuilder AddInstrumentation( meterProviderBuilder.ConfigureBuilder((sp, builder) => { - if (builder is IProviderBuilder providerBuilder - && providerBuilder.Provider != null) + if (builder is IMeterProviderBuilder iMeterProviderBuilder + && iMeterProviderBuilder.Provider != null) { - builder.AddInstrumentation(() => instrumentationFactory(sp, providerBuilder.Provider)); + builder.AddInstrumentation(() => instrumentationFactory(sp, iMeterProviderBuilder.Provider)); } }); @@ -111,9 +111,9 @@ public static MeterProviderBuilder ConfigureServices( this MeterProviderBuilder meterProviderBuilder, Action configure) { - if (meterProviderBuilder is IProviderBuilder providerBuilder) + if (meterProviderBuilder is IMeterProviderBuilder iMeterProviderBuilder) { - providerBuilder.ConfigureServices(configure); + iMeterProviderBuilder.ConfigureServices(configure); } return meterProviderBuilder; @@ -131,11 +131,7 @@ public static MeterProviderBuilder ConfigureBuilder( this MeterProviderBuilder meterProviderBuilder, Action configure) { - if (meterProviderBuilder is IProviderBuilder providerBuilder) - { - providerBuilder.ConfigureBuilder(configure); - } - else if (meterProviderBuilder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder) + if (meterProviderBuilder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder) { deferredMeterProviderBuilder.Configure(configure); } diff --git a/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs index 032235ab414..165bb8bd2a2 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs @@ -16,13 +16,12 @@ using System; using Microsoft.Extensions.DependencyInjection.Extensions; -using OpenTelemetry; using OpenTelemetry.Internal; using OpenTelemetry.Trace; namespace Microsoft.Extensions.DependencyInjection; -public class DeferredTracerProviderBuilder : TracerProviderBuilder, IProviderBuilder, IDeferredTracerProviderBuilder +public class DeferredTracerProviderBuilder : TracerProviderBuilder, ITracerProviderBuilder { public DeferredTracerProviderBuilder(IServiceCollection services) { @@ -36,7 +35,7 @@ public DeferredTracerProviderBuilder(IServiceCollection services) } /// - TracerProvider? IProviderBuilder.Provider => null; + TracerProvider? ITracerProviderBuilder.Provider => null; protected IServiceCollection? Services { get; set; } @@ -82,8 +81,8 @@ public override TracerProviderBuilder AddLegacySource(string operationName) /// public TracerProviderBuilder ConfigureBuilder(Action configure) { - this.ConfigureServices(services => services.AddSingleton>( - new ConfigureProviderBuilderCallbackWrapper(configure))); + this.ConfigureServices(services => services.AddSingleton( + new ConfigureTracerProviderBuilderCallbackWrapper(configure))); return this; } @@ -108,4 +107,21 @@ public TracerProviderBuilder ConfigureServices(Action config /// TracerProviderBuilder IDeferredTracerProviderBuilder.Configure(Action configure) => this.ConfigureBuilder(configure); + + private sealed class ConfigureTracerProviderBuilderCallbackWrapper : IConfigureTracerProviderBuilder + { + private readonly Action configure; + + public ConfigureTracerProviderBuilderCallbackWrapper(Action configure) + { + Guard.ThrowIfNull(configure); + + this.configure = configure; + } + + public void ConfigureBuilder(IServiceProvider serviceProvider, TracerProviderBuilder tracerProviderBuilder) + { + this.configure(serviceProvider, tracerProviderBuilder); + } + } } diff --git a/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs new file mode 100644 index 00000000000..f28d22ab5c6 --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs @@ -0,0 +1,24 @@ +// +// 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; + +namespace OpenTelemetry.Trace; + +public interface IConfigureTracerProviderBuilder +{ + void ConfigureBuilder(IServiceProvider serviceProvider, TracerProviderBuilder tracerProviderBuilder); +} diff --git a/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs new file mode 100644 index 00000000000..47cbaca1352 --- /dev/null +++ b/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs @@ -0,0 +1,29 @@ +// +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +using System; +using Microsoft.Extensions.DependencyInjection; + +namespace OpenTelemetry.Trace; + +public interface ITracerProviderBuilder : IDeferredTracerProviderBuilder +{ + TracerProvider? Provider { get; } + + TracerProviderBuilder ConfigureServices(Action configure); + + TracerProviderBuilder ConfigureBuilder(Action configure); +} diff --git a/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderDependencyInjectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderDependencyInjectionExtensions.cs index 6cca00dc3ea..e360657e976 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderDependencyInjectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderDependencyInjectionExtensions.cs @@ -86,10 +86,10 @@ public static TracerProviderBuilder AddInstrumentation( tracerProviderBuilder.ConfigureBuilder((sp, builder) => { - if (builder is IProviderBuilder providerBuilder - && providerBuilder.Provider != null) + if (tracerProviderBuilder is ITracerProviderBuilder iTracerProviderBuilder + && iTracerProviderBuilder.Provider != null) { - builder.AddInstrumentation(() => instrumentationFactory(sp, providerBuilder.Provider)); + builder.AddInstrumentation(() => instrumentationFactory(sp, iTracerProviderBuilder.Provider)); } }); @@ -111,9 +111,9 @@ public static TracerProviderBuilder ConfigureServices( this TracerProviderBuilder tracerProviderBuilder, Action configure) { - if (tracerProviderBuilder is IProviderBuilder providerBuilder) + if (tracerProviderBuilder is ITracerProviderBuilder iTracerProviderBuilder) { - providerBuilder.ConfigureServices(configure); + iTracerProviderBuilder.ConfigureServices(configure); } return tracerProviderBuilder; @@ -131,11 +131,7 @@ public static TracerProviderBuilder ConfigureBuilder( this TracerProviderBuilder tracerProviderBuilder, Action configure) { - if (tracerProviderBuilder is IProviderBuilder providerBuilder) - { - providerBuilder.ConfigureBuilder(configure); - } - else if (tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) + if (tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder) { deferredTracerProviderBuilder.Configure(configure); } diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs index ff25a804091..baba4c07ac9 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs @@ -30,7 +30,7 @@ namespace OpenTelemetry.Metrics /// /// Stores state used to build a . /// - internal sealed class MeterProviderBuilderSdk : MeterProviderBuilder, IProviderBuilder, IDeferredMeterProviderBuilder + internal sealed class MeterProviderBuilderSdk : MeterProviderBuilder, IMeterProviderBuilder { public const int MaxMetricsDefault = 1000; public const int MaxMetricPointsPerMetricDefault = 2000; diff --git a/src/OpenTelemetry/Metrics/MeterProviderSdk.cs b/src/OpenTelemetry/Metrics/MeterProviderSdk.cs index d8cced1d8a3..208b7bc0a39 100644 --- a/src/OpenTelemetry/Metrics/MeterProviderSdk.cs +++ b/src/OpenTelemetry/Metrics/MeterProviderSdk.cs @@ -61,7 +61,7 @@ internal MeterProviderSdk( OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent("Building MeterProvider."); - var configureProviderBuilders = serviceProvider.GetServices>(); + var configureProviderBuilders = serviceProvider.GetServices(); foreach (var configureProviderBuilder in configureProviderBuilders) { configureProviderBuilder.ConfigureBuilder(serviceProvider, state); diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs index c7f3b7f9f47..1cf3b5d6f0c 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs @@ -28,7 +28,7 @@ namespace OpenTelemetry.Trace /// /// Stores state used to build a . /// - internal sealed class TracerProviderBuilderSdk : TracerProviderBuilder, IProviderBuilder, IDeferredTracerProviderBuilder + internal sealed class TracerProviderBuilderSdk : TracerProviderBuilder, ITracerProviderBuilder { private const string DefaultInstrumentationVersion = "1.0.0.0"; diff --git a/src/OpenTelemetry/Trace/TracerProviderSdk.cs b/src/OpenTelemetry/Trace/TracerProviderSdk.cs index 768063852e2..8a69b4d8a21 100644 --- a/src/OpenTelemetry/Trace/TracerProviderSdk.cs +++ b/src/OpenTelemetry/Trace/TracerProviderSdk.cs @@ -61,7 +61,7 @@ internal TracerProviderSdk( OpenTelemetrySdkEventSource.Log.TracerProviderSdkEvent("Building TracerProvider."); - var configureProviderBuilders = serviceProvider.GetServices>(); + var configureProviderBuilders = serviceProvider.GetServices(); foreach (var configureProviderBuilder in configureProviderBuilders) { configureProviderBuilder.ConfigureBuilder(serviceProvider, state); From 7486cc2996831c1f1ee20e9ce8a19a8409edd535 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Mon, 28 Nov 2022 17:20:37 -0800 Subject: [PATCH 04/48] Renames. --- ...metryDependencyInjectionMeterProviderBuilderExtensions.cs} | 4 ++-- ...yDependencyInjectionMetricsServiceCollectionExtensions.cs} | 4 ++-- ...etryDependencyInjectionTracerProviderBuilderExtensions.cs} | 4 ++-- ...yDependencyInjectionTracingServiceCollectionExtensions.cs} | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) rename src/OpenTelemetry.DependencyInjection/Metrics/{MeterProviderBuilderDependencyInjectionExtensions.cs => OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs} (96%) rename src/OpenTelemetry.DependencyInjection/Metrics/{MeterProviderBuilderServiceCollectionExtensions.cs => OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs} (93%) rename src/OpenTelemetry.DependencyInjection/Trace/{TracerProviderBuilderDependencyInjectionExtensions.cs => OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs} (96%) rename src/OpenTelemetry.DependencyInjection/Trace/{TracerProviderBuilderServiceCollectionExtensions.cs => OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs} (93%) diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderDependencyInjectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs similarity index 96% rename from src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderDependencyInjectionExtensions.cs rename to src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs index 8600abe23ee..87ff76b6350 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderDependencyInjectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs @@ -1,4 +1,4 @@ -// +// // Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,7 +24,7 @@ namespace OpenTelemetry.Metrics; /// /// Contains extension methods for the class. /// -public static class MeterProviderBuilderDependencyInjectionExtensions +public static class OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions { /// /// Adds instrumentation to the provider. diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs similarity index 93% rename from src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderServiceCollectionExtensions.cs rename to src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs index 0572c34be31..511382b7f7c 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/MeterProviderBuilderServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs @@ -1,4 +1,4 @@ -// +// // Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,7 +23,7 @@ namespace Microsoft.Extensions.DependencyInjection; /// /// Extension methods for setting up OpenTelemetry Metrics services in an . /// -public static class MeterProviderBuilderServiceCollectionExtensions +public static class OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions { /// /// Configures OpenTelemetry Metrics services in the supplied . diff --git a/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderDependencyInjectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs similarity index 96% rename from src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderDependencyInjectionExtensions.cs rename to src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs index e360657e976..d436068e82d 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderDependencyInjectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs @@ -1,4 +1,4 @@ -// +// // Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,7 +24,7 @@ namespace OpenTelemetry.Trace; /// /// Contains extension methods for the class. /// -public static class TracerProviderBuilderDependencyInjectionExtensions +public static class OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions { /// /// Adds instrumentation to the provider. diff --git a/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs similarity index 93% rename from src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderServiceCollectionExtensions.cs rename to src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs index 38fd2ad9cc6..384ea563257 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/TracerProviderBuilderServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs @@ -1,4 +1,4 @@ -// +// // Copyright The OpenTelemetry Authors // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,7 +23,7 @@ namespace Microsoft.Extensions.DependencyInjection; /// /// Extension methods for setting up OpenTelemetry tracing services in an . /// -public static class TracerProviderBuilderServiceCollectionExtensions +public static class OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions { /// /// Configures OpenTelemetry tracing services in the supplied . From 55c1e629ad3dd22fa2a0afab40440362078b3dc1 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Tue, 29 Nov 2022 15:20:39 -0800 Subject: [PATCH 05/48] Bug fixes and refactoring. --- .../Metrics/DeferredMeterProviderBuilder.cs | 3 - .../Trace/DeferredTracerProviderBuilder.cs | 3 - .../OpenTelemetryServicesExtensions.cs | 8 +- src/OpenTelemetry/AssemblyInfo.cs | 1 - ...viderBuilderServiceCollectionExtensions.cs | 2 - .../Builder/MeterProviderBuilderBase.cs | 5 +- ...penTelemetryServiceCollectionExtensions.cs | 38 ++++- .../Builder/TracerProviderBuilderBase.cs | 5 +- .../HostingMeterExtensionTests.cs | 120 +------------- .../HostingTracerExtensionTests.cs | 156 +++--------------- .../MeterProviderBuilderExtensionsTests.cs | 12 +- .../TracerProviderBuilderExtensionsTest.cs | 14 +- 12 files changed, 86 insertions(+), 281 deletions(-) diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs index 3a69108c106..9d01688547e 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs @@ -15,7 +15,6 @@ // using System; -using Microsoft.Extensions.DependencyInjection.Extensions; using OpenTelemetry.Internal; using OpenTelemetry.Metrics; @@ -29,8 +28,6 @@ public DeferredMeterProviderBuilder(IServiceCollection services) this.Services = services; - services.TryAddSingleton(sp => throw new NotSupportedException("The OpenTelemetry SDK has not been initialized. Call AddOpenTelemetry to register the SDK.")); - this.ConfigureBuilder((sp, builder) => this.Services = null); } diff --git a/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs index 165bb8bd2a2..41ed3cf1230 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs @@ -15,7 +15,6 @@ // using System; -using Microsoft.Extensions.DependencyInjection.Extensions; using OpenTelemetry.Internal; using OpenTelemetry.Trace; @@ -29,8 +28,6 @@ public DeferredTracerProviderBuilder(IServiceCollection services) this.Services = services; - services.TryAddSingleton(sp => throw new NotSupportedException("The OpenTelemetry SDK has not been initialized. Call AddOpenTelemetry to register the SDK.")); - this.ConfigureBuilder((sp, builder) => this.Services = null); } diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs index bab30c06a0d..7ce40d153bf 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -46,7 +46,7 @@ public static class OpenTelemetryServicesExtensions /// /// This method should be called by application host code. Library /// authors should call + /// cref="OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracing(IServiceCollection)"/> /// instead. /// /// @@ -74,7 +74,7 @@ public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection { Guard.ThrowIfNull(services); - services.AddOpenTelemetry(); + services.AddOpenTelemetryTracerProvider(); services.ConfigureOpenTelemetryTracing(configure); @@ -99,7 +99,7 @@ public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection /// /// This method should be called by application host code. Library /// authors should call + /// cref="OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(IServiceCollection)"/> /// instead. /// /// @@ -127,7 +127,7 @@ public static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollection { Guard.ThrowIfNull(services); - services.AddOpenTelemetry(); + services.AddOpenTelemetryMeterProvider(); services.ConfigureOpenTelemetryMetrics(configure); diff --git a/src/OpenTelemetry/AssemblyInfo.cs b/src/OpenTelemetry/AssemblyInfo.cs index c5d345fb6ae..38bc9f164dd 100644 --- a/src/OpenTelemetry/AssemblyInfo.cs +++ b/src/OpenTelemetry/AssemblyInfo.cs @@ -21,6 +21,5 @@ [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.Tests" + AssemblyInfo.PublicKey)] [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2" + AssemblyInfo.MoqPublicKey)] [assembly: InternalsVisibleTo("Benchmarks" + AssemblyInfo.PublicKey)] diff --git a/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs b/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs index 56912041039..82d913793f8 100644 --- a/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs @@ -32,7 +32,6 @@ public static IServiceCollection AddOpenTelemetryMeterProviderBuilderServices(th { services.AddOpenTelemetryProviderBuilderServices(); - services.TryAddSingleton(sp => new MeterProviderSdk(sp, ownsServiceProvider: false)); services.TryAddSingleton(); services.RegisterOptionsFactory(configuration => new MetricReaderOptions(configuration)); @@ -43,7 +42,6 @@ public static IServiceCollection AddOpenTelemetryTracerProviderBuilderServices(t { services.AddOpenTelemetryProviderBuilderServices(); - services.TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: false)); services.TryAddSingleton(); services.RegisterOptionsFactory(configuration => new BatchExportActivityProcessorOptions(configuration)); diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs index a8735251e9f..a176eadcaf1 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs @@ -18,6 +18,7 @@ using System; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; namespace OpenTelemetry.Metrics; @@ -31,8 +32,8 @@ public MeterProviderBuilderBase() { this.ConfigureServices(services => services .AddOpenTelemetryMeterProviderBuilderServices() - .AddSingleton( - sp => throw new NotSupportedException("External MeterProvider created through Sdk.CreateMeterProviderBuilder cannot be accessed using service provider."))); + .TryAddSingleton( + sp => throw new NotSupportedException("Self-contained MeterProvider cannot be accessed using the application IServiceProvider call Build instead."))); } internal MeterProvider InvokeBuild() diff --git a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs index e62feaf1ded..9ceca05b51d 100644 --- a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs @@ -1,16 +1,48 @@ +// +// 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.Extensions; using OpenTelemetry.Internal; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; namespace Microsoft.Extensions.DependencyInjection; public static class OpenTelemetryServiceCollectionExtensions { - public static IServiceCollection AddOpenTelemetry(this IServiceCollection services) + public static IServiceCollection AddOpenTelemetryTracerProvider(this IServiceCollection services) + { + Guard.ThrowIfNull(services); + + services + .AddOpenTelemetryTracerProviderBuilderServices() + .TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: false)); + + return services; + } + + public static IServiceCollection AddOpenTelemetryMeterProvider(this IServiceCollection services) { Guard.ThrowIfNull(services); - services.AddOpenTelemetryTracerProviderBuilderServices(); - services.AddOpenTelemetryMeterProviderBuilderServices(); + services + .AddOpenTelemetryMeterProviderBuilderServices() + .TryAddSingleton(sp => new MeterProviderSdk(sp, ownsServiceProvider: false)); return services; } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index c2f26a7ea9b..3c1d2a7eaa9 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -18,6 +18,7 @@ using System; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using OpenTelemetry.Internal; namespace OpenTelemetry.Trace; @@ -32,8 +33,8 @@ public TracerProviderBuilderBase() { this.ConfigureServices(services => services .AddOpenTelemetryTracerProviderBuilderServices() - .AddSingleton( - sp => throw new NotSupportedException("External TracerProvider created through Sdk.CreateTracerProviderBuilder cannot be accessed using service provider."))); + .TryAddSingleton( + sp => throw new NotSupportedException("Self-contained TracerProvider cannot be accessed using the application IServiceProvider call Build instead."))); } internal TracerProvider InvokeBuild() diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs index 80678f07e3c..41853e4bff2 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs @@ -16,7 +16,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -31,7 +30,6 @@ public class HostingMeterExtensionTests [Fact] public async Task AddOpenTelemetryMeterProviderInstrumentationCreationAndDisposal() { - var testInstrumentation = new TestInstrumentation(); var callbackRun = false; var builder = new HostBuilder().ConfigureServices(services => @@ -41,7 +39,7 @@ public async Task AddOpenTelemetryMeterProviderInstrumentationCreationAndDisposa builder.AddInstrumentation(() => { callbackRun = true; - return testInstrumentation; + return new object(); }); }); }); @@ -49,22 +47,18 @@ public async Task AddOpenTelemetryMeterProviderInstrumentationCreationAndDisposa var host = builder.Build(); Assert.False(callbackRun); - Assert.False(testInstrumentation.Disposed); await host.StartAsync(); Assert.True(callbackRun); - Assert.False(testInstrumentation.Disposed); await host.StopAsync(); Assert.True(callbackRun); - Assert.False(testInstrumentation.Disposed); host.Dispose(); Assert.True(callbackRun); - Assert.True(testInstrumentation.Disposed); } [Fact] @@ -83,101 +77,14 @@ public void AddOpenTelemetryMeterProvider_HostBuilt_OpenTelemetrySdk_RegisteredA Assert.Same(meterProvider1, meterProvider2); } - [Fact] - public void AddOpenTelemetryMeterProvider_ServiceProviderArgument_ServicesRegistered() - { - var testInstrumentation = new TestInstrumentation(); - - var services = new ServiceCollection(); - services.AddSingleton(testInstrumentation); - services.AddOpenTelemetryMetrics(builder => - { - builder.ConfigureBuilder( - (sp, b) => b.AddInstrumentation(() => sp.GetRequiredService())); - }); - - var serviceProvider = services.BuildServiceProvider(); - - var meterFactory = serviceProvider.GetRequiredService(); - Assert.NotNull(meterFactory); - - Assert.False(testInstrumentation.Disposed); - - serviceProvider.Dispose(); - - Assert.True(testInstrumentation.Disposed); - } - [Fact] public void AddOpenTelemetryMeterProvider_BadArgs_NullServiceCollection() { ServiceCollection services = null; Assert.Throws(() => services.AddOpenTelemetryMetrics(null)); - Assert.Throws(() => - services.AddOpenTelemetryMetrics(builder => - { - builder.ConfigureBuilder( - (sp, b) => b.AddInstrumentation(() => sp.GetRequiredService())); - })); - } - - [Fact] - public void AddOpenTelemetryMeterProvider_GetServicesExtension() - { - var services = new ServiceCollection(); - services.AddOpenTelemetryMetrics(builder => AddMyFeature(builder)); - - using var serviceProvider = services.BuildServiceProvider(); - - var meterProvider = (MeterProviderSdk)serviceProvider.GetRequiredService(); - - Assert.True(meterProvider.Reader is TestReader); - } - - [Fact] - public void AddOpenTelemetryMeterProvider_NestedConfigureCallbacks() - { - int configureCalls = 0; - var services = new ServiceCollection(); - services.AddOpenTelemetryMetrics(builder => builder - .ConfigureBuilder((sp1, builder1) => - { - configureCalls++; - builder1.ConfigureBuilder((sp2, builder2) => - { - configureCalls++; - }); - })); - - using var serviceProvider = services.BuildServiceProvider(); - - var meterFactory = serviceProvider.GetRequiredService(); - - Assert.Equal(2, configureCalls); - } - - [Fact] - public void AddOpenTelemetryMeterProvider_ConfigureCallbacksUsingExtensions() - { - var services = new ServiceCollection(); - - services.AddSingleton(); - services.AddSingleton(); - - services.AddOpenTelemetryMetrics(builder => builder - .ConfigureBuilder((sp1, builder1) => - { - builder1 - .AddInstrumentation(sp1.GetRequiredService()) - .AddReader(sp1.GetRequiredService()); - })); - - using var serviceProvider = services.BuildServiceProvider(); - - var meterProvider = (MeterProviderSdk)serviceProvider.GetRequiredService(); - Assert.True(meterProvider.Instrumentations.FirstOrDefault() is TestInstrumentation); - Assert.True(meterProvider.Reader is TestReader); + services = new(); + Assert.Throws(() => services.AddOpenTelemetryMetrics(null)); } [Fact] @@ -238,26 +145,5 @@ public async Task AddOpenTelemetryMetrics_HostConfigurationHonoredTest() host.Dispose(); } - - private static MeterProviderBuilder AddMyFeature(MeterProviderBuilder meterProviderBuilder) - { - meterProviderBuilder.ConfigureServices(services => services.AddSingleton()); - - return meterProviderBuilder.AddReader(); - } - - internal class TestInstrumentation : IDisposable - { - public bool Disposed { get; private set; } - - public void Dispose() - { - this.Disposed = true; - } - } - - internal class TestReader : MetricReader - { - } } } diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs index f8d5be9d6f0..7e90079d36a 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs @@ -16,8 +16,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -32,7 +30,6 @@ public class HostingTracerExtensionTests [Fact] public async Task AddOpenTelemetryTracerProviderInstrumentationCreationAndDisposal() { - var testInstrumentation = new TestInstrumentation(); var callbackRun = false; var builder = new HostBuilder().ConfigureServices(services => @@ -42,7 +39,7 @@ public async Task AddOpenTelemetryTracerProviderInstrumentationCreationAndDispos builder.AddInstrumentation(() => { callbackRun = true; - return testInstrumentation; + return new object(); }); }); }); @@ -50,30 +47,43 @@ public async Task AddOpenTelemetryTracerProviderInstrumentationCreationAndDispos var host = builder.Build(); Assert.False(callbackRun); - Assert.False(testInstrumentation.Disposed); await host.StartAsync(); Assert.True(callbackRun); - Assert.False(testInstrumentation.Disposed); await host.StopAsync(); Assert.True(callbackRun); - Assert.False(testInstrumentation.Disposed); host.Dispose(); Assert.True(callbackRun); - Assert.True(testInstrumentation.Disposed); } - [Fact] - public void AddOpenTelemetryTracerProvider_HostBuilt_OpenTelemetrySdk_RegisteredAsSingleton() + [Theory] + [InlineData(false, false)] + [InlineData(true, false)] + [InlineData(false, true)] + [InlineData(true, true)] + public void AddOpenTelemetryTracerProvider_HostBuilt_OpenTelemetrySdk_RegisteredAsSingleton(bool callPreConfigure, bool callPostConfigure) { + bool preConfigureCalled = false; + bool postConfigureCalled = false; + var builder = new HostBuilder().ConfigureServices(services => { + if (callPreConfigure) + { + services.ConfigureOpenTelemetryTracing(builder => builder.ConfigureBuilder((sp, builder) => preConfigureCalled = true)); + } + services.AddOpenTelemetryTracing(); + + if (callPostConfigure) + { + services.ConfigureOpenTelemetryTracing(builder => builder.ConfigureBuilder((sp, builder) => postConfigureCalled = true)); + } }); var host = builder.Build(); @@ -82,106 +92,19 @@ public void AddOpenTelemetryTracerProvider_HostBuilt_OpenTelemetrySdk_Registered var tracerProvider2 = host.Services.GetRequiredService(); Assert.Same(tracerProvider1, tracerProvider2); - } - - [Fact] - public void AddOpenTelemetryTracerProvider_ServiceProviderArgument_ServicesRegistered() - { - var testInstrumentation = new TestInstrumentation(); - - var services = new ServiceCollection(); - services.AddSingleton(testInstrumentation); - services.AddOpenTelemetryTracing(builder => - { - builder.ConfigureBuilder( - (sp, b) => b.AddInstrumentation(() => sp.GetRequiredService())); - }); - - var serviceProvider = services.BuildServiceProvider(); - - var tracerFactory = serviceProvider.GetRequiredService(); - Assert.NotNull(tracerFactory); - - Assert.False(testInstrumentation.Disposed); - - serviceProvider.Dispose(); - Assert.True(testInstrumentation.Disposed); + Assert.Equal(callPreConfigure, preConfigureCalled); + Assert.Equal(callPostConfigure, postConfigureCalled); } [Fact] public void AddOpenTelemetryTracerProvider_BadArgs_NullServiceCollection() { ServiceCollection services = null; - Assert.Throws(() => services.AddOpenTelemetryTracing(null)); - Assert.Throws(() => - services.AddOpenTelemetryTracing(builder => - { - builder.ConfigureBuilder( - (sp, b) => b.AddInstrumentation(() => sp.GetRequiredService())); - })); - } - - [Fact] - public void AddOpenTelemetryTracerProvider_GetServicesExtension() - { - var services = new ServiceCollection(); - services.AddOpenTelemetryTracing(builder => AddMyFeature(builder)); - - using var serviceProvider = services.BuildServiceProvider(); - - var tracerProvider = (TracerProviderSdk)serviceProvider.GetRequiredService(); - - Assert.True(tracerProvider.Sampler is TestSampler); - } - - [Fact] - public void AddOpenTelemetryTracerProvider_NestedConfigureCallbacks() - { - int configureCalls = 0; - var services = new ServiceCollection(); - services.AddOpenTelemetryTracing(builder => builder - .ConfigureBuilder((sp1, builder1) => - { - configureCalls++; - builder1.ConfigureBuilder((sp2, builder2) => - { - configureCalls++; - }); - })); - - using var serviceProvider = services.BuildServiceProvider(); - - var tracerFactory = serviceProvider.GetRequiredService(); - - Assert.Equal(2, configureCalls); - } - - [Fact] - public void AddOpenTelemetryTracerProvider_ConfigureCallbacksUsingExtensions() - { - var services = new ServiceCollection(); - - services.AddSingleton(); - services.AddSingleton(); - services.AddSingleton(); - - services.AddOpenTelemetryTracing(builder => builder - .ConfigureBuilder((sp1, builder1) => - { - builder1 - .AddInstrumentation(sp1.GetRequiredService()) - .AddProcessor(sp1.GetRequiredService()) - .SetSampler(sp1.GetRequiredService()); - })); - - using var serviceProvider = services.BuildServiceProvider(); - - var tracerProvider = (TracerProviderSdk)serviceProvider.GetRequiredService(); + Assert.Throws(() => services.AddOpenTelemetryTracing()); - Assert.True(tracerProvider.Instrumentations.FirstOrDefault() is TestInstrumentation); - Assert.True(tracerProvider.Processor is TestProcessor); - Assert.True(tracerProvider.Sampler is TestSampler); + services = new(); + Assert.Throws(() => services.AddOpenTelemetryTracing(null)); } [Fact] @@ -242,34 +165,5 @@ public async Task AddOpenTelemetryTracing_HostConfigurationHonoredTest() host.Dispose(); } - - private static TracerProviderBuilder AddMyFeature(TracerProviderBuilder tracerProviderBuilder) - { - tracerProviderBuilder.ConfigureServices(services => services.AddSingleton()); - - return tracerProviderBuilder.SetSampler(); - } - - internal class TestInstrumentation : IDisposable - { - public bool Disposed { get; private set; } - - public void Dispose() - { - this.Disposed = true; - } - } - - internal class TestProcessor : BaseProcessor - { - } - - internal class TestSampler : Sampler - { - public override SamplingResult ShouldSample(in SamplingParameters samplingParameters) - { - return new SamplingResult(SamplingDecision.RecordAndSample); - } - } } } diff --git a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs index ccb8c6f129d..df7ed3ee2c3 100644 --- a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs @@ -66,7 +66,7 @@ public void ServiceLifecycleAvailableToServicesBuilderTest() { var services = new ServiceCollection(); - services.AddOpenTelemetry(); + services.AddOpenTelemetryMeterProvider(); bool testRun = false; @@ -113,7 +113,7 @@ public void SingleProviderForServiceCollectionTest() { var services = new ServiceCollection(); - services.AddOpenTelemetry(); + services.AddOpenTelemetryMeterProvider(); services.ConfigureOpenTelemetryMetrics(builder => { @@ -297,11 +297,11 @@ public void MeterProviderNestedResolutionUsingConfigureTest() { bool innerTestExecuted = false; - var serviceCollection = new ServiceCollection(); + var services = new ServiceCollection(); - serviceCollection.AddOpenTelemetry(); + services.AddOpenTelemetryMeterProvider(); - serviceCollection.ConfigureOpenTelemetryMetrics(builder => + services.ConfigureOpenTelemetryMetrics(builder => { builder.ConfigureBuilder((sp, builder) => { @@ -310,7 +310,7 @@ public void MeterProviderNestedResolutionUsingConfigureTest() }); }); - using var serviceProvider = serviceCollection.BuildServiceProvider(); + using var serviceProvider = services.BuildServiceProvider(); var resolvedProvider = serviceProvider.GetRequiredService(); diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs index 50ecb0e14c5..64da8cdce7f 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs @@ -152,13 +152,13 @@ public void ServiceLifecycleAvailableToServicesBuilderTest() { var services = new ServiceCollection(); + services.AddOpenTelemetryTracerProvider(); + bool testRun = false; ServiceProvider serviceProvider = null; TracerProviderSdk provider = null; - services.AddOpenTelemetry(); - services.ConfigureOpenTelemetryTracing(builder => { testRun = true; @@ -199,7 +199,7 @@ public void SingleProviderForServiceCollectionTest() { var services = new ServiceCollection(); - services.AddOpenTelemetry(); + services.AddOpenTelemetryTracerProvider(); services.ConfigureOpenTelemetryTracing(builder => { @@ -383,11 +383,11 @@ public void TracerProviderNestedResolutionUsingConfigureTest() { bool innerTestExecuted = false; - var serviceCollection = new ServiceCollection(); + var services = new ServiceCollection(); - serviceCollection.AddOpenTelemetry(); + services.AddOpenTelemetryTracerProvider(); - serviceCollection.ConfigureOpenTelemetryTracing(builder => + services.ConfigureOpenTelemetryTracing(builder => { builder.ConfigureBuilder((sp, builder) => { @@ -396,7 +396,7 @@ public void TracerProviderNestedResolutionUsingConfigureTest() }); }); - using var serviceProvider = serviceCollection.BuildServiceProvider(); + using var serviceProvider = services.BuildServiceProvider(); var resolvedProvider = serviceProvider.GetRequiredService(); From 18e5a6125de5111212cac1e9e290a2cf0fce4faa Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 30 Nov 2022 12:50:35 -0800 Subject: [PATCH 06/48] Cleanup and docs. --- .../.publicApi/net462/PublicAPI.Unshipped.txt | 45 +++++++++++++++++++ .../netstandard2.0/PublicAPI.Unshipped.txt | 45 +++++++++++++++++++ .../Metrics/DeferredMeterProviderBuilder.cs | 43 ++++++++++++++---- .../Metrics/IConfigureMeterProviderBuilder.cs | 8 ++++ .../Metrics/IMeterProviderBuilder.cs | 30 +++++++++++++ ...InjectionMeterProviderBuilderExtensions.cs | 21 +++++++++ .../Trace/DeferredTracerProviderBuilder.cs | 41 +++++++++++++---- .../Trace/IConfigureTracerProviderBuilder.cs | 8 ++++ .../Trace/ITracerProviderBuilder.cs | 30 +++++++++++++ ...njectionTracerProviderBuilderExtensions.cs | 21 +++++++++ .../Builder/MeterProviderBuilderBase.cs | 39 +++++++++++----- ...penTelemetryServiceCollectionExtensions.cs | 14 +----- .../Builder/TracerProviderBuilderBase.cs | 38 +++++++++++----- 13 files changed, 332 insertions(+), 51 deletions(-) diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt index e69de29bb2d..7340d69d9fe 100644 --- a/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt @@ -0,0 +1,45 @@ +Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder +Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.DeferredMeterProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void +Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder +Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.DeferredTracerProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void +Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions +Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions +OpenTelemetry.Metrics.IConfigureMeterProviderBuilder +OpenTelemetry.Metrics.IConfigureMeterProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> void +OpenTelemetry.Metrics.IMeterProviderBuilder +OpenTelemetry.Metrics.IMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.IMeterProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.IMeterProviderBuilder.Provider.get -> OpenTelemetry.Metrics.MeterProvider? +OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions +OpenTelemetry.Trace.IConfigureTracerProviderBuilder +OpenTelemetry.Trace.IConfigureTracerProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> void +OpenTelemetry.Trace.ITracerProviderBuilder +OpenTelemetry.Trace.ITracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.ITracerProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.ITracerProviderBuilder.Provider.get -> OpenTelemetry.Trace.TracerProvider? +OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions +override Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! +override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, T! instrumentation) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, T! instrumentation) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +~override Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +~override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index e69de29bb2d..7340d69d9fe 100644 --- a/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -0,0 +1,45 @@ +Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder +Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.DeferredMeterProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void +Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder +Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.DeferredTracerProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void +Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions +Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions +OpenTelemetry.Metrics.IConfigureMeterProviderBuilder +OpenTelemetry.Metrics.IConfigureMeterProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> void +OpenTelemetry.Metrics.IMeterProviderBuilder +OpenTelemetry.Metrics.IMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.IMeterProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.IMeterProviderBuilder.Provider.get -> OpenTelemetry.Metrics.MeterProvider? +OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions +OpenTelemetry.Trace.IConfigureTracerProviderBuilder +OpenTelemetry.Trace.IConfigureTracerProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> void +OpenTelemetry.Trace.ITracerProviderBuilder +OpenTelemetry.Trace.ITracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.ITracerProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.ITracerProviderBuilder.Provider.get -> OpenTelemetry.Trace.TracerProvider? +OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions +override Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! +override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, T! instrumentation) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, T! instrumentation) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +~override Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +~override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs index 9d01688547e..8dbd6211742 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs @@ -20,22 +20,33 @@ namespace Microsoft.Extensions.DependencyInjection; +/// +/// A implementation which registers build +/// actions as instances into an +/// . The build actions should be retrieved +/// using the final application and applied to +/// construct a . +/// public class DeferredMeterProviderBuilder : MeterProviderBuilder, IMeterProviderBuilder { + private IServiceCollection? services; + + /// + /// Initializes a new instance of the class. + /// + /// . public DeferredMeterProviderBuilder(IServiceCollection services) { Guard.ThrowIfNull(services); - this.Services = services; + this.services = services; - this.ConfigureBuilder((sp, builder) => this.Services = null); + RegisterBuildAction(services, (sp, builder) => this.services = null); } /// MeterProvider? IMeterProviderBuilder.Provider => null; - protected IServiceCollection? Services { get; set; } - /// public override MeterProviderBuilder AddInstrumentation(Func instrumentationFactory) { @@ -65,8 +76,14 @@ public override MeterProviderBuilder AddMeter(params string[] names) /// public MeterProviderBuilder ConfigureBuilder(Action configure) { - this.ConfigureServices(services => services.AddSingleton( - new ConfigureMeterProviderBuilderCallbackWrapper(configure))); + var services = this.services; + + if (services == null) + { + throw new NotSupportedException("Builder cannot be configured during MeterProvider construction."); + } + + RegisterBuildAction(services, configure); return this; } @@ -76,14 +93,14 @@ public MeterProviderBuilder ConfigureServices(Action configu { Guard.ThrowIfNull(configure); - var services = this.Services; + var services = this.services; if (services == null) { - throw new NotSupportedException("Services cannot be configured after ServiceProvider has been created."); + throw new NotSupportedException("Services cannot be configured during MeterProvider construction."); } - configure(services); + configure((IServiceCollection)services); return this; } @@ -92,6 +109,14 @@ public MeterProviderBuilder ConfigureServices(Action configu MeterProviderBuilder IDeferredMeterProviderBuilder.Configure(Action configure) => this.ConfigureBuilder(configure); + private static void RegisterBuildAction(IServiceCollection services, Action configure) + { + Guard.ThrowIfNull(configure); + + services.AddSingleton( + new ConfigureMeterProviderBuilderCallbackWrapper(configure)); + } + private sealed class ConfigureMeterProviderBuilderCallbackWrapper : IConfigureMeterProviderBuilder { private readonly Action configure; diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs index fdc8c3586b9..72924dd095f 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs @@ -18,7 +18,15 @@ namespace OpenTelemetry.Metrics; +/// +/// Represents something that configures the type. +/// public interface IConfigureMeterProviderBuilder { + /// + /// Invoked to configure a instance. + /// + /// . + /// . void ConfigureBuilder(IServiceProvider serviceProvider, MeterProviderBuilder meterProviderBuilder); } diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs index 5bba3d721c2..97a310439ee 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs @@ -19,11 +19,41 @@ namespace OpenTelemetry.Metrics; +/// +/// Describes a backed by an . +/// public interface IMeterProviderBuilder : IDeferredMeterProviderBuilder { + /// + /// Gets the being constructed by the builder. + /// + /// + /// Note: should return until + /// construction has started and the has + /// closed. + /// MeterProvider? Provider { get; } + /// + /// Register a callback action to configure the where metric services are configured. + /// + /// + /// Note: Metric services are only available during the application + /// configuration phase. This method should throw a if services are configured after the + /// application has been created. + /// + /// Configuration callback. + /// The supplied for chaining. MeterProviderBuilder ConfigureServices(Action configure); + /// + /// Register a callback action to configure the once the application is available. + /// + /// Configuration callback. + /// The supplied for chaining. MeterProviderBuilder ConfigureBuilder(Action configure); } diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs index 87ff76b6350..ede8608b489 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs @@ -49,6 +49,13 @@ public static MeterProviderBuilder AddInstrumentation(this MeterProviderBuild return meterProviderBuilder; } + /// + /// Adds instrumentation to the provider. + /// + /// Instrumentation type. + /// . + /// Instrumentation instance. + /// The supplied for chaining. public static MeterProviderBuilder AddInstrumentation(this MeterProviderBuilder meterProviderBuilder, T instrumentation) where T : class { @@ -62,6 +69,13 @@ public static MeterProviderBuilder AddInstrumentation(this MeterProviderBuild return meterProviderBuilder; } + /// + /// Adds instrumentation to the provider. + /// + /// Instrumentation type. + /// . + /// Instrumentation factory. + /// The supplied for chaining. public static MeterProviderBuilder AddInstrumentation( this MeterProviderBuilder meterProviderBuilder, Func instrumentationFactory) @@ -77,6 +91,13 @@ public static MeterProviderBuilder AddInstrumentation( return meterProviderBuilder; } + /// + /// Adds instrumentation to the provider. + /// + /// Instrumentation type. + /// . + /// Instrumentation factory. + /// The supplied for chaining. public static MeterProviderBuilder AddInstrumentation( this MeterProviderBuilder meterProviderBuilder, Func instrumentationFactory) diff --git a/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs index 41ed3cf1230..31eb8ec7b03 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs @@ -20,22 +20,33 @@ namespace Microsoft.Extensions.DependencyInjection; +/// +/// A implementation which registers build +/// actions as instances into an +/// . The build actions should be retrieved +/// using the final application and applied to +/// construct a . +/// public class DeferredTracerProviderBuilder : TracerProviderBuilder, ITracerProviderBuilder { + private IServiceCollection? services; + + /// + /// Initializes a new instance of the class. + /// + /// . public DeferredTracerProviderBuilder(IServiceCollection services) { Guard.ThrowIfNull(services); - this.Services = services; + this.services = services; - this.ConfigureBuilder((sp, builder) => this.Services = null); + RegisterBuildAction(services, (sp, builder) => this.services = null); } /// TracerProvider? ITracerProviderBuilder.Provider => null; - protected IServiceCollection? Services { get; set; } - /// public override TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) { @@ -78,8 +89,14 @@ public override TracerProviderBuilder AddLegacySource(string operationName) /// public TracerProviderBuilder ConfigureBuilder(Action configure) { - this.ConfigureServices(services => services.AddSingleton( - new ConfigureTracerProviderBuilderCallbackWrapper(configure))); + var services = this.services; + + if (services == null) + { + throw new NotSupportedException("Builder cannot be configured during TracerProvider construction."); + } + + RegisterBuildAction(services, configure); return this; } @@ -89,11 +106,11 @@ public TracerProviderBuilder ConfigureServices(Action config { Guard.ThrowIfNull(configure); - var services = this.Services; + var services = this.services; if (services == null) { - throw new NotSupportedException("Services cannot be configured after ServiceProvider has been created."); + throw new NotSupportedException("Services cannot be configured during TracerProvider construction."); } configure(services); @@ -105,6 +122,14 @@ public TracerProviderBuilder ConfigureServices(Action config TracerProviderBuilder IDeferredTracerProviderBuilder.Configure(Action configure) => this.ConfigureBuilder(configure); + private static void RegisterBuildAction(IServiceCollection services, Action configure) + { + Guard.ThrowIfNull(configure); + + services.AddSingleton( + new ConfigureTracerProviderBuilderCallbackWrapper(configure)); + } + private sealed class ConfigureTracerProviderBuilderCallbackWrapper : IConfigureTracerProviderBuilder { private readonly Action configure; diff --git a/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs index f28d22ab5c6..7e4c85f4899 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs @@ -18,7 +18,15 @@ namespace OpenTelemetry.Trace; +/// +/// Represents something that configures the type. +/// public interface IConfigureTracerProviderBuilder { + /// + /// Invoked to configure a instance. + /// + /// . + /// . void ConfigureBuilder(IServiceProvider serviceProvider, TracerProviderBuilder tracerProviderBuilder); } diff --git a/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs index 47cbaca1352..fa6753be27b 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs @@ -19,11 +19,41 @@ namespace OpenTelemetry.Trace; +/// +/// Describes a backed by an . +/// public interface ITracerProviderBuilder : IDeferredTracerProviderBuilder { + /// + /// Gets the being constructed by the builder. + /// + /// + /// Note: should return until + /// construction has started and the has + /// closed. + /// TracerProvider? Provider { get; } + /// + /// Register a callback action to configure the where tracing services are configured. + /// + /// + /// Note: Tracing services are only available during the application + /// configuration phase. This method should throw a if services are configured after the + /// application has been created. + /// + /// Configuration callback. + /// The supplied for chaining. TracerProviderBuilder ConfigureServices(Action configure); + /// + /// Register a callback action to configure the once the application is available. + /// + /// Configuration callback. + /// The supplied for chaining. TracerProviderBuilder ConfigureBuilder(Action configure); } diff --git a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs index d436068e82d..a7c7a567fbd 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs @@ -49,6 +49,13 @@ public static TracerProviderBuilder AddInstrumentation(this TracerProviderBui return tracerProviderBuilder; } + /// + /// Adds instrumentation to the provider. + /// + /// Instrumentation type. + /// . + /// Instrumentation instance. + /// The supplied for chaining. public static TracerProviderBuilder AddInstrumentation(this TracerProviderBuilder tracerProviderBuilder, T instrumentation) where T : class { @@ -62,6 +69,13 @@ public static TracerProviderBuilder AddInstrumentation(this TracerProviderBui return tracerProviderBuilder; } + /// + /// Adds instrumentation to the provider. + /// + /// Instrumentation type. + /// . + /// Instrumentation factory. + /// The supplied for chaining. public static TracerProviderBuilder AddInstrumentation( this TracerProviderBuilder tracerProviderBuilder, Func instrumentationFactory) @@ -77,6 +91,13 @@ public static TracerProviderBuilder AddInstrumentation( return tracerProviderBuilder; } + /// + /// Adds instrumentation to the provider. + /// + /// Instrumentation type. + /// . + /// Instrumentation factory. + /// The supplied for chaining. public static TracerProviderBuilder AddInstrumentation( this TracerProviderBuilder tracerProviderBuilder, Func instrumentationFactory) diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs index a176eadcaf1..36f14160cd5 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs @@ -19,6 +19,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using OpenTelemetry.Internal; namespace OpenTelemetry.Metrics; @@ -36,6 +37,15 @@ public MeterProviderBuilderBase() sp => throw new NotSupportedException("Self-contained MeterProvider cannot be accessed using the application IServiceProvider call Build instead."))); } + internal static void RegisterMeterProvider(IServiceCollection services) + { + Guard.ThrowIfNull(services); + + services + .AddOpenTelemetryMeterProviderBuilderServices() + .TryAddSingleton(sp => new MeterProviderSdk(sp, ownsServiceProvider: false)); + } + internal MeterProvider InvokeBuild() => this.Build(); @@ -45,21 +55,28 @@ internal MeterProvider InvokeBuild() /// . protected MeterProvider Build() { - var services = this.Services; - - if (services == null) + ServiceProvider? serviceProvider = null; + try { - throw new NotSupportedException("MeterProviderBuilder build method cannot be called multiple times."); - } - - this.Services = null; - + this.ConfigureServices(services => + { #if DEBUG - bool validateScopes = true; + bool validateScopes = true; #else - bool validateScopes = false; + bool validateScopes = false; #endif - var serviceProvider = services.BuildServiceProvider(validateScopes); + serviceProvider = services.BuildServiceProvider(validateScopes); + }); + } + catch (NotSupportedException) + { + throw new NotSupportedException("MeterProviderBuilder build method cannot be called multiple times."); + } + + if (serviceProvider == null) + { + throw new InvalidOperationException("ServiceProvider could not be created for ServiceCollection."); + } return new MeterProviderSdk(serviceProvider, ownsServiceProvider: true); } diff --git a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs index 9ceca05b51d..a5595124d13 100644 --- a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs @@ -16,8 +16,6 @@ #nullable enable -using Microsoft.Extensions.DependencyInjection.Extensions; -using OpenTelemetry.Internal; using OpenTelemetry.Metrics; using OpenTelemetry.Trace; @@ -27,22 +25,14 @@ public static class OpenTelemetryServiceCollectionExtensions { public static IServiceCollection AddOpenTelemetryTracerProvider(this IServiceCollection services) { - Guard.ThrowIfNull(services); - - services - .AddOpenTelemetryTracerProviderBuilderServices() - .TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: false)); + TracerProviderBuilderBase.RegisterTracerProvider(services); return services; } public static IServiceCollection AddOpenTelemetryMeterProvider(this IServiceCollection services) { - Guard.ThrowIfNull(services); - - services - .AddOpenTelemetryMeterProviderBuilderServices() - .TryAddSingleton(sp => new MeterProviderSdk(sp, ownsServiceProvider: false)); + MeterProviderBuilderBase.RegisterMeterProvider(services); return services; } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index 3c1d2a7eaa9..46375fde431 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -37,6 +37,15 @@ public TracerProviderBuilderBase() sp => throw new NotSupportedException("Self-contained TracerProvider cannot be accessed using the application IServiceProvider call Build instead."))); } + internal static void RegisterTracerProvider(IServiceCollection services) + { + Guard.ThrowIfNull(services); + + services + .AddOpenTelemetryTracerProviderBuilderServices() + .TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: false)); + } + internal TracerProvider InvokeBuild() => this.Build(); @@ -74,21 +83,28 @@ protected TracerProviderBuilder AddInstrumentation( /// . protected TracerProvider Build() { - var services = this.Services; - - if (services == null) + ServiceProvider? serviceProvider = null; + try { - throw new NotSupportedException("TracerProviderBuilder build method cannot be called multiple times."); - } - - this.Services = null; - + this.ConfigureServices(services => + { #if DEBUG - bool validateScopes = true; + bool validateScopes = true; #else - bool validateScopes = false; + bool validateScopes = false; #endif - var serviceProvider = services.BuildServiceProvider(validateScopes); + serviceProvider = services.BuildServiceProvider(validateScopes); + }); + } + catch (NotSupportedException) + { + throw new NotSupportedException("TracerProviderBuilder build method cannot be called multiple times."); + } + + if (serviceProvider == null) + { + throw new InvalidOperationException("ServiceProvider could not be created for ServiceCollection."); + } return new TracerProviderSdk(serviceProvider, ownsServiceProvider: true); } From 535d8fea2a17a3c54c287aeb8ddcfdae8d589589 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 30 Nov 2022 13:38:08 -0800 Subject: [PATCH 07/48] More updates. --- ...ctionMetricsServiceCollectionExtensions.cs | 22 ++++--- ...ctionTracingServiceCollectionExtensions.cs | 23 ++++--- .../.publicApi/net462/PublicAPI.Unshipped.txt | 12 ---- .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 12 ---- .../netstandard2.0/PublicAPI.Unshipped.txt | 12 ---- .../netstandard2.1/PublicAPI.Unshipped.txt | 12 ---- ...penTelemetryServiceCollectionExtensions.cs | 61 +++++++++++++++++++ 7 files changed, 88 insertions(+), 66 deletions(-) diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs index 511382b7f7c..a8158ef7633 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs @@ -26,24 +26,28 @@ namespace Microsoft.Extensions.DependencyInjection; public static class OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions { /// - /// Configures OpenTelemetry Metrics services in the supplied . + /// Configures OpenTelemetry Metrics services in the supplied . /// /// /// Notes: /// - /// A will not be created automatically - /// using this method. Either use the - /// IServiceCollection.AddOpenTelemetryMetrics 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 /// . + /// A will not be created automatically + /// using this method. To begin collecting metrics either use the + /// IServiceCollection.AddOpenTelemetryMetrics extension in the + /// OpenTelemetry.Extensions.Hosting package or use the + /// IServiceCollection.AddOpenTelemetryMeterProvider extension in the + /// OpenTelemetry package and access the + /// through the application . /// /// - /// The to add services to. - /// The so that additional calls can be chained. + /// The to add + /// services to. + /// The so that additional calls + /// can be chained. public static IServiceCollection ConfigureOpenTelemetryMetrics(this IServiceCollection services) => ConfigureOpenTelemetryMetrics(services, (b) => { }); diff --git a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs index 384ea563257..e283203aacc 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs @@ -26,24 +26,29 @@ namespace Microsoft.Extensions.DependencyInjection; public static class OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions { /// - /// Configures OpenTelemetry tracing services in the supplied . + /// 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 /// . + /// A will not be created automatically + /// using this method. To begin collecting traces either use the + /// IServiceCollection.AddOpenTelemetryTracing extension in the + /// OpenTelemetry.Extensions.Hosting package or use the + /// IServiceCollection.AddOpenTelemetryTracerProvider extension in + /// the OpenTelemetry package and access the through the application . /// /// - /// The to add services to. - /// The so that additional calls can be chained. + /// The to add + /// services to. + /// The so that additional calls + /// can be chained. public static IServiceCollection ConfigureOpenTelemetryTracing(this IServiceCollection services) => ConfigureOpenTelemetryTracing(services, (b) => { }); diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index a5968754802..a46d76853a8 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -1,5 +1,3 @@ -Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions -Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -16,25 +14,15 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! -static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string? OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string! traceStateString) -> void OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable>? attributes, string? traceStateString) -> void *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! 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, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -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! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index a5968754802..a46d76853a8 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -1,5 +1,3 @@ -Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions -Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -16,25 +14,15 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! -static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string? OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string! traceStateString) -> void OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable>? attributes, string? traceStateString) -> void *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! 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, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -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! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index a5968754802..a46d76853a8 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,5 +1,3 @@ -Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions -Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -16,25 +14,15 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! -static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string? OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string! traceStateString) -> void OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable>? attributes, string? traceStateString) -> void *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! 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, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -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! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index a5968754802..a46d76853a8 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -1,5 +1,3 @@ -Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions -Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -16,25 +14,15 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! -static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.MeterProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string? OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string! traceStateString) -> void OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable>? attributes, string? traceStateString) -> void *REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder! 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, System.Action? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! -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! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType diff --git a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs index a5595124d13..52d8225b032 100644 --- a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs @@ -21,8 +21,40 @@ namespace Microsoft.Extensions.DependencyInjection; +/// +/// Contains extension methods for registering OpenTelemetry SDK artifacts. +/// public static class OpenTelemetryServiceCollectionExtensions { + /// + /// Adds the OpenTelemetry SDK implementation + /// into the supplied . + /// + /// + /// Notes: + /// + /// + /// This is safe to be called multiple times. Only a single will be created for a given . + /// + /// + /// This method is provided to support hosting infrastructure and is not + /// typically called by users. + /// + /// Application authors should call the + /// IServiceCollection.AddOpenTelemetryTracing extension in the + /// OpenTelemetry.Extensions.Hosting package. + /// Library authors should call the + /// extension. + /// + /// + /// + /// + /// . + /// Returns the supplied for call + /// chaining. public static IServiceCollection AddOpenTelemetryTracerProvider(this IServiceCollection services) { TracerProviderBuilderBase.RegisterTracerProvider(services); @@ -30,6 +62,35 @@ public static IServiceCollection AddOpenTelemetryTracerProvider(this IServiceCol return services; } + /// + /// Adds the OpenTelemetry SDK implementation + /// into the supplied . + /// + /// + /// Notes: + /// + /// + /// This is safe to be called multiple times. Only a single will be created for a given . + /// + /// + /// This method is provided to support hosting infrastructure and is not + /// typically called by users. + /// + /// Application authors should call the + /// IServiceCollection.AddOpenTelemetryMetrics extension in the + /// OpenTelemetry.Extensions.Hosting package. + /// Library authors should call the + /// extension. + /// + /// + /// + /// + /// . + /// Returns the supplied for call + /// chaining. public static IServiceCollection AddOpenTelemetryMeterProvider(this IServiceCollection services) { MeterProviderBuilderBase.RegisterMeterProvider(services); From a735a53fc53f2988df5b21725c46974bb5aa0475 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 30 Nov 2022 13:58:35 -0800 Subject: [PATCH 08/48] More cleanup. --- src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt | 3 +++ src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt | 3 +++ .../.publicApi/netstandard2.0/PublicAPI.Unshipped.txt | 3 +++ .../.publicApi/netstandard2.1/PublicAPI.Unshipped.txt | 3 +++ src/OpenTelemetry/Metrics/MeterProviderSdk.cs | 4 ++-- src/OpenTelemetry/Trace/TracerProviderSdk.cs | 6 +++--- 6 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index a46d76853a8..357e2bee58a 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -1,3 +1,4 @@ +Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -14,6 +15,8 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryMeterProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryTracerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! 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 a46d76853a8..357e2bee58a 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.OpenTelemetryServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -14,6 +15,8 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryMeterProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryTracerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! 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 a46d76853a8..357e2bee58a 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.OpenTelemetryServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -14,6 +15,8 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryMeterProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryTracerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! 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 a46d76853a8..357e2bee58a 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.OpenTelemetryServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -14,6 +15,8 @@ OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, out double max) -> bool OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryMeterProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryTracerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! 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/Metrics/MeterProviderSdk.cs b/src/OpenTelemetry/Metrics/MeterProviderSdk.cs index 208b7bc0a39..39a5868030b 100644 --- a/src/OpenTelemetry/Metrics/MeterProviderSdk.cs +++ b/src/OpenTelemetry/Metrics/MeterProviderSdk.cs @@ -61,10 +61,10 @@ internal MeterProviderSdk( OpenTelemetrySdkEventSource.Log.MeterProviderSdkEvent("Building MeterProvider."); - var configureProviderBuilders = serviceProvider.GetServices(); + var configureProviderBuilders = serviceProvider!.GetServices(); foreach (var configureProviderBuilder in configureProviderBuilders) { - configureProviderBuilder.ConfigureBuilder(serviceProvider, state); + configureProviderBuilder.ConfigureBuilder(serviceProvider!, state); } StringBuilder exportersAdded = new StringBuilder(); diff --git a/src/OpenTelemetry/Trace/TracerProviderSdk.cs b/src/OpenTelemetry/Trace/TracerProviderSdk.cs index 8a69b4d8a21..5e54e4ad50b 100644 --- a/src/OpenTelemetry/Trace/TracerProviderSdk.cs +++ b/src/OpenTelemetry/Trace/TracerProviderSdk.cs @@ -48,7 +48,7 @@ internal TracerProviderSdk( { Debug.Assert(serviceProvider != null, "serviceProvider was null"); - var state = serviceProvider.GetRequiredService(); + var state = serviceProvider!.GetRequiredService(); state.RegisterProvider(this); this.ServiceProvider = serviceProvider!; @@ -61,10 +61,10 @@ internal TracerProviderSdk( OpenTelemetrySdkEventSource.Log.TracerProviderSdkEvent("Building TracerProvider."); - var configureProviderBuilders = serviceProvider.GetServices(); + var configureProviderBuilders = serviceProvider!.GetServices(); foreach (var configureProviderBuilder in configureProviderBuilders) { - configureProviderBuilder.ConfigureBuilder(serviceProvider, state); + configureProviderBuilder.ConfigureBuilder(serviceProvider!, state); } StringBuilder processorsAdded = new StringBuilder(); From d2f237cb531ca979e1699aff541b5a2e49e9e2e8 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Wed, 30 Nov 2022 14:01:43 -0800 Subject: [PATCH 09/48] API updates. --- src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt | 5 +++++ src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt | 5 +++++ .../.publicApi/netstandard2.0/PublicAPI.Unshipped.txt | 5 +++++ .../.publicApi/netstandard2.1/PublicAPI.Unshipped.txt | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index 357e2bee58a..8a4efed0980 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -30,3 +30,8 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(th static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType +*REMOVED*~override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +*REMOVED*override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! +*REMOVED*~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index 357e2bee58a..8a4efed0980 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -30,3 +30,8 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(th static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType +*REMOVED*~override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +*REMOVED*override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! +*REMOVED*~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 357e2bee58a..8a4efed0980 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -30,3 +30,8 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(th static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType +*REMOVED*~override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +*REMOVED*override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! +*REMOVED*~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index 357e2bee58a..8a4efed0980 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -30,3 +30,8 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(th static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType +*REMOVED*~override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +*REMOVED*override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! +*REMOVED*~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! From 119514d28ae98ed563c37c2ecc0879d87a455b79 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 1 Dec 2022 12:16:47 -0800 Subject: [PATCH 10/48] Namespace tweaks. --- .../.publicApi/net462/PublicAPI.Unshipped.txt | 26 +++++++++---------- .../netstandard2.0/PublicAPI.Unshipped.txt | 26 +++++++++---------- .../Metrics/DeferredMeterProviderBuilder.cs | 4 +-- .../Trace/DeferredTracerProviderBuilder.cs | 4 +-- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt index 7340d69d9fe..5200a6355ed 100644 --- a/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt @@ -1,13 +1,9 @@ -Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder -Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.DeferredMeterProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void -Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder -Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.DeferredTracerProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions +OpenTelemetry.Metrics.DeferredMeterProviderBuilder +OpenTelemetry.Metrics.DeferredMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.DeferredMeterProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.DeferredMeterProviderBuilder.DeferredMeterProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void OpenTelemetry.Metrics.IConfigureMeterProviderBuilder OpenTelemetry.Metrics.IConfigureMeterProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> void OpenTelemetry.Metrics.IMeterProviderBuilder @@ -15,6 +11,10 @@ OpenTelemetry.Metrics.IMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Metrics.IMeterProviderBuilder.Provider.get -> OpenTelemetry.Metrics.MeterProvider? OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions +OpenTelemetry.Trace.DeferredTracerProviderBuilder +OpenTelemetry.Trace.DeferredTracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.DeferredTracerProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.DeferredTracerProviderBuilder.DeferredTracerProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void OpenTelemetry.Trace.IConfigureTracerProviderBuilder OpenTelemetry.Trace.IConfigureTracerProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> void OpenTelemetry.Trace.ITracerProviderBuilder @@ -22,9 +22,9 @@ OpenTelemetry.Trace.ITracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Trace.ITracerProviderBuilder.Provider.get -> OpenTelemetry.Trace.TracerProvider? OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions -override Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! -override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! -override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Metrics.DeferredMeterProviderBuilder.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! +override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! @@ -41,5 +41,5 @@ static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilder static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, T! instrumentation) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -~override Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -~override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +~override OpenTelemetry.Metrics.DeferredMeterProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +~override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 7340d69d9fe..5200a6355ed 100644 --- a/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,13 +1,9 @@ -Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder -Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.DeferredMeterProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void -Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder -Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.DeferredTracerProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions +OpenTelemetry.Metrics.DeferredMeterProviderBuilder +OpenTelemetry.Metrics.DeferredMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.DeferredMeterProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.DeferredMeterProviderBuilder.DeferredMeterProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void OpenTelemetry.Metrics.IConfigureMeterProviderBuilder OpenTelemetry.Metrics.IConfigureMeterProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> void OpenTelemetry.Metrics.IMeterProviderBuilder @@ -15,6 +11,10 @@ OpenTelemetry.Metrics.IMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Metrics.IMeterProviderBuilder.Provider.get -> OpenTelemetry.Metrics.MeterProvider? OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions +OpenTelemetry.Trace.DeferredTracerProviderBuilder +OpenTelemetry.Trace.DeferredTracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.DeferredTracerProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.DeferredTracerProviderBuilder.DeferredTracerProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void OpenTelemetry.Trace.IConfigureTracerProviderBuilder OpenTelemetry.Trace.IConfigureTracerProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> void OpenTelemetry.Trace.ITracerProviderBuilder @@ -22,9 +22,9 @@ OpenTelemetry.Trace.ITracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Trace.ITracerProviderBuilder.Provider.get -> OpenTelemetry.Trace.TracerProvider? OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions -override Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! -override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! -override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Metrics.DeferredMeterProviderBuilder.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! +override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! +override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! @@ -41,5 +41,5 @@ static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilder static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, T! instrumentation) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -~override Microsoft.Extensions.DependencyInjection.DeferredMeterProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -~override Microsoft.Extensions.DependencyInjection.DeferredTracerProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +~override OpenTelemetry.Metrics.DeferredMeterProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! +~override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs index 8dbd6211742..657a7541fcf 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs @@ -15,10 +15,10 @@ // using System; +using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; -using OpenTelemetry.Metrics; -namespace Microsoft.Extensions.DependencyInjection; +namespace OpenTelemetry.Metrics; /// /// A implementation which registers build diff --git a/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs index 31eb8ec7b03..11162975bdc 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs @@ -15,10 +15,10 @@ // using System; +using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; -using OpenTelemetry.Trace; -namespace Microsoft.Extensions.DependencyInjection; +namespace OpenTelemetry.Trace; /// /// A implementation which registers build From cde467970fa0244ae24c145ecbea33ce690bb7b6 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 1 Dec 2022 16:43:58 -0800 Subject: [PATCH 11/48] Refactoring and API changes. --- examples/AspNetCore/Program.cs | 173 ++++++++------- examples/AspNetCore/appsettings.json | 12 +- .../.publicApi/net462/PublicAPI.Unshipped.txt | 23 +- .../netstandard2.0/PublicAPI.Unshipped.txt | 23 +- .../Metrics/DeferredMeterProviderBuilder.cs | 136 ------------ ...ctionMetricsServiceCollectionExtensions.cs | 58 +++-- .../Trace/DeferredTracerProviderBuilder.cs | 149 ------------- ...ctionTracingServiceCollectionExtensions.cs | 59 ++--- .../netstandard2.0/PublicAPI.Unshipped.txt | 2 + .../OpenTelemetryBuilderHostingExtensions.cs | 53 +++++ .../OpenTelemetryServicesExtensions.cs | 203 +++++++++--------- .../.publicApi/net462/PublicAPI.Unshipped.txt | 19 +- .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 19 +- .../netstandard2.0/PublicAPI.Unshipped.txt | 19 +- .../netstandard2.1/PublicAPI.Unshipped.txt | 19 +- .../Builder/MeterProviderBuilderBase.cs | 121 +++++++++-- src/OpenTelemetry/OpenTelemetryBuilder.cs | 99 +++++++++ ...penTelemetryServiceCollectionExtensions.cs | 78 +------ .../Builder/TracerProviderBuilderBase.cs | 136 ++++++++++-- 19 files changed, 683 insertions(+), 718 deletions(-) delete mode 100644 src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs delete mode 100644 src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs create mode 100644 src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs create mode 100644 src/OpenTelemetry/OpenTelemetryBuilder.cs diff --git a/examples/AspNetCore/Program.cs b/examples/AspNetCore/Program.cs index e070011daa7..5f2f509fea4 100644 --- a/examples/AspNetCore/Program.cs +++ b/examples/AspNetCore/Program.cs @@ -15,6 +15,7 @@ // using System.Reflection; +using OpenTelemetry; using OpenTelemetry.Exporter; using OpenTelemetry.Instrumentation.AspNetCore; using OpenTelemetry.Logs; @@ -22,118 +23,116 @@ using OpenTelemetry.Resources; using OpenTelemetry.Trace; -var builder = WebApplication.CreateBuilder(args); +var appBuilder = WebApplication.CreateBuilder(args); // OpenTelemetry var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "unknown"; // Switch between Zipkin/Jaeger/OTLP/Console by setting UseTracingExporter in appsettings.json. -var tracingExporter = builder.Configuration.GetValue("UseTracingExporter").ToLowerInvariant(); +var tracingExporter = appBuilder.Configuration.GetValue("UseTracingExporter").ToLowerInvariant(); -var serviceName = tracingExporter switch -{ - "jaeger" => builder.Configuration.GetValue("Jaeger:ServiceName"), - "zipkin" => builder.Configuration.GetValue("Zipkin:ServiceName"), - "otlp" => builder.Configuration.GetValue("Otlp:ServiceName"), - _ => "AspNetCoreExampleService", -}; - -Action configureResource = r => r.AddService( - serviceName, serviceVersion: assemblyVersion, serviceInstanceId: Environment.MachineName); +// Note: Switch between Prometheus/OTLP/Console by setting UseMetricsExporter in appsettings.json. +var metricsExporter = appBuilder.Configuration.GetValue("UseMetricsExporter").ToLowerInvariant(); -// Traces -builder.Services.AddOpenTelemetryTracing(options => -{ - options - .ConfigureResource(configureResource) - .SetSampler(new AlwaysOnSampler()) - .AddHttpClientInstrumentation() - .AddAspNetCoreInstrumentation(); +// Switch between Console/OTLP by setting UseLogExporter in appsettings.json. +var logExporter = appBuilder.Configuration.GetValue("UseLogExporter").ToLowerInvariant(); - switch (tracingExporter) - { - case "jaeger": - options.AddJaegerExporter(); +// For options which can be bound from IConfiguration. +appBuilder.Services.Configure(appBuilder.Configuration.GetSection("AspNetCoreInstrumentation")); - builder.Services.Configure(builder.Configuration.GetSection("Jaeger")); +Action configureResource = r => r.AddService( + serviceName: appBuilder.Configuration.GetValue("ServiceName"), + serviceVersion: assemblyVersion, + serviceInstanceId: Environment.MachineName); - // Customize the HttpClient that will be used when JaegerExporter is configured for HTTP transport. - builder.Services.AddHttpClient("JaegerExporter", configureClient: (client) => client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value")); - break; +appBuilder.Services.AddOpenTelemetry() + .ConfigureResource(configureResource) + .WithTracing(builder => + { + // Traces - case "zipkin": - options.AddZipkinExporter(); + builder + .SetSampler(new AlwaysOnSampler()) + .AddHttpClientInstrumentation() + .AddAspNetCoreInstrumentation(); - builder.Services.Configure(builder.Configuration.GetSection("Zipkin")); - break; + switch (tracingExporter) + { + case "jaeger": + builder.AddJaegerExporter(); - case "otlp": - options.AddOtlpExporter(otlpOptions => + builder.ConfigureServices(services => { - otlpOptions.Endpoint = new Uri(builder.Configuration.GetValue("Otlp:Endpoint")); + services.Configure(appBuilder.Configuration.GetSection("Jaeger")); + + // Customize the HttpClient that will be used when JaegerExporter is configured for HTTP transport. + services.AddHttpClient("JaegerExporter", configureClient: (client) => client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value")); }); - break; + break; - default: - options.AddConsoleExporter(); + case "zipkin": + builder.AddZipkinExporter(); - break; - } -}); + builder.ConfigureServices(services => + { + services.Configure(appBuilder.Configuration.GetSection("Zipkin")); + }); + break; -// For options which can be bound from IConfiguration. -builder.Services.Configure(builder.Configuration.GetSection("AspNetCoreInstrumentation")); + case "otlp": + builder.AddOtlpExporter(otlpOptions => + { + otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint")); + }); + break; + + default: + builder.AddConsoleExporter(); + break; + } + }) + .WithMetrics(builder => + { + // Metrics + + builder + .AddRuntimeInstrumentation() + .AddHttpClientInstrumentation() + .AddAspNetCoreInstrumentation(); + + switch (metricsExporter) + { + case "prometheus": + builder.AddPrometheusExporter(); + break; + case "otlp": + builder.AddOtlpExporter(otlpOptions => + { + otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint")); + }); + break; + default: + builder.AddConsoleExporter(); + break; + } + }) + .StartWithHost(); // Logging -builder.Logging.ClearProviders(); +appBuilder.Logging.ClearProviders(); -builder.Logging.AddOpenTelemetry(options => +appBuilder.Logging.AddOpenTelemetry(options => { + // Note: See appsettings.json Logging:OpenTelemetry section for configuration. + options.ConfigureResource(configureResource); - // Switch between Console/OTLP by setting UseLogExporter in appsettings.json. - var logExporter = builder.Configuration.GetValue("UseLogExporter").ToLowerInvariant(); switch (logExporter) { case "otlp": options.AddOtlpExporter(otlpOptions => { - otlpOptions.Endpoint = new Uri(builder.Configuration.GetValue("Otlp:Endpoint")); - }); - break; - default: - options.AddConsoleExporter(); - break; - } -}); - -builder.Services.Configure(opt => -{ - opt.IncludeScopes = true; - opt.ParseStateValues = true; - opt.IncludeFormattedMessage = true; -}); - -// Metrics -// Switch between Prometheus/OTLP/Console by setting UseMetricsExporter in appsettings.json. -var metricsExporter = builder.Configuration.GetValue("UseMetricsExporter").ToLowerInvariant(); - -builder.Services.AddOpenTelemetryMetrics(options => -{ - options.ConfigureResource(configureResource) - .AddRuntimeInstrumentation() - .AddHttpClientInstrumentation() - .AddAspNetCoreInstrumentation(); - - switch (metricsExporter) - { - case "prometheus": - options.AddPrometheusExporter(); - break; - case "otlp": - options.AddOtlpExporter(otlpOptions => - { - otlpOptions.Endpoint = new Uri(builder.Configuration.GetValue("Otlp:Endpoint")); + otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint")); }); break; default: @@ -143,14 +142,14 @@ }); // Add services to the container. -builder.Services.AddControllers(); +appBuilder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle -builder.Services.AddEndpointsApiExplorer(); +appBuilder.Services.AddEndpointsApiExplorer(); -builder.Services.AddSwaggerGen(); +appBuilder.Services.AddSwaggerGen(); -var app = builder.Build(); +var app = appBuilder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) diff --git a/examples/AspNetCore/appsettings.json b/examples/AspNetCore/appsettings.json index 10f9feba43f..b6756e818df 100644 --- a/examples/AspNetCore/appsettings.json +++ b/examples/AspNetCore/appsettings.json @@ -1,27 +1,29 @@ { "Logging": { "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" + "Default": "Information" + }, + "OpenTelemetry": { + "IncludeFormattedMessage": true, + "IncludeScopes": true, + "ParseStateValues": true } }, + "ServiceName": "otel-test", "AllowedHosts": "*", "UseTracingExporter": "console", "UseMetricsExporter": "console", "UseLogExporter": "console", "Jaeger": { - "ServiceName": "jaeger-test", "AgentHost": "localhost", "AgentPort": 6831, "Endpoint": "http://localhost:14268", "Protocol": "UdpCompactThrift" }, "Zipkin": { - "ServiceName": "zipkin-test", "Endpoint": "http://localhost:9411/api/v2/spans" }, "Otlp": { - "ServiceName": "otlp-test", "Endpoint": "http://localhost:4317" }, "AspNetCoreInstrumentation": { diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt index 5200a6355ed..61fd6da1fd8 100644 --- a/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt @@ -1,9 +1,3 @@ -Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions -Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions -OpenTelemetry.Metrics.DeferredMeterProviderBuilder -OpenTelemetry.Metrics.DeferredMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -OpenTelemetry.Metrics.DeferredMeterProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -OpenTelemetry.Metrics.DeferredMeterProviderBuilder.DeferredMeterProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void OpenTelemetry.Metrics.IConfigureMeterProviderBuilder OpenTelemetry.Metrics.IConfigureMeterProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> void OpenTelemetry.Metrics.IMeterProviderBuilder @@ -11,10 +5,7 @@ OpenTelemetry.Metrics.IMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Metrics.IMeterProviderBuilder.Provider.get -> OpenTelemetry.Metrics.MeterProvider? OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions -OpenTelemetry.Trace.DeferredTracerProviderBuilder -OpenTelemetry.Trace.DeferredTracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -OpenTelemetry.Trace.DeferredTracerProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -OpenTelemetry.Trace.DeferredTracerProviderBuilder.DeferredTracerProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void +OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions OpenTelemetry.Trace.IConfigureTracerProviderBuilder OpenTelemetry.Trace.IConfigureTracerProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> void OpenTelemetry.Trace.ITracerProviderBuilder @@ -22,24 +13,18 @@ OpenTelemetry.Trace.ITracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Trace.ITracerProviderBuilder.Provider.get -> OpenTelemetry.Trace.TracerProvider? OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions -override OpenTelemetry.Metrics.DeferredMeterProviderBuilder.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! -override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! -override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, T! instrumentation) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMeterProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, T! instrumentation) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -~override OpenTelemetry.Metrics.DeferredMeterProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -~override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 5200a6355ed..61fd6da1fd8 100644 --- a/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,9 +1,3 @@ -Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions -Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions -OpenTelemetry.Metrics.DeferredMeterProviderBuilder -OpenTelemetry.Metrics.DeferredMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -OpenTelemetry.Metrics.DeferredMeterProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! -OpenTelemetry.Metrics.DeferredMeterProviderBuilder.DeferredMeterProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void OpenTelemetry.Metrics.IConfigureMeterProviderBuilder OpenTelemetry.Metrics.IConfigureMeterProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> void OpenTelemetry.Metrics.IMeterProviderBuilder @@ -11,10 +5,7 @@ OpenTelemetry.Metrics.IMeterProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! OpenTelemetry.Metrics.IMeterProviderBuilder.Provider.get -> OpenTelemetry.Metrics.MeterProvider? OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions -OpenTelemetry.Trace.DeferredTracerProviderBuilder -OpenTelemetry.Trace.DeferredTracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -OpenTelemetry.Trace.DeferredTracerProviderBuilder.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -OpenTelemetry.Trace.DeferredTracerProviderBuilder.DeferredTracerProviderBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void +OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions OpenTelemetry.Trace.IConfigureTracerProviderBuilder OpenTelemetry.Trace.IConfigureTracerProviderBuilder.ConfigureBuilder(System.IServiceProvider! serviceProvider, OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> void OpenTelemetry.Trace.ITracerProviderBuilder @@ -22,24 +13,18 @@ OpenTelemetry.Trace.ITracerProviderBuilder.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Trace.ITracerProviderBuilder.Provider.get -> OpenTelemetry.Trace.TracerProvider? OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions -override OpenTelemetry.Metrics.DeferredMeterProviderBuilder.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! -override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! -override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMetrics(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, T! instrumentation) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +static OpenTelemetry.Metrics.OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.ConfigureOpenTelemetryMeterProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.AddInstrumentation(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, T! instrumentation) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! -~override OpenTelemetry.Metrics.DeferredMeterProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -~override OpenTelemetry.Trace.DeferredTracerProviderBuilder.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! +static OpenTelemetry.Trace.OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.ConfigureOpenTelemetryTracerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs deleted file mode 100644 index 657a7541fcf..00000000000 --- a/src/OpenTelemetry.DependencyInjection/Metrics/DeferredMeterProviderBuilder.cs +++ /dev/null @@ -1,136 +0,0 @@ -// -// Copyright The OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -using System; -using Microsoft.Extensions.DependencyInjection; -using OpenTelemetry.Internal; - -namespace OpenTelemetry.Metrics; - -/// -/// A implementation which registers build -/// actions as instances into an -/// . The build actions should be retrieved -/// using the final application and applied to -/// construct a . -/// -public class DeferredMeterProviderBuilder : MeterProviderBuilder, IMeterProviderBuilder -{ - private IServiceCollection? services; - - /// - /// Initializes a new instance of the class. - /// - /// . - public DeferredMeterProviderBuilder(IServiceCollection services) - { - Guard.ThrowIfNull(services); - - this.services = services; - - RegisterBuildAction(services, (sp, builder) => this.services = null); - } - - /// - MeterProvider? IMeterProviderBuilder.Provider => null; - - /// - public override MeterProviderBuilder AddInstrumentation(Func instrumentationFactory) - { - Guard.ThrowIfNull(instrumentationFactory); - - this.ConfigureBuilder((sp, builder) => - { - builder.AddInstrumentation(instrumentationFactory); - }); - - return this; - } - - /// - public override MeterProviderBuilder AddMeter(params string[] names) - { - Guard.ThrowIfNull(names); - - this.ConfigureBuilder((sp, builder) => - { - builder.AddMeter(names); - }); - - return this; - } - - /// - public MeterProviderBuilder ConfigureBuilder(Action configure) - { - var services = this.services; - - if (services == null) - { - throw new NotSupportedException("Builder cannot be configured during MeterProvider construction."); - } - - RegisterBuildAction(services, configure); - - return this; - } - - /// - public MeterProviderBuilder ConfigureServices(Action configure) - { - Guard.ThrowIfNull(configure); - - var services = this.services; - - if (services == null) - { - throw new NotSupportedException("Services cannot be configured during MeterProvider construction."); - } - - configure((IServiceCollection)services); - - return this; - } - - /// - MeterProviderBuilder IDeferredMeterProviderBuilder.Configure(Action configure) - => this.ConfigureBuilder(configure); - - private static void RegisterBuildAction(IServiceCollection services, Action configure) - { - Guard.ThrowIfNull(configure); - - services.AddSingleton( - new ConfigureMeterProviderBuilderCallbackWrapper(configure)); - } - - private sealed class ConfigureMeterProviderBuilderCallbackWrapper : IConfigureMeterProviderBuilder - { - private readonly Action configure; - - public ConfigureMeterProviderBuilderCallbackWrapper(Action configure) - { - Guard.ThrowIfNull(configure); - - this.configure = configure; - } - - public void ConfigureBuilder(IServiceProvider serviceProvider, MeterProviderBuilder meterProviderBuilder) - { - this.configure(serviceProvider, meterProviderBuilder); - } - } -} diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs index a8158ef7633..d86d711300c 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs @@ -15,10 +15,10 @@ // using System; +using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; -using OpenTelemetry.Metrics; -namespace Microsoft.Extensions.DependencyInjection; +namespace OpenTelemetry.Metrics; /// /// Extension methods for setting up OpenTelemetry Metrics services in an . @@ -26,8 +26,10 @@ namespace Microsoft.Extensions.DependencyInjection; public static class OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions { /// - /// Configures OpenTelemetry Metrics services in the supplied . + /// Registers an action used to configure the OpenTelemetry used to create the for the being + /// configured. /// /// /// Notes: @@ -36,37 +38,47 @@ public static class OpenTelemetryDependencyInjectionMetricsServiceCollectionExte /// Only a single will be created for a given /// . /// A will not be created automatically - /// using this method. To begin collecting metrics either use the - /// IServiceCollection.AddOpenTelemetryMetrics extension in the - /// OpenTelemetry.Extensions.Hosting package or use the - /// IServiceCollection.AddOpenTelemetryMeterProvider extension in the - /// OpenTelemetry package and access the - /// through the application . + /// using this method. To begin collecting metrics TBD. /// /// /// The to add /// services to. + /// Callback action to configure the . /// The so that additional calls /// can be chained. - public static IServiceCollection ConfigureOpenTelemetryMetrics(this IServiceCollection services) - => ConfigureOpenTelemetryMetrics(services, (b) => { }); + public static IServiceCollection ConfigureOpenTelemetryMeterProvider( + this IServiceCollection services, + Action configure) + { + RegisterBuildAction(services, configure); - /// - /// Configures OpenTelemetry Metrics 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 ConfigureOpenTelemetryMetrics(this IServiceCollection services, Action configure) + return services; + } + + private static void RegisterBuildAction(IServiceCollection services, Action configure) { Guard.ThrowIfNull(services); Guard.ThrowIfNull(configure); - var builder = new DeferredMeterProviderBuilder(services); + services.AddSingleton( + new ConfigureMeterProviderBuilderCallbackWrapper(configure)); + } - configure(builder); + private sealed class ConfigureMeterProviderBuilderCallbackWrapper : IConfigureMeterProviderBuilder + { + private readonly Action configure; - return services; + public ConfigureMeterProviderBuilderCallbackWrapper(Action configure) + { + Guard.ThrowIfNull(configure); + + this.configure = configure; + } + + public void ConfigureBuilder(IServiceProvider serviceProvider, MeterProviderBuilder meterProviderBuilder) + { + this.configure(serviceProvider, meterProviderBuilder); + } } } diff --git a/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs deleted file mode 100644 index 11162975bdc..00000000000 --- a/src/OpenTelemetry.DependencyInjection/Trace/DeferredTracerProviderBuilder.cs +++ /dev/null @@ -1,149 +0,0 @@ -// -// Copyright The OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -using System; -using Microsoft.Extensions.DependencyInjection; -using OpenTelemetry.Internal; - -namespace OpenTelemetry.Trace; - -/// -/// A implementation which registers build -/// actions as instances into an -/// . The build actions should be retrieved -/// using the final application and applied to -/// construct a . -/// -public class DeferredTracerProviderBuilder : TracerProviderBuilder, ITracerProviderBuilder -{ - private IServiceCollection? services; - - /// - /// Initializes a new instance of the class. - /// - /// . - public DeferredTracerProviderBuilder(IServiceCollection services) - { - Guard.ThrowIfNull(services); - - this.services = services; - - RegisterBuildAction(services, (sp, builder) => this.services = null); - } - - /// - TracerProvider? ITracerProviderBuilder.Provider => null; - - /// - public override TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) - { - Guard.ThrowIfNull(instrumentationFactory); - - this.ConfigureBuilder((sp, builder) => - { - builder.AddInstrumentation(instrumentationFactory); - }); - - return this; - } - - /// - public override TracerProviderBuilder AddSource(params string[] names) - { - Guard.ThrowIfNull(names); - - this.ConfigureBuilder((sp, builder) => - { - builder.AddSource(names); - }); - - return this; - } - - /// - public override TracerProviderBuilder AddLegacySource(string operationName) - { - Guard.ThrowIfNullOrWhitespace(operationName); - - this.ConfigureBuilder((sp, builder) => - { - builder.AddLegacySource(operationName); - }); - - return this; - } - - /// - public TracerProviderBuilder ConfigureBuilder(Action configure) - { - var services = this.services; - - if (services == null) - { - throw new NotSupportedException("Builder cannot be configured during TracerProvider construction."); - } - - RegisterBuildAction(services, configure); - - return this; - } - - /// - public TracerProviderBuilder ConfigureServices(Action configure) - { - Guard.ThrowIfNull(configure); - - var services = this.services; - - if (services == null) - { - throw new NotSupportedException("Services cannot be configured during TracerProvider construction."); - } - - configure(services); - - return this; - } - - /// - TracerProviderBuilder IDeferredTracerProviderBuilder.Configure(Action configure) - => this.ConfigureBuilder(configure); - - private static void RegisterBuildAction(IServiceCollection services, Action configure) - { - Guard.ThrowIfNull(configure); - - services.AddSingleton( - new ConfigureTracerProviderBuilderCallbackWrapper(configure)); - } - - private sealed class ConfigureTracerProviderBuilderCallbackWrapper : IConfigureTracerProviderBuilder - { - private readonly Action configure; - - public ConfigureTracerProviderBuilderCallbackWrapper(Action configure) - { - Guard.ThrowIfNull(configure); - - this.configure = configure; - } - - public void ConfigureBuilder(IServiceProvider serviceProvider, TracerProviderBuilder tracerProviderBuilder) - { - this.configure(serviceProvider, tracerProviderBuilder); - } - } -} diff --git a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs index e283203aacc..c2fc81bc6ca 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs @@ -15,10 +15,10 @@ // using System; +using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; -using OpenTelemetry.Trace; -namespace Microsoft.Extensions.DependencyInjection; +namespace OpenTelemetry.Trace; /// /// Extension methods for setting up OpenTelemetry tracing services in an . @@ -26,8 +26,10 @@ namespace Microsoft.Extensions.DependencyInjection; public static class OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions { /// - /// Configures OpenTelemetry tracing services in the supplied . + /// Registers an action used to configure the OpenTelemetry used to create the for the being + /// configured. /// /// /// Notes: @@ -36,38 +38,47 @@ public static class OpenTelemetryDependencyInjectionTracingServiceCollectionExte /// Only a single will be created for a given /// . /// A will not be created automatically - /// using this method. To begin collecting traces either use the - /// IServiceCollection.AddOpenTelemetryTracing extension in the - /// OpenTelemetry.Extensions.Hosting package or use the - /// IServiceCollection.AddOpenTelemetryTracerProvider extension in - /// the OpenTelemetry package and access the through the application . + /// using this method. To begin collecting traces TBD. /// /// /// 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) - => ConfigureOpenTelemetryTracing(services, (b) => { }); + public static IServiceCollection ConfigureOpenTelemetryTracerProvider( + this IServiceCollection services, + Action configure) + { + RegisterBuildAction(services, configure); - /// - /// 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) + return services; + } + + private static void RegisterBuildAction(IServiceCollection services, Action configure) { Guard.ThrowIfNull(services); Guard.ThrowIfNull(configure); - var builder = new DeferredTracerProviderBuilder(services); + services.AddSingleton( + new ConfigureTracerProviderBuilderCallbackWrapper(configure)); + } - configure(builder); + private sealed class ConfigureTracerProviderBuilderCallbackWrapper : IConfigureTracerProviderBuilder + { + private readonly Action configure; - return services; + public ConfigureTracerProviderBuilderCallbackWrapper(Action configure) + { + Guard.ThrowIfNull(configure); + + this.configure = configure; + } + + public void ConfigureBuilder(IServiceProvider serviceProvider, TracerProviderBuilder tracerProviderBuilder) + { + this.configure(serviceProvider, tracerProviderBuilder); + } } } 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 63141a61d05..dbee0f5b37d 100644 --- a/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Extensions.Hosting/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,5 +1,6 @@ Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions OpenTelemetry.Metrics.MeterProviderBuilderExtensions +OpenTelemetry.OpenTelemetryBuilderHostingExtensions 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 @@ -7,5 +8,6 @@ static Microsoft.Extensions.DependencyInjection.OpenTelemetryServicesExtensions. 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 diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs new file mode 100644 index 00000000000..be9f4eb1df8 --- /dev/null +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs @@ -0,0 +1,53 @@ +// +// 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 . + /// + /// + /// This is safe to be called multiple times. Only a single will be created for a given . + /// + /// . + /// 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 7ce40d153bf..5e180b533cc 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryServicesExtensions.cs @@ -15,125 +15,114 @@ // using System; -using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Hosting; -using OpenTelemetry.Extensions.Hosting.Implementation; -using OpenTelemetry.Internal; +using OpenTelemetry; using OpenTelemetry.Metrics; using OpenTelemetry.Trace; -namespace Microsoft.Extensions.DependencyInjection +namespace Microsoft.Extensions.DependencyInjection; + +/// +/// Extension methods for setting up OpenTelemetry services in an . +/// +public static class OpenTelemetryServicesExtensions { /// - /// Extension methods for setting up OpenTelemetry services in an + /// to automatically start tracing services in the supplied . /// - public static class OpenTelemetryServicesExtensions - { - /// - /// Configure OpenTelemetry and register a - /// to automatically start tracing services in the supplied . - /// - /// - /// Notes: - /// - /// - /// This is safe to be called multiple times. Only a single will be created for a given . - /// - /// - /// This method should be called by application host code. Library - /// authors should call - /// instead. - /// - /// - /// - /// . - /// Supplied for chaining - /// calls. - public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) - => AddOpenTelemetryTracing(services, b => { }); - - /// - /// Configure OpenTelemetry and register a - /// to automatically start tracing services in the supplied . - /// - /// - /// . - /// Callback action to configure the . - /// Supplied for chaining - /// calls. - public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action configure) - { - Guard.ThrowIfNull(services); - - services.AddOpenTelemetryTracerProvider(); - - services.ConfigureOpenTelemetryTracing(configure); + /// + /// Notes: + /// + /// + /// This is safe to be called multiple times. Only a single will be created for a given . + /// + /// + /// This method should be called by application host code. Library + /// authors should call + /// instead. + /// + /// + /// + /// . + /// Supplied for chaining + /// calls. + [Obsolete("Use the AddOpenTelemetry().WithTracing(configure).StartWithHost() pattern instead. This method will be removed in a future version.")] + public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services) + => AddOpenTelemetryTracing(services, b => { }); - services.TryAddEnumerable(ServiceDescriptor.Singleton()); - - return services; - } - - /// - /// Configure OpenTelemetry and register a - /// to automatically start metric services in the supplied . - /// - /// - /// Notes: - /// - /// - /// This is safe to be called multiple times. Only a single will be created for a given . - /// - /// - /// This method should be called by application host code. Library - /// authors should call - /// instead. - /// - /// - /// - /// . - /// Supplied for chaining - /// calls. - public static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollection services) - => AddOpenTelemetryMetrics(services, b => { }); - - /// - /// Configure OpenTelemetry and register a - /// to automatically start metric services in the supplied . - /// - /// - /// . - /// Callback action to configure the . - /// Supplied for chaining - /// calls. - public static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollection services, Action configure) - { - Guard.ThrowIfNull(services); + /// + /// Configure OpenTelemetry and register a + /// to automatically start tracing services in the supplied . + /// + /// + /// . + /// Callback action to configure the . + /// Supplied for chaining + /// calls. + [Obsolete("Use the AddOpenTelemetry().WithTracing(configure).StartWithHost() 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.AddOpenTelemetryMeterProvider(); + return services; + } - services.ConfigureOpenTelemetryMetrics(configure); + /// + /// Configure OpenTelemetry and register a + /// to automatically start metric services in the supplied . + /// + /// + /// Notes: + /// + /// + /// This is safe to be called multiple times. Only a single will be created for a given . + /// + /// + /// This method should be called by application host code. Library + /// authors should call + /// instead. + /// + /// + /// + /// . + /// Supplied for chaining + /// calls. + [Obsolete("Use the AddOpenTelemetry().WithMetrics(configure).StartWithHost() pattern instead. This method will be removed in a future version.")] + public static IServiceCollection AddOpenTelemetryMetrics(this IServiceCollection services) + => AddOpenTelemetryMetrics(services, b => { }); - services.TryAddEnumerable(ServiceDescriptor.Singleton()); + /// + /// Configure OpenTelemetry and register a + /// to automatically start metric services in the supplied . + /// + /// + /// . + /// Callback action to configure the . + /// Supplied for chaining + /// calls. + [Obsolete("Use the AddOpenTelemetry().WithMetrics(configure).StartWithHost() 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(); - return services; - } + return services; } } diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index 8a4efed0980..f4743d08fc3 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -1,4 +1,3 @@ -Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -13,10 +12,19 @@ OpenTelemetry.Metrics.HistogramConfiguration OpenTelemetry.Metrics.HistogramConfiguration.HistogramConfiguration() -> void OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void +OpenTelemetry.Metrics.MeterProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.MeterProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! 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(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! +OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryMeterProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryTracerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.OpenTelemetryServiceCollectionExtensions +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 @@ -30,8 +38,3 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(th static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType -*REMOVED*~override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -*REMOVED*override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! -*REMOVED*~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! -*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! -*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index 8a4efed0980..f4743d08fc3 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -1,4 +1,3 @@ -Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -13,10 +12,19 @@ OpenTelemetry.Metrics.HistogramConfiguration OpenTelemetry.Metrics.HistogramConfiguration.HistogramConfiguration() -> void OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void +OpenTelemetry.Metrics.MeterProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.MeterProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! 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(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! +OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryMeterProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryTracerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.OpenTelemetryServiceCollectionExtensions +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 @@ -30,8 +38,3 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(th static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType -*REMOVED*~override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -*REMOVED*override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! -*REMOVED*~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! -*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! -*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 8a4efed0980..f4743d08fc3 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,4 +1,3 @@ -Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -13,10 +12,19 @@ OpenTelemetry.Metrics.HistogramConfiguration OpenTelemetry.Metrics.HistogramConfiguration.HistogramConfiguration() -> void OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void +OpenTelemetry.Metrics.MeterProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.MeterProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! 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(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! +OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryMeterProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryTracerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.OpenTelemetryServiceCollectionExtensions +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 @@ -30,8 +38,3 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(th static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType -*REMOVED*~override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -*REMOVED*override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! -*REMOVED*~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! -*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! -*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index 8a4efed0980..f4743d08fc3 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -1,4 +1,3 @@ -Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions OpenTelemetry.Logs.LogRecord.CategoryName.set -> void OpenTelemetry.Logs.LogRecord.EventId.set -> void OpenTelemetry.Logs.LogRecord.Exception.set -> void @@ -13,10 +12,19 @@ OpenTelemetry.Metrics.HistogramConfiguration OpenTelemetry.Metrics.HistogramConfiguration.HistogramConfiguration() -> void OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.get -> bool OpenTelemetry.Metrics.HistogramConfiguration.RecordMinMax.set -> void +OpenTelemetry.Metrics.MeterProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! +OpenTelemetry.Metrics.MeterProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder! 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(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! +OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryMeterProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -static Microsoft.Extensions.DependencyInjection.OpenTelemetryServiceCollectionExtensions.AddOpenTelemetryTracerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection! +OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! +OpenTelemetry.OpenTelemetryServiceCollectionExtensions +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 @@ -30,8 +38,3 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(th static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType -*REMOVED*~override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Metrics.MeterProviderBuilder! -*REMOVED*override OpenTelemetry.Metrics.MeterProviderBuilderBase.AddMeter(params string![]! names) -> OpenTelemetry.Metrics.MeterProviderBuilder! -*REMOVED*~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(System.Func! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder! -*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder! -*REMOVED*override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs index 36f14160cd5..fb410035eac 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs @@ -26,26 +26,107 @@ namespace OpenTelemetry.Metrics; /// /// Contains methods for building instances. /// -public class MeterProviderBuilderBase : DeferredMeterProviderBuilder +public class MeterProviderBuilderBase : MeterProviderBuilder, IMeterProviderBuilder { + private readonly bool allowBuild; + private IServiceCollection? services; + public MeterProviderBuilderBase() - : base(new ServiceCollection()) { - this.ConfigureServices(services => services + var services = new ServiceCollection(); + + services .AddOpenTelemetryMeterProviderBuilderServices() .TryAddSingleton( - sp => throw new NotSupportedException("Self-contained MeterProvider cannot be accessed using the application IServiceProvider call Build instead."))); + sp => throw new NotSupportedException("Self-contained MeterProvider cannot be accessed using the application IServiceProvider call Build instead.")); + + services.ConfigureOpenTelemetryMeterProvider((sp, builder) => this.services = null); + + this.services = services; + + this.allowBuild = true; } - internal static void RegisterMeterProvider(IServiceCollection services) + internal MeterProviderBuilderBase(IServiceCollection services) { Guard.ThrowIfNull(services); services .AddOpenTelemetryMeterProviderBuilderServices() .TryAddSingleton(sp => new MeterProviderSdk(sp, ownsServiceProvider: false)); + + services.ConfigureOpenTelemetryMeterProvider((sp, builder) => this.services = null); + + this.services = services; + + this.allowBuild = false; + } + + /// + MeterProvider? IMeterProviderBuilder.Provider => null; + + /// + public override MeterProviderBuilder AddInstrumentation(Func instrumentationFactory) + { + Guard.ThrowIfNull(instrumentationFactory); + + this.ConfigureBuilder((sp, builder) => + { + builder.AddInstrumentation(instrumentationFactory); + }); + + return this; } + /// + public override MeterProviderBuilder AddMeter(params string[] names) + { + Guard.ThrowIfNull(names); + + this.ConfigureBuilder((sp, builder) => + { + builder.AddMeter(names); + }); + + return this; + } + + /// + public MeterProviderBuilder ConfigureBuilder(Action configure) + { + var services = this.services; + + if (services == null) + { + throw new NotSupportedException("Builder cannot be configured during MeterProvider construction."); + } + + services.ConfigureOpenTelemetryMeterProvider(configure); + + return this; + } + + /// + public MeterProviderBuilder ConfigureServices(Action configure) + { + Guard.ThrowIfNull(configure); + + var services = this.services; + + if (services == null) + { + throw new NotSupportedException("Services cannot be configured during MeterProvider construction."); + } + + configure(services); + + return this; + } + + /// + MeterProviderBuilder IDeferredMeterProviderBuilder.Configure(Action configure) + => this.ConfigureBuilder(configure); + internal MeterProvider InvokeBuild() => this.Build(); @@ -55,28 +136,26 @@ internal MeterProvider InvokeBuild() /// . protected MeterProvider Build() { - ServiceProvider? serviceProvider = null; - try + if (!this.allowBuild) { - this.ConfigureServices(services => - { -#if DEBUG - bool validateScopes = true; -#else - bool validateScopes = false; -#endif - serviceProvider = services.BuildServiceProvider(validateScopes); - }); + throw new NotSupportedException("A MeterProviderBuilder bound to external service cannot be built directly. Access the MeterProvider using the application IServiceProvider instead."); } - catch (NotSupportedException) + + var services = this.services; + + if (services == null) { throw new NotSupportedException("MeterProviderBuilder build method cannot be called multiple times."); } - if (serviceProvider == null) - { - throw new InvalidOperationException("ServiceProvider could not be created for ServiceCollection."); - } + this.services = null; + +#if DEBUG + bool validateScopes = true; +#else + bool validateScopes = false; +#endif + var serviceProvider = services.BuildServiceProvider(validateScopes); return new MeterProviderSdk(serviceProvider, ownsServiceProvider: true); } diff --git a/src/OpenTelemetry/OpenTelemetryBuilder.cs b/src/OpenTelemetry/OpenTelemetryBuilder.cs new file mode 100644 index 00000000000..fc6635b2e18 --- /dev/null +++ b/src/OpenTelemetry/OpenTelemetryBuilder.cs @@ -0,0 +1,99 @@ +// +// 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 Microsoft.Extensions.DependencyInjection; +using OpenTelemetry.Internal; +using OpenTelemetry.Metrics; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; + +namespace OpenTelemetry; + +/// +/// Contains methods for configuring the OpenTelemetry SDK inside an . +/// +public class OpenTelemetryBuilder +{ + internal OpenTelemetryBuilder(IServiceCollection services) + { + Guard.ThrowIfNull(services); + + this.Services = services; + } + + /// + /// Gets the behind the builder. + /// + public IServiceCollection Services { get; } + + /// + /// Registers an action to configure the s used + /// by tracing and metrics. + /// + /// configuration + /// action. + /// The supplied for chaining + /// calls. + public OpenTelemetryBuilder ConfigureResource( + Action configure) + { + Guard.ThrowIfNull(configure); + + this.Services.ConfigureOpenTelemetryMeterProvider( + (sp, builder) => builder.ConfigureResource(configure)); + + this.Services.ConfigureOpenTelemetryTracerProvider( + (sp, builder) => builder.ConfigureResource(configure)); + + return this; + } + + /// + /// Adds metric services into the builder. + /// + /// Optional + /// configuration callback. + /// The supplied for chaining + /// calls. + public OpenTelemetryBuilder WithMetrics(Action? configure = null) + { + var builder = new MeterProviderBuilderBase(this.Services); + + configure?.Invoke(builder); + + return this; + } + + /// + /// Adds tracing services into the builder. + /// + /// Optional + /// configuration callback. + /// The supplied for chaining + /// calls. + public OpenTelemetryBuilder WithTracing(Action? configure = null) + { + var builder = new TracerProviderBuilderBase(this.Services); + + configure?.Invoke(builder); + + return this; + } +} diff --git a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs index 52d8225b032..0df3bd1bf7b 100644 --- a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs @@ -16,85 +16,15 @@ #nullable enable -using OpenTelemetry.Metrics; -using OpenTelemetry.Trace; +using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.Extensions.DependencyInjection; +namespace OpenTelemetry; /// /// Contains extension methods for registering OpenTelemetry SDK artifacts. /// public static class OpenTelemetryServiceCollectionExtensions { - /// - /// Adds the OpenTelemetry SDK implementation - /// into the supplied . - /// - /// - /// Notes: - /// - /// - /// This is safe to be called multiple times. Only a single will be created for a given . - /// - /// - /// This method is provided to support hosting infrastructure and is not - /// typically called by users. - /// - /// Application authors should call the - /// IServiceCollection.AddOpenTelemetryTracing extension in the - /// OpenTelemetry.Extensions.Hosting package. - /// Library authors should call the - /// extension. - /// - /// - /// - /// - /// . - /// Returns the supplied for call - /// chaining. - public static IServiceCollection AddOpenTelemetryTracerProvider(this IServiceCollection services) - { - TracerProviderBuilderBase.RegisterTracerProvider(services); - - return services; - } - - /// - /// Adds the OpenTelemetry SDK implementation - /// into the supplied . - /// - /// - /// Notes: - /// - /// - /// This is safe to be called multiple times. Only a single will be created for a given . - /// - /// - /// This method is provided to support hosting infrastructure and is not - /// typically called by users. - /// - /// Application authors should call the - /// IServiceCollection.AddOpenTelemetryMetrics extension in the - /// OpenTelemetry.Extensions.Hosting package. - /// Library authors should call the - /// extension. - /// - /// - /// - /// - /// . - /// Returns the supplied for call - /// chaining. - public static IServiceCollection AddOpenTelemetryMeterProvider(this IServiceCollection services) - { - MeterProviderBuilderBase.RegisterMeterProvider(services); - - return services; - } + public static OpenTelemetryBuilder AddOpenTelemetry(this IServiceCollection services) + => new(services); } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index 46375fde431..385bc4f793d 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -26,26 +26,120 @@ namespace OpenTelemetry.Trace; /// /// Contains methods for building instances. /// -public class TracerProviderBuilderBase : DeferredTracerProviderBuilder +public class TracerProviderBuilderBase : TracerProviderBuilder, ITracerProviderBuilder { + private readonly bool allowBuild; + private IServiceCollection? services; + public TracerProviderBuilderBase() - : base(new ServiceCollection()) { - this.ConfigureServices(services => services + var services = new ServiceCollection(); + + services .AddOpenTelemetryTracerProviderBuilderServices() .TryAddSingleton( - sp => throw new NotSupportedException("Self-contained TracerProvider cannot be accessed using the application IServiceProvider call Build instead."))); + sp => throw new NotSupportedException("Self-contained TracerProvider cannot be accessed using the application IServiceProvider call Build instead.")); + + services.ConfigureOpenTelemetryTracerProvider((sp, builder) => this.services = null); + + this.services = services; + + this.allowBuild = true; } - internal static void RegisterTracerProvider(IServiceCollection services) + internal TracerProviderBuilderBase(IServiceCollection services) { Guard.ThrowIfNull(services); services - .AddOpenTelemetryTracerProviderBuilderServices() + .AddOpenTelemetryMeterProviderBuilderServices() .TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: false)); + + services.ConfigureOpenTelemetryTracerProvider((sp, builder) => this.services = null); + + this.services = services; + + this.allowBuild = false; + } + + /// + TracerProvider? ITracerProviderBuilder.Provider => null; + + /// + public override TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) + { + Guard.ThrowIfNull(instrumentationFactory); + + this.ConfigureBuilder((sp, builder) => + { + builder.AddInstrumentation(instrumentationFactory); + }); + + return this; + } + + /// + public override TracerProviderBuilder AddSource(params string[] names) + { + Guard.ThrowIfNull(names); + + this.ConfigureBuilder((sp, builder) => + { + builder.AddSource(names); + }); + + return this; } + /// + public override TracerProviderBuilder AddLegacySource(string operationName) + { + Guard.ThrowIfNullOrWhitespace(operationName); + + this.ConfigureBuilder((sp, builder) => + { + builder.AddLegacySource(operationName); + }); + + return this; + } + + /// + public TracerProviderBuilder ConfigureBuilder(Action configure) + { + var services = this.services; + + if (services == null) + { + throw new NotSupportedException("Builder cannot be configured during TracerProvider construction."); + } + + services.ConfigureOpenTelemetryTracerProvider(configure); + + return this; + } + + /// + public TracerProviderBuilder ConfigureServices(Action configure) + { + Guard.ThrowIfNull(configure); + + var services = this.services; + + if (services == null) + { + throw new NotSupportedException("Services cannot be configured during TracerProvider construction."); + } + + configure(services); + + return this; + } + + /// + TracerProviderBuilder IDeferredTracerProviderBuilder.Configure(Action configure) + => this.ConfigureBuilder(configure); + internal TracerProvider InvokeBuild() => this.Build(); @@ -83,28 +177,26 @@ protected TracerProviderBuilder AddInstrumentation( /// . protected TracerProvider Build() { - ServiceProvider? serviceProvider = null; - try + if (!this.allowBuild) { - this.ConfigureServices(services => - { -#if DEBUG - bool validateScopes = true; -#else - bool validateScopes = false; -#endif - serviceProvider = services.BuildServiceProvider(validateScopes); - }); + throw new NotSupportedException("A TracerProviderBuilder bound to external service cannot be built directly. Access the TracerProvider using the application IServiceProvider instead."); } - catch (NotSupportedException) + + var services = this.services; + + if (services == null) { throw new NotSupportedException("TracerProviderBuilder build method cannot be called multiple times."); } - if (serviceProvider == null) - { - throw new InvalidOperationException("ServiceProvider could not be created for ServiceCollection."); - } + this.services = null; + +#if DEBUG + bool validateScopes = true; +#else + bool validateScopes = false; +#endif + var serviceProvider = services.BuildServiceProvider(validateScopes); return new TracerProviderSdk(serviceProvider, ownsServiceProvider: true); } From 754a882bf5a9bff45ffb51a58a23c5b165804ba4 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 1 Dec 2022 16:48:25 -0800 Subject: [PATCH 12/48] Example tweaks. --- examples/AspNetCore/Program.cs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/examples/AspNetCore/Program.cs b/examples/AspNetCore/Program.cs index 5f2f509fea4..7361361afb9 100644 --- a/examples/AspNetCore/Program.cs +++ b/examples/AspNetCore/Program.cs @@ -25,37 +25,34 @@ var appBuilder = WebApplication.CreateBuilder(args); -// OpenTelemetry -var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "unknown"; - // Switch between Zipkin/Jaeger/OTLP/Console by setting UseTracingExporter in appsettings.json. var tracingExporter = appBuilder.Configuration.GetValue("UseTracingExporter").ToLowerInvariant(); -// Note: Switch between Prometheus/OTLP/Console by setting UseMetricsExporter in appsettings.json. +// Switch between Prometheus/OTLP/Console by setting UseMetricsExporter in appsettings.json. var metricsExporter = appBuilder.Configuration.GetValue("UseMetricsExporter").ToLowerInvariant(); // Switch between Console/OTLP by setting UseLogExporter in appsettings.json. var logExporter = appBuilder.Configuration.GetValue("UseLogExporter").ToLowerInvariant(); -// For options which can be bound from IConfiguration. -appBuilder.Services.Configure(appBuilder.Configuration.GetSection("AspNetCoreInstrumentation")); - Action configureResource = r => r.AddService( serviceName: appBuilder.Configuration.GetValue("ServiceName"), - serviceVersion: assemblyVersion, + serviceVersion: Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "unknown", serviceInstanceId: Environment.MachineName); appBuilder.Services.AddOpenTelemetry() .ConfigureResource(configureResource) .WithTracing(builder => { - // Traces + // Tracing builder .SetSampler(new AlwaysOnSampler()) .AddHttpClientInstrumentation() .AddAspNetCoreInstrumentation(); + // Use IConfiguration binding for AspNetCore instrumentation options. + appBuilder.Services.Configure(appBuilder.Configuration.GetSection("AspNetCoreInstrumentation")); + switch (tracingExporter) { case "jaeger": @@ -63,6 +60,7 @@ builder.ConfigureServices(services => { + // Use IConfiguration binding for Jaeger exporter options. services.Configure(appBuilder.Configuration.GetSection("Jaeger")); // Customize the HttpClient that will be used when JaegerExporter is configured for HTTP transport. @@ -75,6 +73,7 @@ builder.ConfigureServices(services => { + // Use IConfiguration binding for Zipkin exporter options. services.Configure(appBuilder.Configuration.GetSection("Zipkin")); }); break; @@ -82,6 +81,7 @@ case "otlp": builder.AddOtlpExporter(otlpOptions => { + // Use IConfiguration directly for Otlp exporter endpoint option. otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint")); }); break; @@ -108,6 +108,7 @@ case "otlp": builder.AddOtlpExporter(otlpOptions => { + // Use IConfiguration directly for Otlp exporter endpoint option. otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint")); }); break; @@ -132,6 +133,7 @@ case "otlp": options.AddOtlpExporter(otlpOptions => { + // Use IConfiguration directly for Otlp exporter endpoint option. otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint")); }); break; From a3b3bcdf632cee18bf86d594ff3debbd6e368305 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 1 Dec 2022 16:52:35 -0800 Subject: [PATCH 13/48] Example cleanup. --- examples/AspNetCore/Program.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/examples/AspNetCore/Program.cs b/examples/AspNetCore/Program.cs index 7361361afb9..f051b05f903 100644 --- a/examples/AspNetCore/Program.cs +++ b/examples/AspNetCore/Program.cs @@ -25,20 +25,23 @@ var appBuilder = WebApplication.CreateBuilder(args); -// Switch between Zipkin/Jaeger/OTLP/Console by setting UseTracingExporter in appsettings.json. +// Note: Switch between Zipkin/Jaeger/OTLP/Console by setting UseTracingExporter in appsettings.json. var tracingExporter = appBuilder.Configuration.GetValue("UseTracingExporter").ToLowerInvariant(); -// Switch between Prometheus/OTLP/Console by setting UseMetricsExporter in appsettings.json. +// Note: Switch between Prometheus/OTLP/Console by setting UseMetricsExporter in appsettings.json. var metricsExporter = appBuilder.Configuration.GetValue("UseMetricsExporter").ToLowerInvariant(); -// Switch between Console/OTLP by setting UseLogExporter in appsettings.json. +// Note: Switch between Console/OTLP by setting UseLogExporter in appsettings.json. var logExporter = appBuilder.Configuration.GetValue("UseLogExporter").ToLowerInvariant(); +// Build a resource configuration action to set service information. Action configureResource = r => r.AddService( serviceName: appBuilder.Configuration.GetValue("ServiceName"), serviceVersion: Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "unknown", serviceInstanceId: Environment.MachineName); +// Configure OpenTelemetry tracing & metrics with auto-start using the +// StartWithHost extension from OpenTelemetry.Extensions.Hosting. appBuilder.Services.AddOpenTelemetry() .ConfigureResource(configureResource) .WithTracing(builder => @@ -119,9 +122,10 @@ }) .StartWithHost(); -// Logging +// Clear default logging providers used by WebApplication host. appBuilder.Logging.ClearProviders(); +// Configure OpenTelemetry Logging. appBuilder.Logging.AddOpenTelemetry(options => { // Note: See appsettings.json Logging:OpenTelemetry section for configuration. @@ -143,17 +147,14 @@ } }); -// Add services to the container. appBuilder.Services.AddControllers(); -// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle appBuilder.Services.AddEndpointsApiExplorer(); appBuilder.Services.AddSwaggerGen(); var app = appBuilder.Build(); -// Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); @@ -166,6 +167,7 @@ app.MapControllers(); +// Configure OpenTelemetry Prometheus AspNetCore middleware scrape endpoint if enabled. if (metricsExporter.Equals("prometheus", StringComparison.OrdinalIgnoreCase)) { app.UseOpenTelemetryPrometheusScrapingEndpoint(); From adf1a000a8f799d4d9cb11fea20091bf1e2b818e Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 1 Dec 2022 17:07:57 -0800 Subject: [PATCH 14/48] XML doc updates. --- .../OpenTelemetryBuilderHostingExtensions.cs | 5 ++-- src/OpenTelemetry/OpenTelemetryBuilder.cs | 14 ++++++++++ ...penTelemetryServiceCollectionExtensions.cs | 26 +++++++++++++++++++ .../Builder/TracerProviderBuilderBase.cs | 3 +++ .../Trace/TracerProviderExtensions.cs | 9 +++++++ 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs index be9f4eb1df8..646ca614f44 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetryBuilderHostingExtensions.cs @@ -34,9 +34,10 @@ public static class OpenTelemetryBuilderHostingExtensions /// cref="IServiceCollection" />. /// /// - /// This is safe to be called multiple times. Only a single will be created for a given . + /// cref="IServiceCollection"/>. This should generally be called by hosting + /// application code and NOT library authors. /// /// . /// The supplied for chaining diff --git a/src/OpenTelemetry/OpenTelemetryBuilder.cs b/src/OpenTelemetry/OpenTelemetryBuilder.cs index fc6635b2e18..45f0446b553 100644 --- a/src/OpenTelemetry/OpenTelemetryBuilder.cs +++ b/src/OpenTelemetry/OpenTelemetryBuilder.cs @@ -47,6 +47,10 @@ internal OpenTelemetryBuilder(IServiceCollection services) /// Registers an action to configure the s used /// by tracing and metrics. /// + /// + /// Note: This is safe to be called multiple times and by library authors. + /// Each registered configuration action will be applied sequentially. + /// /// configuration /// action. /// The supplied for chaining @@ -68,6 +72,11 @@ public OpenTelemetryBuilder ConfigureResource( /// /// Adds metric services into the builder. /// + /// + /// Note: This is safe to be called multiple times and by library authors. + /// Only a single will be created for a given + /// . + /// /// Optional /// configuration callback. /// The supplied for chaining @@ -84,6 +93,11 @@ public OpenTelemetryBuilder WithMetrics(Action? configure /// /// Adds tracing services into the builder. /// + /// + /// Note: This is safe to be called multiple times and by library authors. + /// Only a single will be created for a given + /// . + /// /// Optional /// configuration callback. /// The supplied for chaining diff --git a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs index 0df3bd1bf7b..4d29024990a 100644 --- a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs @@ -16,7 +16,10 @@ #nullable enable +using System; using Microsoft.Extensions.DependencyInjection; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; namespace OpenTelemetry; @@ -25,6 +28,29 @@ namespace OpenTelemetry; /// public static class OpenTelemetryServiceCollectionExtensions { + /// + /// Adds OpenTelemetry SDK services into the supplied . + /// + /// + /// Notes: + /// + /// A and/or + /// will not be created automatically using this method. Either use the + /// OpenTelemetryBuilder.StartWithHost extension in the + /// OpenTelemetry.Extensions.Hosting package or access the and/or through the + /// application to begin collecting traces + /// and/or metrics. + /// 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); } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index 385bc4f793d..fdc04873c6d 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -31,6 +31,9 @@ public class TracerProviderBuilderBase : TracerProviderBuilder, ITracerProviderB private readonly bool allowBuild; private IServiceCollection? services; + /// + /// Initializes a new instance of the class. + /// public TracerProviderBuilderBase() { var services = new ServiceCollection(); diff --git a/src/OpenTelemetry/Trace/TracerProviderExtensions.cs b/src/OpenTelemetry/Trace/TracerProviderExtensions.cs index 38e9d65c090..bb9cdd163e2 100644 --- a/src/OpenTelemetry/Trace/TracerProviderExtensions.cs +++ b/src/OpenTelemetry/Trace/TracerProviderExtensions.cs @@ -23,8 +23,17 @@ namespace OpenTelemetry.Trace { + /// + /// Contains extension methods for the class. + /// public static class TracerProviderExtensions { + /// + /// Add a processor to the provider. + /// + /// . + /// . + /// The supplied instance for call chaining. public static TracerProvider AddProcessor(this TracerProvider provider, BaseProcessor processor) { Guard.ThrowIfNull(provider); From 6022f843c789a9b3f62aad8f82387df753ed5fa4 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 1 Dec 2022 17:15:21 -0800 Subject: [PATCH 15/48] XML doc updates. --- ...pendencyInjectionMetricsServiceCollectionExtensions.cs | 8 +++++--- ...pendencyInjectionTracingServiceCollectionExtensions.cs | 8 +++++--- .../OpenTelemetryServiceCollectionExtensions.cs | 6 +++--- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs index d86d711300c..a9b8c9abd10 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs @@ -35,10 +35,12 @@ public static class OpenTelemetryDependencyInjectionMetricsServiceCollectionExte /// Notes: /// /// This is safe to be called multiple times and by library authors. - /// Only a single will be created for a given - /// . + /// Each registered configuration action will be applied + /// sequentially. /// A will not be created automatically - /// using this method. To begin collecting metrics TBD. + /// using this method. To begin collecting metrics use the + /// IServiceCollection.AddOpenTelemetry extension in the + /// OpenTelemetry package. /// /// /// The to add diff --git a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs index c2fc81bc6ca..26c052764d9 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs @@ -35,10 +35,12 @@ public static class OpenTelemetryDependencyInjectionTracingServiceCollectionExte /// Notes: /// /// This is safe to be called multiple times and by library authors. - /// Only a single will be created for a given - /// . + /// Each registered configuration action will be applied + /// sequentially. /// A will not be created automatically - /// using this method. To begin collecting traces TBD. + /// using this method. To begin collecting metrics use the + /// IServiceCollection.AddOpenTelemetry extension in the + /// OpenTelemetry package. /// /// /// The to add diff --git a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs index 4d29024990a..2b7b0ce9119 100644 --- a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs @@ -36,12 +36,12 @@ public static class OpenTelemetryServiceCollectionExtensions /// Notes: /// /// A and/or - /// will not be created automatically using this method. Either use the + /// 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 to begin collecting traces - /// and/or metrics. + /// application . /// This is safe to be called multiple times and by library authors. /// Only a single and/or will be created for a given Date: Thu, 1 Dec 2022 17:41:16 -0800 Subject: [PATCH 16/48] Bug fix. --- src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index fdc04873c6d..e5c759962c3 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -55,7 +55,7 @@ internal TracerProviderBuilderBase(IServiceCollection services) Guard.ThrowIfNull(services); services - .AddOpenTelemetryMeterProviderBuilderServices() + .AddOpenTelemetryTracerProviderBuilderServices() .TryAddSingleton(sp => new TracerProviderSdk(sp, ownsServiceProvider: false)); services.ConfigureOpenTelemetryTracerProvider((sp, builder) => this.services = null); From 9cf302f5051b5177082275924b70ceafc3a25339 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 09:39:13 -0800 Subject: [PATCH 17/48] Test fixes. --- .../MeterProviderBuilderExtensionsTests.cs | 29 ++++++++----------- .../TracerProviderBuilderExtensionsTest.cs | 29 ++++++++----------- 2 files changed, 24 insertions(+), 34 deletions(-) diff --git a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs index df7ed3ee2c3..da06b6fee69 100644 --- a/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs @@ -32,8 +32,6 @@ public void ServiceLifecycleAvailableToSDKBuilderTest() { var builder = Sdk.CreateMeterProviderBuilder(); - builder.ConfigureServices(services => services.AddSingleton()); - MyInstrumentation myInstrumentation = null; RunBuilderServiceLifecycleTest( @@ -66,14 +64,12 @@ public void ServiceLifecycleAvailableToServicesBuilderTest() { var services = new ServiceCollection(); - services.AddOpenTelemetryMeterProvider(); - bool testRun = false; ServiceProvider serviceProvider = null; MeterProviderSdk provider = null; - services.ConfigureOpenTelemetryMetrics(builder => + services.AddOpenTelemetry().WithMetrics(builder => { testRun = true; @@ -82,7 +78,7 @@ public void ServiceLifecycleAvailableToServicesBuilderTest() () => { // Note: Build can't be called directly on builder tied to external services - Assert.Null(builder.Build()); + Assert.Throws(() => builder.Build()); serviceProvider = services.BuildServiceProvider(); @@ -113,14 +109,12 @@ public void SingleProviderForServiceCollectionTest() { var services = new ServiceCollection(); - services.AddOpenTelemetryMeterProvider(); - - services.ConfigureOpenTelemetryMetrics(builder => + services.AddOpenTelemetry().WithMetrics(builder => { builder.AddInstrumentation(() => new()); }); - services.ConfigureOpenTelemetryMetrics(builder => + services.AddOpenTelemetry().WithMetrics(builder => { builder.AddInstrumentation(() => new()); }); @@ -277,7 +271,7 @@ public void MeterProviderNestedResolutionUsingBuilderTest(bool callNestedConfigu { if (callNestedConfigure) { - services.ConfigureOpenTelemetryMetrics(); + services.AddOpenTelemetry().WithMetrics(builder => { }); } }) .ConfigureBuilder((sp, builder) => @@ -299,9 +293,7 @@ public void MeterProviderNestedResolutionUsingConfigureTest() var services = new ServiceCollection(); - services.AddOpenTelemetryMeterProvider(); - - services.ConfigureOpenTelemetryMetrics(builder => + services.AddOpenTelemetry().WithMetrics(builder => { builder.ConfigureBuilder((sp, builder) => { @@ -333,12 +325,15 @@ private static void RunBuilderServiceLifecycleTest( Assert.NotNull(services); + services.TryAddSingleton(); services.TryAddSingleton(); - services.ConfigureOpenTelemetryMetrics(b => + // Note: This is strange to call ConfigureOpenTelemetryMeterProvider here, but supported + services.ConfigureOpenTelemetryMeterProvider((sp, b) => { - // Note: This is strange to call ConfigureOpenTelemetryMetrics here, but supported - b.AddInstrumentation(); + Assert.Throws(() => b.ConfigureServices(services => { })); + + b.AddInstrumentation(sp.GetRequiredService()); }); }); diff --git a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs index 64da8cdce7f..fe7186eba8d 100644 --- a/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs +++ b/test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs @@ -118,8 +118,6 @@ public void ServiceLifecycleAvailableToSDKBuilderTest() { var builder = Sdk.CreateTracerProviderBuilder(); - builder.ConfigureServices(services => services.AddSingleton()); - MyInstrumentation myInstrumentation = null; RunBuilderServiceLifecycleTest( @@ -152,14 +150,12 @@ public void ServiceLifecycleAvailableToServicesBuilderTest() { var services = new ServiceCollection(); - services.AddOpenTelemetryTracerProvider(); - bool testRun = false; ServiceProvider serviceProvider = null; TracerProviderSdk provider = null; - services.ConfigureOpenTelemetryTracing(builder => + services.AddOpenTelemetry().WithTracing(builder => { testRun = true; @@ -168,7 +164,7 @@ public void ServiceLifecycleAvailableToServicesBuilderTest() () => { // Note: Build can't be called directly on builder tied to external services - Assert.Null(builder.Build()); + Assert.Throws(() => builder.Build()); serviceProvider = services.BuildServiceProvider(); @@ -199,14 +195,12 @@ public void SingleProviderForServiceCollectionTest() { var services = new ServiceCollection(); - services.AddOpenTelemetryTracerProvider(); - - services.ConfigureOpenTelemetryTracing(builder => + services.AddOpenTelemetry().WithTracing(builder => { builder.AddInstrumentation(() => new()); }); - services.ConfigureOpenTelemetryTracing(builder => + services.AddOpenTelemetry().WithTracing(builder => { builder.AddInstrumentation(() => new()); }); @@ -363,7 +357,7 @@ public void TracerProviderNestedResolutionUsingBuilderTest(bool callNestedConfig { if (callNestedConfigure) { - services.ConfigureOpenTelemetryTracing(); + services.AddOpenTelemetry().WithTracing(builder => { }); } }) .ConfigureBuilder((sp, builder) => @@ -385,9 +379,7 @@ public void TracerProviderNestedResolutionUsingConfigureTest() var services = new ServiceCollection(); - services.AddOpenTelemetryTracerProvider(); - - services.ConfigureOpenTelemetryTracing(builder => + services.AddOpenTelemetry().WithTracing(builder => { builder.ConfigureBuilder((sp, builder) => { @@ -422,12 +414,15 @@ private static void RunBuilderServiceLifecycleTest( Assert.NotNull(services); + services.TryAddSingleton(); services.TryAddSingleton(); - services.ConfigureOpenTelemetryTracing(b => + // Note: This is strange to call ConfigureOpenTelemetryTracerProvider here, but supported + services.ConfigureOpenTelemetryTracerProvider((sp, b) => { - // Note: This is strange to call ConfigureOpenTelemetryTracing here, but supported - b.AddInstrumentation(); + Assert.Throws(() => b.ConfigureServices(services => { })); + + b.AddInstrumentation(sp.GetRequiredService()); }); }); From 3a7595453d2e60dc03a2375371647c62e8cfefe1 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 12:03:00 -0800 Subject: [PATCH 18/48] Example fixup. --- examples/GrpcService/Startup.cs | 45 ++++++++++++++------------- examples/GrpcService/appsettings.json | 3 +- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/GrpcService/Startup.cs b/examples/GrpcService/Startup.cs index c7034011b02..507db426e28 100644 --- a/examples/GrpcService/Startup.cs +++ b/examples/GrpcService/Startup.cs @@ -21,6 +21,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using OpenTelemetry; using OpenTelemetry.Resources; using OpenTelemetry.Trace; @@ -39,34 +40,34 @@ public void ConfigureServices(IServiceCollection services) { services.AddGrpc(); - // Switch between Jaeger/Zipkin by setting UseExporter in appsettings.json. - var exporter = this.Configuration.GetValue("UseExporter").ToLowerInvariant(); - switch (exporter) + services.AddOpenTelemetry().WithTracing(builder => { - case "jaeger": - services.AddOpenTelemetryTracing((builder) => builder - .ConfigureResource(r => r.AddService(this.Configuration.GetValue("Jaeger:ServiceName"))) - .AddAspNetCoreInstrumentation() - .AddJaegerExporter(jaegerOptions => + builder + .ConfigureResource(r => r.AddService(this.Configuration.GetValue("ServiceName"))) + .AddAspNetCoreInstrumentation(); + + // Switch between Jaeger/Zipkin/Console by setting UseExporter in appsettings.json. + var exporter = this.Configuration.GetValue("UseExporter").ToLowerInvariant(); + switch (exporter) + { + case "jaeger": + builder.AddJaegerExporter(jaegerOptions => { jaegerOptions.AgentHost = this.Configuration.GetValue("Jaeger:Host"); jaegerOptions.AgentPort = this.Configuration.GetValue("Jaeger:Port"); - })); - break; - case "zipkin": - services.AddOpenTelemetryTracing((builder) => builder - .AddAspNetCoreInstrumentation() - .AddZipkinExporter(zipkinOptions => + }); + break; + case "zipkin": + builder.AddZipkinExporter(zipkinOptions => { zipkinOptions.Endpoint = new Uri(this.Configuration.GetValue("Zipkin:Endpoint")); - })); - break; - default: - services.AddOpenTelemetryTracing((builder) => builder - .AddAspNetCoreInstrumentation() - .AddConsoleExporter()); - break; - } + }); + break; + default: + builder.AddConsoleExporter(); + break; + } + }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) diff --git a/examples/GrpcService/appsettings.json b/examples/GrpcService/appsettings.json index eb311b0d6fa..675b9d1c8e6 100644 --- a/examples/GrpcService/appsettings.json +++ b/examples/GrpcService/appsettings.json @@ -12,14 +12,13 @@ "Protocols": "Http2" } }, + "ServiceName": "otel-test", "UseExporter": "console", "Jaeger": { - "ServiceName": "jaeger-test", "Host": "localhost", "Port": 6831 }, "Zipkin": { - "ServiceName": "zipkin-test", "Endpoint": "http://localhost:9411/api/v2/spans" } } From 6e29c323857bc813c82e4893c2f7d379e0d44fc1 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 12:04:26 -0800 Subject: [PATCH 19/48] Test fixup. --- .../JaegerExporterTests.cs | 4 ++-- .../ZipkinExporterTests.cs | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/test/OpenTelemetry.Exporter.Jaeger.Tests/JaegerExporterTests.cs b/test/OpenTelemetry.Exporter.Jaeger.Tests/JaegerExporterTests.cs index 10f1f9b3324..afd276282e6 100644 --- a/test/OpenTelemetry.Exporter.Jaeger.Tests/JaegerExporterTests.cs +++ b/test/OpenTelemetry.Exporter.Jaeger.Tests/JaegerExporterTests.cs @@ -124,8 +124,8 @@ public void ServiceProviderHttpClientFactoryInvoked() services.AddHttpClient("JaegerExporter", configureClient: (client) => invocations++); - services.AddOpenTelemetryTracing(builder => builder.AddJaegerExporter( - o => o.Protocol = JaegerExportProtocol.HttpBinaryThrift)); + services.AddOpenTelemetry().WithTracing(builder => builder + .AddJaegerExporter(o => o.Protocol = JaegerExportProtocol.HttpBinaryThrift)); using var serviceProvider = services.BuildServiceProvider(); diff --git a/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs b/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs index 683089e9479..18898912325 100644 --- a/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs +++ b/test/OpenTelemetry.Exporter.Zipkin.Tests/ZipkinExporterTests.cs @@ -283,7 +283,8 @@ public void ServiceProviderHttpClientFactoryInvoked() services.AddHttpClient("ZipkinExporter", configureClient: (client) => invocations++); - services.AddOpenTelemetryTracing(builder => builder.AddZipkinExporter()); + services.AddOpenTelemetry().WithTracing(builder => builder + .AddZipkinExporter()); using var serviceProvider = services.BuildServiceProvider(); From bdff2bb89a63afee3d24f7e42ea7bd9a57e72528 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 12:05:12 -0800 Subject: [PATCH 20/48] Test fixup. --- .../PrometheusExporterMiddlewareTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMiddlewareTests.cs b/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMiddlewareTests.cs index 8a6fb6eca9f..a85ed9e2771 100644 --- a/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMiddlewareTests.cs +++ b/test/OpenTelemetry.Exporter.Prometheus.AspNetCore.Tests/PrometheusExporterMiddlewareTests.cs @@ -258,7 +258,7 @@ private static async Task RunPrometheusExporterMiddlewareIntegrationTest( { if (registerMeterProvider) { - services.AddOpenTelemetryMetrics(builder => builder + services.AddOpenTelemetry().WithMetrics(builder => builder .AddMeter(MeterName) .AddPrometheusExporter(o => { From 12747936996a3ca2cfe4b287014ca0791710b2fb Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 12:06:32 -0800 Subject: [PATCH 21/48] Example fixup. --- examples/MicroserviceExample/WebApi/Startup.cs | 3 ++- .../WorkerService/Program.cs | 18 ++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/examples/MicroserviceExample/WebApi/Startup.cs b/examples/MicroserviceExample/WebApi/Startup.cs index a7664f00ccf..36e25f8a77c 100644 --- a/examples/MicroserviceExample/WebApi/Startup.cs +++ b/examples/MicroserviceExample/WebApi/Startup.cs @@ -20,6 +20,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using OpenTelemetry; using OpenTelemetry.Trace; using Utils.Messaging; @@ -40,7 +41,7 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); - services.AddOpenTelemetryTracing((builder) => builder + services.AddOpenTelemetry().WithTracing((builder) => builder .AddAspNetCoreInstrumentation() .AddSource(nameof(MessageSender)) .AddZipkinExporter(b => diff --git a/examples/MicroserviceExample/WorkerService/Program.cs b/examples/MicroserviceExample/WorkerService/Program.cs index 88a8cfd8dcf..143cd79c03e 100644 --- a/examples/MicroserviceExample/WorkerService/Program.cs +++ b/examples/MicroserviceExample/WorkerService/Program.cs @@ -17,6 +17,7 @@ using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using OpenTelemetry; using OpenTelemetry.Trace; using Utils.Messaging; @@ -37,16 +38,13 @@ public static IHostBuilder CreateHostBuilder(string[] args) => services.AddSingleton(); - services.AddOpenTelemetryTracing(builder => - { - builder - .AddSource(nameof(MessageReceiver)) - .AddZipkinExporter(b => - { - var zipkinHostName = Environment.GetEnvironmentVariable("ZIPKIN_HOSTNAME") ?? "localhost"; - b.Endpoint = new Uri($"http://{zipkinHostName}:9411/api/v2/spans"); - }); - }); + services.AddOpenTelemetry().WithTracing(builder => builder + .AddSource(nameof(MessageReceiver)) + .AddZipkinExporter(b => + { + var zipkinHostName = Environment.GetEnvironmentVariable("ZIPKIN_HOSTNAME") ?? "localhost"; + b.Endpoint = new Uri($"http://{zipkinHostName}:9411/api/v2/spans"); + })); }); } } From 7f9b9a0f851d342ede23c0a3c65ee4f7058351ae Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 12:07:55 -0800 Subject: [PATCH 22/48] Test fixup. --- .../OtlpMetricsExporterTests.cs | 4 ++-- .../OtlpTraceExporterTests.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs index e501446e595..fd11e42c343 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpMetricsExporterTests.cs @@ -161,8 +161,8 @@ public void ServiceProviderHttpClientFactoryInvoked() services.AddHttpClient("OtlpMetricExporter", configureClient: (client) => invocations++); - services.AddOpenTelemetryMetrics(builder => builder.AddOtlpExporter( - o => o.Protocol = OtlpExportProtocol.HttpProtobuf)); + services.AddOpenTelemetry().WithMetrics(builder => builder + .AddOtlpExporter(o => o.Protocol = OtlpExportProtocol.HttpProtobuf)); using var serviceProvider = services.BuildServiceProvider(); diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs index e302f5654f0..3fe9ac9f517 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpTraceExporterTests.cs @@ -136,8 +136,8 @@ public void ServiceProviderHttpClientFactoryInvoked() services.AddHttpClient("OtlpTraceExporter", configureClient: (client) => invocations++); - services.AddOpenTelemetryTracing(builder => builder.AddOtlpExporter( - o => o.Protocol = OtlpExportProtocol.HttpProtobuf)); + services.AddOpenTelemetry().WithTracing(builder => builder + .AddOtlpExporter(o => o.Protocol = OtlpExportProtocol.HttpProtobuf)); using var serviceProvider = services.BuildServiceProvider(); From 09ef2947fce6bdac057b6433d9d464322f55e701 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 12:09:33 -0800 Subject: [PATCH 23/48] Test fixup. --- .../BasicTests.cs | 15 +++++++-------- .../DependencyInjectionConfigTests.cs | 4 ++-- ...equestsCollectionsIsAccordingToTheSpecTests.cs | 5 +++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs index 5c1e9548fad..29896d1a9f2 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs @@ -655,9 +655,10 @@ public async Task ActivitiesStartedInMiddlewareBySettingHostActivityToNullShould builder.ConfigureTestServices((IServiceCollection services) => { services.AddSingleton(new TestNullHostActivityMiddlewareImpl(activitySourceName, activityName)); - services.AddOpenTelemetryTracing((builder) => builder.AddAspNetCoreInstrumentation() - .AddSource(activitySourceName) - .AddInMemoryExporter(exportedItems)); + services.AddOpenTelemetry().WithTracing(builder => builder + .AddAspNetCoreInstrumentation() + .AddSource(activitySourceName) + .AddInMemoryExporter(exportedItems)); }); builder.ConfigureLogging(loggingBuilder => loggingBuilder.ClearProviders()); }) @@ -692,11 +693,9 @@ public async Task UserRegisteredActivitySourceIsUsedForActivityCreationByAspNetC var exportedItems = new List(); void ConfigureTestServices(IServiceCollection services) { - services.AddOpenTelemetryTracing(options => - { - options.AddAspNetCoreInstrumentation() - .AddInMemoryExporter(exportedItems); - }); + services.AddOpenTelemetry().WithTracing(builder => builder + .AddAspNetCoreInstrumentation() + .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 32fa500d0a4..ee11d5f4fe5 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs @@ -43,8 +43,8 @@ public void TestDIConfig(string name) bool optionsPickedFromDI = false; void ConfigureTestServices(IServiceCollection services) { - services.AddOpenTelemetryTracing( - builder => builder.AddAspNetCoreInstrumentation(name, configureAspNetCoreInstrumentationOptions: null)); + services.AddOpenTelemetry().WithTracing(builder => builder + .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 930bbcd0eb6..7d2948c57eb 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs @@ -64,8 +64,9 @@ public async Task SuccessfulTemplateControllerCallGeneratesASpan( builder.ConfigureTestServices((IServiceCollection services) => { services.AddSingleton(new TestCallbackMiddlewareImpl(statusCode, reasonPhrase)); - services.AddOpenTelemetryTracing((builder) => builder.AddAspNetCoreInstrumentation(options => options.RecordException = recordException) - .AddInMemoryExporter(exportedItems)); + services.AddOpenTelemetry().WithTracing(builder => builder + .AddAspNetCoreInstrumentation(options => options.RecordException = recordException) + .AddInMemoryExporter(exportedItems)); }); builder.ConfigureLogging(loggingBuilder => loggingBuilder.ClearProviders()); }) From c9f33abb7576b5a1eba39ea6d853eda29f98b721 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 12:19:09 -0800 Subject: [PATCH 24/48] Test fixup. --- .../HostingMeterExtensionTests.cs | 83 ++++---------- .../HostingTracerExtensionTests.cs | 103 ++++-------------- .../InMemoryExporterMetricsExtensionsTests.cs | 2 +- 3 files changed, 41 insertions(+), 147 deletions(-) diff --git a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs index 41853e4bff2..dcc9598c5f8 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingMeterExtensionTests.cs @@ -14,7 +14,6 @@ // limitations under the License. // -using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; @@ -28,20 +27,20 @@ namespace OpenTelemetry.Extensions.Hosting.Tests public class HostingMeterExtensionTests { [Fact] - public async Task AddOpenTelemetryMeterProviderInstrumentationCreationAndDisposal() + public async Task AddOpenTelemetry_StartWithHost_CreationAndDisposal() { var callbackRun = false; var builder = new HostBuilder().ConfigureServices(services => { - services.AddOpenTelemetryMetrics(builder => - { - builder.AddInstrumentation(() => - { - callbackRun = true; - return new object(); - }); - }); + services.AddOpenTelemetry() + .WithMetrics(builder => builder + .AddInstrumentation(() => + { + callbackRun = true; + return new object(); + })) + .StartWithHost(); }); var host = builder.Build(); @@ -62,49 +61,7 @@ public async Task AddOpenTelemetryMeterProviderInstrumentationCreationAndDisposa } [Fact] - public void AddOpenTelemetryMeterProvider_HostBuilt_OpenTelemetrySdk_RegisteredAsSingleton() - { - var builder = new HostBuilder().ConfigureServices(services => - { - services.AddOpenTelemetryMetrics(); - }); - - var host = builder.Build(); - - var meterProvider1 = host.Services.GetRequiredService(); - var meterProvider2 = host.Services.GetRequiredService(); - - Assert.Same(meterProvider1, meterProvider2); - } - - [Fact] - public void AddOpenTelemetryMeterProvider_BadArgs_NullServiceCollection() - { - ServiceCollection services = null; - Assert.Throws(() => services.AddOpenTelemetryMetrics(null)); - - services = new(); - Assert.Throws(() => services.AddOpenTelemetryMetrics(null)); - } - - [Fact] - public void AddOpenTelemetryMetrics_MultipleCallsConfigureSingleProvider() - { - var services = new ServiceCollection(); - - services.AddOpenTelemetryMetrics(builder => builder.AddMeter("TestSourceBuilder1")); - services.AddOpenTelemetryMetrics(); - services.AddOpenTelemetryMetrics(builder => builder.AddMeter("TestSourceBuilder2")); - - using var serviceProvider = services.BuildServiceProvider(); - - var providers = serviceProvider.GetServices(); - - Assert.Single(providers); - } - - [Fact] - public async Task AddOpenTelemetryMetrics_HostConfigurationHonoredTest() + public async Task AddOpenTelemetry_StartWithHost_HostConfigurationHonoredTest() { bool configureBuilderCalled = false; @@ -118,19 +75,19 @@ public async Task AddOpenTelemetryMetrics_HostConfigurationHonoredTest() }) .ConfigureServices(services => { - services.AddOpenTelemetryMetrics(builder => - { - builder.ConfigureBuilder((sp, builder) => - { - configureBuilderCalled = true; + services.AddOpenTelemetry() + .WithMetrics(builder => builder + .ConfigureBuilder((sp, builder) => + { + configureBuilderCalled = true; - var configuration = sp.GetRequiredService(); + var configuration = sp.GetRequiredService(); - var testKeyValue = configuration.GetValue("TEST_KEY", null); + var testKeyValue = configuration.GetValue("TEST_KEY", null); - Assert.Equal("TEST_KEY_VALUE", testKeyValue); - }); - }); + 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 7e90079d36a..2c1f666dc6d 100644 --- a/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs +++ b/test/OpenTelemetry.Extensions.Hosting.Tests/HostingTracerExtensionTests.cs @@ -14,7 +14,6 @@ // limitations under the License. // -using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; @@ -28,20 +27,20 @@ namespace OpenTelemetry.Extensions.Hosting.Tests public class HostingTracerExtensionTests { [Fact] - public async Task AddOpenTelemetryTracerProviderInstrumentationCreationAndDisposal() + public async Task AddOpenTelemetry_StartWithHost_CreationAndDisposal() { var callbackRun = false; var builder = new HostBuilder().ConfigureServices(services => { - services.AddOpenTelemetryTracing(builder => - { - builder.AddInstrumentation(() => - { - callbackRun = true; - return new object(); - }); - }); + services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddInstrumentation(() => + { + callbackRun = true; + return new object(); + })) + .StartWithHost(); }); var host = builder.Build(); @@ -61,70 +60,8 @@ public async Task AddOpenTelemetryTracerProviderInstrumentationCreationAndDispos Assert.True(callbackRun); } - [Theory] - [InlineData(false, false)] - [InlineData(true, false)] - [InlineData(false, true)] - [InlineData(true, true)] - public void AddOpenTelemetryTracerProvider_HostBuilt_OpenTelemetrySdk_RegisteredAsSingleton(bool callPreConfigure, bool callPostConfigure) - { - bool preConfigureCalled = false; - bool postConfigureCalled = false; - - var builder = new HostBuilder().ConfigureServices(services => - { - if (callPreConfigure) - { - services.ConfigureOpenTelemetryTracing(builder => builder.ConfigureBuilder((sp, builder) => preConfigureCalled = true)); - } - - services.AddOpenTelemetryTracing(); - - if (callPostConfigure) - { - services.ConfigureOpenTelemetryTracing(builder => builder.ConfigureBuilder((sp, builder) => postConfigureCalled = true)); - } - }); - - var host = builder.Build(); - - var tracerProvider1 = host.Services.GetRequiredService(); - var tracerProvider2 = host.Services.GetRequiredService(); - - Assert.Same(tracerProvider1, tracerProvider2); - - Assert.Equal(callPreConfigure, preConfigureCalled); - Assert.Equal(callPostConfigure, postConfigureCalled); - } - - [Fact] - public void AddOpenTelemetryTracerProvider_BadArgs_NullServiceCollection() - { - ServiceCollection services = null; - Assert.Throws(() => services.AddOpenTelemetryTracing()); - - services = new(); - Assert.Throws(() => services.AddOpenTelemetryTracing(null)); - } - - [Fact] - public void AddOpenTelemetryTracing_MultipleCallsConfigureSingleProvider() - { - var services = new ServiceCollection(); - - services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSourceBuilder1")); - services.AddOpenTelemetryTracing(); - services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSourceBuilder2")); - - using var serviceProvider = services.BuildServiceProvider(); - - var providers = serviceProvider.GetServices(); - - Assert.Single(providers); - } - [Fact] - public async Task AddOpenTelemetryTracing_HostConfigurationHonoredTest() + public async Task AddOpenTelemetry_StartWithHost_HostConfigurationHonoredTest() { bool configureBuilderCalled = false; @@ -138,19 +75,19 @@ public async Task AddOpenTelemetryTracing_HostConfigurationHonoredTest() }) .ConfigureServices(services => { - services.AddOpenTelemetryTracing(builder => - { - builder.ConfigureBuilder((sp, builder) => - { - configureBuilderCalled = true; + services.AddOpenTelemetry() + .WithTracing(builder => builder + .ConfigureBuilder((sp, builder) => + { + configureBuilderCalled = true; - var configuration = sp.GetRequiredService(); + var configuration = sp.GetRequiredService(); - var testKeyValue = configuration.GetValue("TEST_KEY", null); + var testKeyValue = configuration.GetValue("TEST_KEY", null); - Assert.Equal("TEST_KEY_VALUE", testKeyValue); - }); - }); + 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 fc39977157b..c749b6f9ccb 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.AddOpenTelemetryMetrics(configure)) + .ConfigureServices(services => services.AddOpenTelemetry().WithMetrics(configure).StartWithHost()) .Configure(app => app.Run(httpContext => { testAction.Invoke(); From 3e89e157c2b8800e5d12908e71c2d14a4616db24 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 12:29:06 -0800 Subject: [PATCH 25/48] CHANGELOG patch. --- src/OpenTelemetry/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index f9a7f3013e4..aa47df8e0da 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -7,6 +7,11 @@ `AddEnvironmentVariableDetector` extension (Logs) ([#3889](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3889)) +* Refactored `AddInstrumentation`, `ConfigureServices` and `ConfigureBuilder` + APIs into the OpenTelemetry.DependencyInjection package and added the + `IServiceCollection.AddOpenTelemetry` API + ([#3923](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3923)) + ## 1.4.0-beta.3 Released 2022-Nov-07 From d5e4be8f6dd220e9c588394dfbc116fa83f53612 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 12:32:12 -0800 Subject: [PATCH 26/48] Add test project. --- OpenTelemetry.sln | 15 ++++++------ ...Telemetry.DependencyInjection.Tests.csproj | 23 +++++++++++++++++++ 2 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj diff --git a/OpenTelemetry.sln b/OpenTelemetry.sln index 88350deabdc..09334f0f2d7 100644 --- a/OpenTelemetry.sln +++ b/OpenTelemetry.sln @@ -238,12 +238,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "redaction", "docs\logs\reda EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Exporter.OpenTelemetryProtocol.Grpc", "src\OpenTelemetry.Exporter.OpenTelemetryProtocol.Grpc\OpenTelemetry.Exporter.OpenTelemetryProtocol.Grpc.csproj", "{7263001A-49F8-4C3C-AAA8-998F12DAAF64}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenTelemetry.Exporter.Console.Tests", "test\OpenTelemetry.Exporter.Console.Tests\OpenTelemetry.Exporter.Console.Tests.csproj", "{011E70E1-152A-47BB-AF83-12DD12B125ED}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "getting-started-jaeger", "docs\trace\getting-started-jaeger\getting-started-jaeger.csproj", "{329AD438-6D15-4432-99BE-B0E85F00B3CB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Exporter.Console.Tests", "test\OpenTelemetry.Exporter.Console.Tests\OpenTelemetry.Exporter.Console.Tests.csproj", "{011E70E1-152A-47BB-AF83-12DD12B125ED}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.DependencyInjection", "src\OpenTelemetry.DependencyInjection\OpenTelemetry.DependencyInjection.csproj", "{171A87CB-393C-4296-913F-E704CD8CEAE9}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.DependencyInjection.Tests", "test\OpenTelemetry.DependencyInjection.Tests\OpenTelemetry.DependencyInjection.Tests.csproj", "{662476AA-5875-4E74-B992-DDF309168EFB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -502,14 +502,14 @@ Global {011E70E1-152A-47BB-AF83-12DD12B125ED}.Debug|Any CPU.Build.0 = Debug|Any CPU {011E70E1-152A-47BB-AF83-12DD12B125ED}.Release|Any CPU.ActiveCfg = Release|Any CPU {011E70E1-152A-47BB-AF83-12DD12B125ED}.Release|Any CPU.Build.0 = Release|Any CPU - {329AD438-6D15-4432-99BE-B0E85F00B3CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {329AD438-6D15-4432-99BE-B0E85F00B3CB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {329AD438-6D15-4432-99BE-B0E85F00B3CB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {329AD438-6D15-4432-99BE-B0E85F00B3CB}.Release|Any CPU.Build.0 = Release|Any CPU {171A87CB-393C-4296-913F-E704CD8CEAE9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {171A87CB-393C-4296-913F-E704CD8CEAE9}.Debug|Any CPU.Build.0 = Debug|Any CPU {171A87CB-393C-4296-913F-E704CD8CEAE9}.Release|Any CPU.ActiveCfg = Release|Any CPU {171A87CB-393C-4296-913F-E704CD8CEAE9}.Release|Any CPU.Build.0 = Release|Any CPU + {662476AA-5875-4E74-B992-DDF309168EFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {662476AA-5875-4E74-B992-DDF309168EFB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {662476AA-5875-4E74-B992-DDF309168EFB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {662476AA-5875-4E74-B992-DDF309168EFB}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -547,7 +547,6 @@ Global {9A07D215-90AC-4BAF-BCDB-73D74FD3A5C5} = {3862190B-E2C5-418E-AFDC-DB281FB5C705} {5FDAF679-DE5A-4C73-A49B-8ABCF2399229} = {77C7929A-2EED-4AA6-8705-B5C443C8AA0F} {A2DF46DE-50D7-4887-8C9D-4BD79CA19FAA} = {3862190B-E2C5-418E-AFDC-DB281FB5C705} - {329AD438-6D15-4432-99BE-B0E85F00B3CB} = {5B7FB835-3FFF-4BC2-99C5-A5B5FAE3C818} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {55639B5C-0770-4A22-AB56-859604650521} diff --git a/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj b/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj new file mode 100644 index 00000000000..e01a61131ce --- /dev/null +++ b/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj @@ -0,0 +1,23 @@ + + + Unit test project for OpenTelemetry .NET dependency injection extensions + + net7.0;net6.0 + $(TargetFrameworks);net462 + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + + + From 7dfdb13eae74e0572ccd5b7baf6cd775525f8978 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 12:44:28 -0800 Subject: [PATCH 27/48] Cleanup. --- .../Metrics/IConfigureMeterProviderBuilder.cs | 2 -- .../Metrics/IMeterProviderBuilder.cs | 1 - ...elemetryDependencyInjectionMeterProviderBuilderExtensions.cs | 1 - ...etryDependencyInjectionMetricsServiceCollectionExtensions.cs | 1 - .../OpenTelemetry.DependencyInjection.csproj | 1 + .../Trace/IConfigureTracerProviderBuilder.cs | 2 -- .../Trace/ITracerProviderBuilder.cs | 1 - ...lemetryDependencyInjectionTracerProviderBuilderExtensions.cs | 1 - ...etryDependencyInjectionTracingServiceCollectionExtensions.cs | 1 - 9 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs index 72924dd095f..0176e2be7c7 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs @@ -14,8 +14,6 @@ // limitations under the License. // -using System; - namespace OpenTelemetry.Metrics; /// diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs index 97a310439ee..8b0766bf9cf 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs @@ -14,7 +14,6 @@ // limitations under the License. // -using System; using Microsoft.Extensions.DependencyInjection; namespace OpenTelemetry.Metrics; diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs index ede8608b489..3621124668f 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs @@ -14,7 +14,6 @@ // limitations under the License. // -using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using OpenTelemetry.Internal; diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs index a9b8c9abd10..e87d2fd8a5c 100644 --- a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs @@ -14,7 +14,6 @@ // limitations under the License. // -using System; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; diff --git a/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj b/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj index 8150c073de0..5f497892f00 100644 --- a/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj +++ b/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj @@ -8,6 +8,7 @@ core- enable latest-all + enable diff --git a/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs index 7e4c85f4899..f09bcc05a91 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs @@ -14,8 +14,6 @@ // limitations under the License. // -using System; - namespace OpenTelemetry.Trace; /// diff --git a/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs b/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs index fa6753be27b..bfb3e499cd7 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs @@ -14,7 +14,6 @@ // limitations under the License. // -using System; using Microsoft.Extensions.DependencyInjection; namespace OpenTelemetry.Trace; diff --git a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs index a7c7a567fbd..f92c5456469 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs @@ -14,7 +14,6 @@ // limitations under the License. // -using System; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using OpenTelemetry.Internal; diff --git a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs index 26c052764d9..f7ff9c2a831 100644 --- a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs +++ b/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs @@ -14,7 +14,6 @@ // limitations under the License. // -using System; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; From f9727322f23b351661c6a9b9e4685489c7ce01e2 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 12:54:40 -0800 Subject: [PATCH 28/48] Added configure tests. --- src/OpenTelemetry.Api/Internal/Guard.cs | 2 + ...Telemetry.DependencyInjection.Tests.csproj | 4 + .../ServiceCollectionExtensionsTests.cs | 106 ++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 test/OpenTelemetry.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs diff --git a/src/OpenTelemetry.Api/Internal/Guard.cs b/src/OpenTelemetry.Api/Internal/Guard.cs index 7ff9b57d8b4..ce97088adbc 100644 --- a/src/OpenTelemetry.Api/Internal/Guard.cs +++ b/src/OpenTelemetry.Api/Internal/Guard.cs @@ -14,11 +14,13 @@ // limitations under the License. // +#pragma warning disable IDE0005 // Using directive is unnecessary. Note: Projects using implicit usings warn on System & System.Threading using System; using System.Diagnostics; using System.Globalization; using System.Runtime.CompilerServices; using System.Threading; +#pragma warning restore IDE0005 // Using directive is unnecessary. #if !NET6_0_OR_GREATER namespace System.Runtime.CompilerServices diff --git a/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj b/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj index e01a61131ce..bfcb3427cec 100644 --- a/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj +++ b/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj @@ -4,6 +4,9 @@ net7.0;net6.0 $(TargetFrameworks);net462 + enable + latest-all + enable @@ -17,6 +20,7 @@ all runtime; build; native; contentfiles; analyzers + diff --git a/test/OpenTelemetry.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs b/test/OpenTelemetry.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs new file mode 100644 index 00000000000..2556b998773 --- /dev/null +++ b/test/OpenTelemetry.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs @@ -0,0 +1,106 @@ +// +// 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 OpenTelemetry.Metrics; +using OpenTelemetry.Trace; +using Xunit; + +namespace OpenTelemetry.DependencyInjection.Tests; + +public class ServiceCollectionExtensionsTests +{ + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(3)] + public void ConfigureOpenTelemetryTracerProvider(int numberOfCalls) + { + var invocations = 0; + + var services = new ServiceCollection(); + + for (int i = 0; i < numberOfCalls; i++) + { + services.ConfigureOpenTelemetryTracerProvider((sp, builder) => invocations++); + } + + using var serviceProvider = services.BuildServiceProvider(); + + var registrations = serviceProvider.GetServices(); + + var builder = new NoopTracerProviderBuilder(); + + foreach (var registration in registrations) + { + registration.ConfigureBuilder(serviceProvider, builder); + } + + Assert.Equal(invocations, registrations.Count()); + Assert.Equal(numberOfCalls, registrations.Count()); + } + + [Theory] + [InlineData(0)] + [InlineData(1)] + [InlineData(3)] + public void ConfigureOpenTelemetryMeterProvider(int numberOfCalls) + { + var invocations = 0; + + var services = new ServiceCollection(); + + for (int i = 0; i < numberOfCalls; i++) + { + services.ConfigureOpenTelemetryMeterProvider((sp, builder) => invocations++); + } + + using var serviceProvider = services.BuildServiceProvider(); + + var registrations = serviceProvider.GetServices(); + + var builder = new NoopMeterProviderBuilder(); + + foreach (var registration in registrations) + { + registration.ConfigureBuilder(serviceProvider, builder); + } + + Assert.Equal(invocations, registrations.Count()); + Assert.Equal(numberOfCalls, registrations.Count()); + } + + private sealed class NoopTracerProviderBuilder : TracerProviderBuilder + { + public override TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) + => throw new NotImplementedException(); + + public override TracerProviderBuilder AddLegacySource(string operationName) + => throw new NotImplementedException(); + + public override TracerProviderBuilder AddSource(params string[] names) + => throw new NotImplementedException(); + } + + private sealed class NoopMeterProviderBuilder : MeterProviderBuilder + { + public override MeterProviderBuilder AddInstrumentation(Func instrumentationFactory) + => throw new NotImplementedException(); + + public override MeterProviderBuilder AddMeter(params string[] names) + => throw new NotImplementedException(); + } +} From adb8d897bf05d7178ff54504dffb2f4cc01c4b4a Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 13:39:20 -0800 Subject: [PATCH 29/48] MeterProviderBuilder extensions tests. --- .../MeterProviderBuilderExtensionsTests.cs | 144 ++++++++++++++++++ .../ServiceCollectionExtensionsTests.cs | 29 +--- .../TestMeterProviderBuilder.cs | 140 +++++++++++++++++ .../TestTracerProviderBuilder.cs | 58 +++++++ 4 files changed, 344 insertions(+), 27 deletions(-) create mode 100644 test/OpenTelemetry.DependencyInjection.Tests/MeterProviderBuilderExtensionsTests.cs create mode 100644 test/OpenTelemetry.DependencyInjection.Tests/TestMeterProviderBuilder.cs create mode 100644 test/OpenTelemetry.DependencyInjection.Tests/TestTracerProviderBuilder.cs diff --git a/test/OpenTelemetry.DependencyInjection.Tests/MeterProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.DependencyInjection.Tests/MeterProviderBuilderExtensionsTests.cs new file mode 100644 index 00000000000..69e7755ca0b --- /dev/null +++ b/test/OpenTelemetry.DependencyInjection.Tests/MeterProviderBuilderExtensionsTests.cs @@ -0,0 +1,144 @@ +// +// 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 OpenTelemetry.Metrics; +using Xunit; + +namespace OpenTelemetry.DependencyInjection.Tests; + +public class MeterProviderBuilderExtensionsTests +{ + [Fact] + public void AddInstrumentationFromServiceProviderTest() + { + using var builder = new TestMeterProviderBuilder(); + + builder.AddInstrumentation(); + + var serviceProvider = builder.BuildServiceProvider(); + + var instrumentation = serviceProvider.GetRequiredService(); + + Assert.NotNull(instrumentation); + + var registrationCount = builder.InvokeRegistrations(); + + Assert.Equal(1, registrationCount); + Assert.Single(builder.Instrumentation); + Assert.Equal(instrumentation, builder.Instrumentation[0]); + } + + [Fact] + public void AddInstrumentationUsingInstanceTest() + { + using var builder = new TestMeterProviderBuilder(); + + var instrumentation = new TestInstrumentation(); + + builder.AddInstrumentation(instrumentation); + + var serviceProvider = builder.BuildServiceProvider(); + var registrationCount = builder.InvokeRegistrations(); + + Assert.Equal(1, registrationCount); + Assert.Single(builder.Instrumentation); + Assert.Equal(instrumentation, builder.Instrumentation[0]); + } + + [Fact] + public void AddInstrumentationUsingFactoryTest() + { + using var builder = new TestMeterProviderBuilder(); + + var instrumentation = new TestInstrumentation(); + + builder.AddInstrumentation(sp => + { + Assert.NotNull(sp); + + return instrumentation; + }); + + var serviceProvider = builder.BuildServiceProvider(); + var registrationCount = builder.InvokeRegistrations(); + + Assert.Equal(1, registrationCount); + Assert.Single(builder.Instrumentation); + Assert.Equal(instrumentation, builder.Instrumentation[0]); + } + + [Fact] + public void AddInstrumentationUsingFactoryAndProviderTest() + { + using var builder = new TestMeterProviderBuilder(); + + var instrumentation = new TestInstrumentation(); + + builder.AddInstrumentation((sp, provider) => + { + Assert.NotNull(sp); + Assert.NotNull(provider); + + return instrumentation; + }); + + var serviceProvider = builder.BuildServiceProvider(); + var registrationCount = builder.InvokeRegistrations(); + + Assert.Equal(1, registrationCount); + Assert.Single(builder.Instrumentation); + Assert.Equal(instrumentation, builder.Instrumentation[0]); + } + + [Fact] + public void ConfigureServicesTest() + { + using var builder = new TestMeterProviderBuilder(); + + builder.ConfigureServices(services => services.TryAddSingleton()); + + var serviceProvider = builder.BuildServiceProvider(); + + serviceProvider.GetRequiredService(); + } + + [Fact] + public void ConfigureBuilderTest() + { + using var builder = new TestMeterProviderBuilder(); + + builder.ConfigureBuilder((sp, builder) => + { + Assert.NotNull(sp); + Assert.NotNull(builder); + + builder.AddMeter("HelloWorld"); + }); + + var serviceProvider = builder.BuildServiceProvider(); + var registrationCount = builder.InvokeRegistrations(); + + Assert.Equal(1, registrationCount); + Assert.Single(builder.Meters); + Assert.Equal("HelloWorld", builder.Meters[0]); + } + + private sealed class TestInstrumentation + { + } +} diff --git a/test/OpenTelemetry.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs b/test/OpenTelemetry.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs index 2556b998773..edfeeee4b02 100644 --- a/test/OpenTelemetry.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs +++ b/test/OpenTelemetry.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs @@ -42,11 +42,9 @@ public void ConfigureOpenTelemetryTracerProvider(int numberOfCalls) var registrations = serviceProvider.GetServices(); - var builder = new NoopTracerProviderBuilder(); - foreach (var registration in registrations) { - registration.ConfigureBuilder(serviceProvider, builder); + registration.ConfigureBuilder(serviceProvider, null!); } Assert.Equal(invocations, registrations.Count()); @@ -72,35 +70,12 @@ public void ConfigureOpenTelemetryMeterProvider(int numberOfCalls) var registrations = serviceProvider.GetServices(); - var builder = new NoopMeterProviderBuilder(); - foreach (var registration in registrations) { - registration.ConfigureBuilder(serviceProvider, builder); + registration.ConfigureBuilder(serviceProvider, null!); } Assert.Equal(invocations, registrations.Count()); Assert.Equal(numberOfCalls, registrations.Count()); } - - private sealed class NoopTracerProviderBuilder : TracerProviderBuilder - { - public override TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) - => throw new NotImplementedException(); - - public override TracerProviderBuilder AddLegacySource(string operationName) - => throw new NotImplementedException(); - - public override TracerProviderBuilder AddSource(params string[] names) - => throw new NotImplementedException(); - } - - private sealed class NoopMeterProviderBuilder : MeterProviderBuilder - { - public override MeterProviderBuilder AddInstrumentation(Func instrumentationFactory) - => throw new NotImplementedException(); - - public override MeterProviderBuilder AddMeter(params string[] names) - => throw new NotImplementedException(); - } } diff --git a/test/OpenTelemetry.DependencyInjection.Tests/TestMeterProviderBuilder.cs b/test/OpenTelemetry.DependencyInjection.Tests/TestMeterProviderBuilder.cs new file mode 100644 index 00000000000..53dd3ed9df1 --- /dev/null +++ b/test/OpenTelemetry.DependencyInjection.Tests/TestMeterProviderBuilder.cs @@ -0,0 +1,140 @@ +// +// 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 OpenTelemetry.Metrics; + +namespace OpenTelemetry.DependencyInjection.Tests; + +public sealed class TestMeterProviderBuilder : MeterProviderBuilder, IMeterProviderBuilder, IDisposable +{ + public TestMeterProviderBuilder() + { + this.Services = new ServiceCollection(); + } + + public IServiceCollection? Services { get; private set; } + + public ServiceProvider? ServiceProvider { get; private set; } + + public List Meters { get; } = new(); + + public List Instrumentation { get; } = new(); + + public MeterProvider? Provider { get; private set; } + + public override MeterProviderBuilder AddInstrumentation(Func instrumentationFactory) + { + if (this.Services != null) + { + this.ConfigureBuilder((sp, builder) => builder.AddInstrumentation(instrumentationFactory)); + } + else + { + this.Instrumentation.Add(instrumentationFactory()); + } + + return this; + } + + public override MeterProviderBuilder AddMeter(params string[] names) + { + if (this.Services != null) + { + this.ConfigureBuilder((sp, builder) => builder.AddMeter(names)); + } + else + { + foreach (string name in names) + { + this.Meters.Add(name); + } + } + + return this; + } + + public MeterProviderBuilder ConfigureBuilder(Action configure) + { + var services = this.Services; + if (services != null) + { + services.ConfigureOpenTelemetryMeterProvider(configure); + } + else + { + var serviceProvider = this.ServiceProvider ?? throw new InvalidOperationException("Test failure"); + configure(serviceProvider, this); + } + + return this; + } + + public MeterProviderBuilder ConfigureServices(Action configure) + { + var services = this.Services; + if (services != null) + { + configure(services); + } + else + { + throw new NotSupportedException("Services cannot be configured after the ServiceProvider has been created."); + } + + return this; + } + + public IServiceProvider BuildServiceProvider() + { + var services = this.Services ?? throw new InvalidOperationException(); + + this.Services = null; + + this.Provider = new NoopMeterProvider(); + + return this.ServiceProvider = services.BuildServiceProvider(); + } + + public int InvokeRegistrations() + { + var serviceProvider = this.ServiceProvider ?? throw new InvalidOperationException(); + + var registrations = serviceProvider.GetServices(); + + var count = 0; + + foreach (var registration in registrations) + { + registration.ConfigureBuilder(serviceProvider, this); + count++; + } + + return count; + } + + public void Dispose() + { + this.ServiceProvider?.Dispose(); + } + + MeterProviderBuilder IDeferredMeterProviderBuilder.Configure(Action configure) + => this.ConfigureBuilder(configure); + + private sealed class NoopMeterProvider : MeterProvider + { + } +} diff --git a/test/OpenTelemetry.DependencyInjection.Tests/TestTracerProviderBuilder.cs b/test/OpenTelemetry.DependencyInjection.Tests/TestTracerProviderBuilder.cs new file mode 100644 index 00000000000..4686eee681a --- /dev/null +++ b/test/OpenTelemetry.DependencyInjection.Tests/TestTracerProviderBuilder.cs @@ -0,0 +1,58 @@ +// +// 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 OpenTelemetry.Trace; + +namespace OpenTelemetry.DependencyInjection.Tests; + +public sealed class TestTracerProviderBuilder : TracerProviderBuilder, ITracerProviderBuilder +{ + public TestTracerProviderBuilder() + { + this.Services = new ServiceCollection(); + } + + public IServiceCollection Services { get; } + + public TracerProvider? Provider => null; + + public override TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) + => this.ConfigureBuilder((sp, builder) => builder.AddInstrumentation(instrumentationFactory)); + + public override TracerProviderBuilder AddLegacySource(string operationName) + => this.ConfigureBuilder((sp, builder) => builder.AddLegacySource(operationName)); + + public override TracerProviderBuilder AddSource(params string[] names) + => this.ConfigureBuilder((sp, builder) => builder.AddSource(names)); + + public TracerProviderBuilder ConfigureBuilder(Action configure) + { + this.Services.ConfigureOpenTelemetryTracerProvider(configure); + + return this; + } + + public TracerProviderBuilder ConfigureServices(Action configure) + { + configure(this.Services); + + return this; + } + + TracerProviderBuilder IDeferredTracerProviderBuilder.Configure(Action configure) + => this.ConfigureBuilder(configure); +} From 311831ef5664b6918aef2916e3f55c9f6243a214 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 13:46:31 -0800 Subject: [PATCH 30/48] TracerProviderBuilder extensions tests --- .../TestTracerProviderBuilder.cs | 114 +++++++++++++- .../TracerProviderBuilderExtensionsTests.cs | 144 ++++++++++++++++++ 2 files changed, 250 insertions(+), 8 deletions(-) create mode 100644 test/OpenTelemetry.DependencyInjection.Tests/TracerProviderBuilderExtensionsTests.cs diff --git a/test/OpenTelemetry.DependencyInjection.Tests/TestTracerProviderBuilder.cs b/test/OpenTelemetry.DependencyInjection.Tests/TestTracerProviderBuilder.cs index 4686eee681a..ae161c6b1ff 100644 --- a/test/OpenTelemetry.DependencyInjection.Tests/TestTracerProviderBuilder.cs +++ b/test/OpenTelemetry.DependencyInjection.Tests/TestTracerProviderBuilder.cs @@ -19,40 +19,138 @@ namespace OpenTelemetry.DependencyInjection.Tests; -public sealed class TestTracerProviderBuilder : TracerProviderBuilder, ITracerProviderBuilder +public sealed class TestTracerProviderBuilder : TracerProviderBuilder, ITracerProviderBuilder, IDisposable { public TestTracerProviderBuilder() { this.Services = new ServiceCollection(); } - public IServiceCollection Services { get; } + public IServiceCollection? Services { get; private set; } - public TracerProvider? Provider => null; + public ServiceProvider? ServiceProvider { get; private set; } + + public List Sources { get; } = new(); + + public List LegacySources { get; } = new(); + + public List Instrumentation { get; } = new(); + + public TracerProvider? Provider { get; private set; } public override TracerProviderBuilder AddInstrumentation(Func instrumentationFactory) - => this.ConfigureBuilder((sp, builder) => builder.AddInstrumentation(instrumentationFactory)); + { + if (this.Services != null) + { + this.ConfigureBuilder((sp, builder) => builder.AddInstrumentation(instrumentationFactory)); + } + else + { + this.Instrumentation.Add(instrumentationFactory()); + } + + return this; + } public override TracerProviderBuilder AddLegacySource(string operationName) - => this.ConfigureBuilder((sp, builder) => builder.AddLegacySource(operationName)); + { + if (this.Services != null) + { + this.ConfigureBuilder((sp, builder) => builder.AddLegacySource(operationName)); + } + else + { + this.LegacySources.Add(operationName); + } + + return this; + } public override TracerProviderBuilder AddSource(params string[] names) - => this.ConfigureBuilder((sp, builder) => builder.AddSource(names)); + { + if (this.Services != null) + { + this.ConfigureBuilder((sp, builder) => builder.AddSource(names)); + } + else + { + foreach (string name in names) + { + this.Sources.Add(name); + } + } + + return this; + } public TracerProviderBuilder ConfigureBuilder(Action configure) { - this.Services.ConfigureOpenTelemetryTracerProvider(configure); + var services = this.Services; + if (services != null) + { + services.ConfigureOpenTelemetryTracerProvider(configure); + } + else + { + var serviceProvider = this.ServiceProvider ?? throw new InvalidOperationException("Test failure"); + configure(serviceProvider, this); + } return this; } public TracerProviderBuilder ConfigureServices(Action configure) { - configure(this.Services); + var services = this.Services; + if (services != null) + { + configure(services); + } + else + { + throw new NotSupportedException("Services cannot be configured after the ServiceProvider has been created."); + } return this; } + public IServiceProvider BuildServiceProvider() + { + var services = this.Services ?? throw new InvalidOperationException(); + + this.Services = null; + + this.Provider = new NoopTracerProvider(); + + return this.ServiceProvider = services.BuildServiceProvider(); + } + + public int InvokeRegistrations() + { + var serviceProvider = this.ServiceProvider ?? throw new InvalidOperationException(); + + var registrations = serviceProvider.GetServices(); + + var count = 0; + + foreach (var registration in registrations) + { + registration.ConfigureBuilder(serviceProvider, this); + count++; + } + + return count; + } + + public void Dispose() + { + this.ServiceProvider?.Dispose(); + } + TracerProviderBuilder IDeferredTracerProviderBuilder.Configure(Action configure) => this.ConfigureBuilder(configure); + + private sealed class NoopTracerProvider : TracerProvider + { + } } diff --git a/test/OpenTelemetry.DependencyInjection.Tests/TracerProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.DependencyInjection.Tests/TracerProviderBuilderExtensionsTests.cs new file mode 100644 index 00000000000..5a47595efbc --- /dev/null +++ b/test/OpenTelemetry.DependencyInjection.Tests/TracerProviderBuilderExtensionsTests.cs @@ -0,0 +1,144 @@ +// +// 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 OpenTelemetry.Trace; +using Xunit; + +namespace OpenTelemetry.DependencyInjection.Tests; + +public class TracerProviderBuilderExtensionsTests +{ + [Fact] + public void AddInstrumentationFromServiceProviderTest() + { + using var builder = new TestTracerProviderBuilder(); + + builder.AddInstrumentation(); + + var serviceProvider = builder.BuildServiceProvider(); + + var instrumentation = serviceProvider.GetRequiredService(); + + Assert.NotNull(instrumentation); + + var registrationCount = builder.InvokeRegistrations(); + + Assert.Equal(1, registrationCount); + Assert.Single(builder.Instrumentation); + Assert.Equal(instrumentation, builder.Instrumentation[0]); + } + + [Fact] + public void AddInstrumentationUsingInstanceTest() + { + using var builder = new TestTracerProviderBuilder(); + + var instrumentation = new TestInstrumentation(); + + builder.AddInstrumentation(instrumentation); + + var serviceProvider = builder.BuildServiceProvider(); + var registrationCount = builder.InvokeRegistrations(); + + Assert.Equal(1, registrationCount); + Assert.Single(builder.Instrumentation); + Assert.Equal(instrumentation, builder.Instrumentation[0]); + } + + [Fact] + public void AddInstrumentationUsingFactoryTest() + { + using var builder = new TestTracerProviderBuilder(); + + var instrumentation = new TestInstrumentation(); + + builder.AddInstrumentation(sp => + { + Assert.NotNull(sp); + + return instrumentation; + }); + + var serviceProvider = builder.BuildServiceProvider(); + var registrationCount = builder.InvokeRegistrations(); + + Assert.Equal(1, registrationCount); + Assert.Single(builder.Instrumentation); + Assert.Equal(instrumentation, builder.Instrumentation[0]); + } + + [Fact] + public void AddInstrumentationUsingFactoryAndProviderTest() + { + using var builder = new TestTracerProviderBuilder(); + + var instrumentation = new TestInstrumentation(); + + builder.AddInstrumentation((sp, provider) => + { + Assert.NotNull(sp); + Assert.NotNull(provider); + + return instrumentation; + }); + + var serviceProvider = builder.BuildServiceProvider(); + var registrationCount = builder.InvokeRegistrations(); + + Assert.Equal(1, registrationCount); + Assert.Single(builder.Instrumentation); + Assert.Equal(instrumentation, builder.Instrumentation[0]); + } + + [Fact] + public void ConfigureServicesTest() + { + using var builder = new TestTracerProviderBuilder(); + + builder.ConfigureServices(services => services.TryAddSingleton()); + + var serviceProvider = builder.BuildServiceProvider(); + + serviceProvider.GetRequiredService(); + } + + [Fact] + public void ConfigureBuilderTest() + { + using var builder = new TestTracerProviderBuilder(); + + builder.ConfigureBuilder((sp, builder) => + { + Assert.NotNull(sp); + Assert.NotNull(builder); + + builder.AddSource("HelloWorld"); + }); + + var serviceProvider = builder.BuildServiceProvider(); + var registrationCount = builder.InvokeRegistrations(); + + Assert.Equal(1, registrationCount); + Assert.Single(builder.Sources); + Assert.Equal("HelloWorld", builder.Sources[0]); + } + + private sealed class TestInstrumentation + { + } +} From 5a40ee5346bcd0407779b97163fe460ecbae0f2a Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 13:55:11 -0800 Subject: [PATCH 31/48] Some README content. --- .../README.md | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/OpenTelemetry.DependencyInjection/README.md b/src/OpenTelemetry.DependencyInjection/README.md index 5671d1f9bd7..309f2c8f2fb 100644 --- a/src/OpenTelemetry.DependencyInjection/README.md +++ b/src/OpenTelemetry.DependencyInjection/README.md @@ -1,3 +1,25 @@ # OpenTelemetry .NET DependencyInjection -TODO +[![NuGet](https://img.shields.io/nuget/v/OpenTelemetry.DependencyInjection.svg)](https://www.nuget.org/packages/OpenTelemetry.DependencyInjection) +[![NuGet](https://img.shields.io/nuget/dt/OpenTelemetry.DependencyInjection.svg)](https://www.nuget.org/packages/OpenTelemetry.DependencyInjection) + +## Installation + +```shell +dotnet add package --prerelease OpenTelemetry.DependencyInjection +``` + +## Overview + +The OpenTelemetry.DependencyInjection package provides extension methods and +helpers for building `TracerProvider`s and `MeterProvider`s using the +Microsoft.Extensions.DependencyInjection API. + +The Microsoft.Extensions.DependencyInjection package is primarily intended for +library authors who need to integrate with the OpenTelemetry SDK. For more +details see: [Registration extension method guidance for library +authors](../../docs/trace/extending-the-sdk/README.md#registration-extension-method-guidance-for-library-authors). + +## References + +* [OpenTelemetry Project](https://opentelemetry.io/) From cf70bf472f7db9df84e5064ddee910eaae75920d Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 14:12:16 -0800 Subject: [PATCH 32/48] CHANGELOG patch. --- src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md index 8d31ce75b4e..b4a2978d33c 100644 --- a/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md +++ b/src/OpenTelemetry.Extensions.Hosting/CHANGELOG.md @@ -2,6 +2,9 @@ ## Unreleased +* Added the `OpenTelemetryBuilder.StartWithHost` extension. + ([#3923](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3923)) + ## 1.0.0-rc9.9 Released 2022-Nov-07 From 339e28d3e089d3d25fd5e444d001edb27b1f1f19 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 14:22:50 -0800 Subject: [PATCH 33/48] Doc updates. --- .../README.md | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/OpenTelemetry.Extensions.Hosting/README.md b/src/OpenTelemetry.Extensions.Hosting/README.md index e8e35c03383..b76f082bb5b 100644 --- a/src/OpenTelemetry.Extensions.Hosting/README.md +++ b/src/OpenTelemetry.Extensions.Hosting/README.md @@ -21,8 +21,16 @@ and metrics (`MeterProvider`) in [ASP.NET ## Extension method reference -**Note:** The below extension methods target -`Microsoft.Extensions.DependencyInjection.IServiceCollection`. +### Current OpenTelemetry SDK v1.4.0 and newer extensions + +Targeting `OpenTelemetry.OpenTelemetryBuilder`: + +* `StartWithHost`: 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). + +### Obsolete OpenTelemetry SDK pre-1.4.0 extensions **Note:** The below extension methods should be called by application host code only. Library authors see: [Registration extension method guidance for library @@ -37,6 +45,8 @@ and [Building a MeterProvider](../../docs/metrics/customizing-the-sdk/README.md#building-a-meterprovider) for more details. +Targeting `Microsoft.Extensions.DependencyInjection.IServiceCollection`: + * `AddOpenTelemetryTracing`: Configure OpenTelemetry and register an [IHostedService](https://learn.microsoft.com/dotnet/api/microsoft.extensions.hosting.ihostedservice) to automatically start tracing services in the supplied @@ -60,11 +70,10 @@ using OpenTelemetry.Trace; var appBuilder = WebApplication.CreateBuilder(args); -appBuilder.Services.AddOpenTelemetryTracing( - builder => builder.AddConsoleExporter()); - -appBuilder.Services.AddOpenTelemetryMetrics( - builder => builder.AddConsoleExporter()); +appBuilder.Services.AddOpenTelemetry() + .WithTracing(builder => builder.AddConsoleExporter()) + .WithMetrics(builder => builder.AddConsoleExporter()) + .StartWithHost(); var app = appBuilder.Build(); From df95a5af92b5f53e908b95ddc8b602357fbedc2e Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 14:30:12 -0800 Subject: [PATCH 34/48] Example code fixes. --- examples/GrpcService/Startup.cs | 56 ++++++++++--------- .../MicroserviceExample/WebApi/Startup.cs | 18 +++--- .../WorkerService/Program.cs | 16 +++--- 3 files changed, 48 insertions(+), 42 deletions(-) diff --git a/examples/GrpcService/Startup.cs b/examples/GrpcService/Startup.cs index 507db426e28..98f563800e1 100644 --- a/examples/GrpcService/Startup.cs +++ b/examples/GrpcService/Startup.cs @@ -40,34 +40,36 @@ public void ConfigureServices(IServiceCollection services) { services.AddGrpc(); - services.AddOpenTelemetry().WithTracing(builder => - { - builder - .ConfigureResource(r => r.AddService(this.Configuration.GetValue("ServiceName"))) - .AddAspNetCoreInstrumentation(); - - // Switch between Jaeger/Zipkin/Console by setting UseExporter in appsettings.json. - var exporter = this.Configuration.GetValue("UseExporter").ToLowerInvariant(); - switch (exporter) + services.AddOpenTelemetry() + .WithTracing(builder => { - case "jaeger": - builder.AddJaegerExporter(jaegerOptions => - { - jaegerOptions.AgentHost = this.Configuration.GetValue("Jaeger:Host"); - jaegerOptions.AgentPort = this.Configuration.GetValue("Jaeger:Port"); - }); - break; - case "zipkin": - builder.AddZipkinExporter(zipkinOptions => - { - zipkinOptions.Endpoint = new Uri(this.Configuration.GetValue("Zipkin:Endpoint")); - }); - break; - default: - builder.AddConsoleExporter(); - break; - } - }); + builder + .ConfigureResource(r => r.AddService(this.Configuration.GetValue("ServiceName"))) + .AddAspNetCoreInstrumentation(); + + // Switch between Jaeger/Zipkin/Console by setting UseExporter in appsettings.json. + var exporter = this.Configuration.GetValue("UseExporter").ToLowerInvariant(); + switch (exporter) + { + case "jaeger": + builder.AddJaegerExporter(jaegerOptions => + { + jaegerOptions.AgentHost = this.Configuration.GetValue("Jaeger:Host"); + jaegerOptions.AgentPort = this.Configuration.GetValue("Jaeger:Port"); + }); + break; + case "zipkin": + builder.AddZipkinExporter(zipkinOptions => + { + zipkinOptions.Endpoint = new Uri(this.Configuration.GetValue("Zipkin:Endpoint")); + }); + break; + default: + 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 36e25f8a77c..c3d14777a6c 100644 --- a/examples/MicroserviceExample/WebApi/Startup.cs +++ b/examples/MicroserviceExample/WebApi/Startup.cs @@ -41,14 +41,16 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); - services.AddOpenTelemetry().WithTracing((builder) => builder - .AddAspNetCoreInstrumentation() - .AddSource(nameof(MessageSender)) - .AddZipkinExporter(b => - { - var zipkinHostName = Environment.GetEnvironmentVariable("ZIPKIN_HOSTNAME") ?? "localhost"; - b.Endpoint = new Uri($"http://{zipkinHostName}:9411/api/v2/spans"); - })); + services.AddOpenTelemetry() + .WithTracing((builder) => builder + .AddAspNetCoreInstrumentation() + .AddSource(nameof(MessageSender)) + .AddZipkinExporter(b => + { + 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 143cd79c03e..10add6ae111 100644 --- a/examples/MicroserviceExample/WorkerService/Program.cs +++ b/examples/MicroserviceExample/WorkerService/Program.cs @@ -38,13 +38,15 @@ public static IHostBuilder CreateHostBuilder(string[] args) => services.AddSingleton(); - services.AddOpenTelemetry().WithTracing(builder => builder - .AddSource(nameof(MessageReceiver)) - .AddZipkinExporter(b => - { - var zipkinHostName = Environment.GetEnvironmentVariable("ZIPKIN_HOSTNAME") ?? "localhost"; - b.Endpoint = new Uri($"http://{zipkinHostName}:9411/api/v2/spans"); - })); + services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddSource(nameof(MessageReceiver)) + .AddZipkinExporter(b => + { + var zipkinHostName = Environment.GetEnvironmentVariable("ZIPKIN_HOSTNAME") ?? "localhost"; + b.Endpoint = new Uri($"http://{zipkinHostName}:9411/api/v2/spans"); + })) + .StartWithHost(); }); } } From 99c0f84f9f69c3341f375edd25306720493511a0 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 15:08:49 -0800 Subject: [PATCH 35/48] Doc updates. --- docs/trace/customizing-the-sdk/README.md | 58 ++++++++++++++---------- docs/trace/extending-the-sdk/README.md | 13 +++--- 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/docs/trace/customizing-the-sdk/README.md b/docs/trace/customizing-the-sdk/README.md index ead1fd85986..31857eb5f67 100644 --- a/docs/trace/customizing-the-sdk/README.md +++ b/docs/trace/customizing-the-sdk/README.md @@ -411,21 +411,24 @@ var appBuilder = WebApplication.CreateBuilder(args); appBuilder.Services.AddSingleton(); -appBuilder.Services.AddOpenTelemetryTracing(builder => builder - .AddProcessor(); +appBuilder.Services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddProcessor()) + .StartWithHost(); ``` -When using the `AddOpenTelemetryTracing` method the `TracerProvider` does not -own its `IServiceCollection` and instead registers into an existing collection -(typically the collection used is the one managed by the application host). The -`TracerProviderBuilder` will be able to access all services registered into that -collection. For lifecycle management, an [IHostedService +When using the `AddOpenTelemetry` & `WithTracing` extension methods the +`TracerProvider` does not own its `IServiceCollection` and instead registers +into an existing collection (typically the collection used is the one managed by +the application host). The `TracerProviderBuilder` will be able to access all +services registered into that collection. For lifecycle management, the +`StartWithHost` registers an [IHostedService ](https://learn.microsoft.com/dotnet/api/microsoft.extensions.hosting.ihostedservice) -is used to automatically start the `TracerProvider` when the host starts and the -host will automatically shutdown and dispose the `TracerProvider` when it is -shutdown. +which is used to automatically start the `TracerProvider` when the host starts +and the host will automatically shutdown and dispose the `TracerProvider` when +it is shutdown. -**Note:** Multiple calls to `AddOpenTelemetryTracing` will configure the same +**Note:** Multiple calls to `WithTracing` will configure the same `TracerProvider`. Only a single `TraceProvider` may exist in an `IServiceCollection` \ `IServiceProvider`. @@ -451,15 +454,17 @@ shutdown. ```csharp var appBuilder = WebApplication.CreateBuilder(args); - appBuilder.Services.AddOpenTelemetryTracing(builder => builder - .ConfigureBuilder((sp, builder) => - { - builder.AddProcessor( - new MyCustomProcessor( - // Note: This example uses the final IServiceProvider once it is available. - sp.GetRequiredService(), - sp.GetRequiredService>().Value)); - })); + appBuilder.Services.AddOpenTelemetry() + .WithTracing(builder => builder + .ConfigureBuilder((sp, builder) => + { + builder.AddProcessor( + new MyCustomProcessor( + // Note: This example uses the final IServiceProvider once it is available. + sp.GetRequiredService(), + sp.GetRequiredService>().Value)); + })) + .StartWithHost(); ``` **Note:** `ConfigureBuilder` is an advanced API and is expected to be used @@ -612,8 +617,9 @@ var appBuilder = WebApplication.CreateBuilder(args); appBuilder.Services.Configure( appBuilder.Configuration.GetSection("OpenTelemetry:Jaeger")); -appBuilder.Services.AddOpenTelemetryTracing( - builder => builder.AddJaegerExporter()); +appBuilder.Services.AddOpenTelemetry() + .WithTracing(builder => builder.AddJaegerExporter()) + .StartWithHost(); ``` The OpenTelemetry .NET SDK supports running multiple `TracerProvider`s inside @@ -654,7 +660,9 @@ appBuilder.Services.Configure( "JaegerSecondary", appBuilder.Configuration.GetSection("OpenTelemetry:JaegerSecondary")); -appBuilder.Services.AddOpenTelemetryTracing(builder => builder - .AddJaegerExporter(name: "JaegerPrimary", configure: null) - .AddJaegerExporter(name: "JaegerSecondary", configure: null)); +appBuilder.Services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddJaegerExporter(name: "JaegerPrimary", configure: null) + .AddJaegerExporter(name: "JaegerSecondary", configure: null)) + .StartWithHost(); ``` diff --git a/docs/trace/extending-the-sdk/README.md b/docs/trace/extending-the-sdk/README.md index 8d62577cb1b..ec34104adfe 100644 --- a/docs/trace/extending-the-sdk/README.md +++ b/docs/trace/extending-the-sdk/README.md @@ -530,7 +530,7 @@ the target type for registration extension methods. The following example shows how a library might enable tracing and metric support using an `IServiceCollection` extension by calling -`ConfigureOpenTelemetryTracing`. +`ConfigureOpenTelemetryTracerProvider`. ```csharp using Microsoft.Extensions.DependencyInjection.Extensions; @@ -563,7 +563,7 @@ namespace Microsoft.Extensions.DependencyInjection } // Configure OpenTelemetry tracing. - services.ConfigureOpenTelemetryTracing(builder => builder.ConfigureBuilder((sp, builder) => + services.ConfigureOpenTelemetryTracerProvider((sp, builder) => { var options = sp.GetRequiredService>().Get(name); if (options.EnableTracing) @@ -573,7 +573,7 @@ namespace Microsoft.Extensions.DependencyInjection })); // Configure OpenTelemetry metrics. - services.ConfigureOpenTelemetryMetrics(builder => builder.ConfigureBuilder((sp, builder) => + services.ConfigureOpenTelemetryMeterProvider((sp, builder) => { var options = sp.GetRequiredService>().Get(name); if (options.EnableMetrics) @@ -614,13 +614,12 @@ single `AddMyLibrary` extension to configure the library itself and optionally turn on OpenTelemetry integration for multiple signals (tracing & metrics in this case). -**Note:** `ConfigureOpenTelemetryTracing` does not automatically start -OpenTelemetry. The host is responsible for either calling -`AddOpenTelemetryTracing` in the +**Note:** `ConfigureOpenTelemetryTracerProvider` does not automatically start +OpenTelemetry. The host is responsible for either calling `StartWithHost` in the [OpenTelemetry.Extensions.Hosting](../../../src/OpenTelemetry.Extensions.Hosting/README.md) package, calling `Build` when using the `Sdk.CreateTracerProviderBuilder` method, or by accessing the `TracerProvider` from the `IServiceCollection` where -`ConfigureOpenTelemetryTracing` was performed. +`ConfigureOpenTelemetryTracerProvider` was performed. When providing `IServiceCollection` registration extensions: From 8d895e9f5bfd4793a67d1d039635e78e0c42de47 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 15:12:43 -0800 Subject: [PATCH 36/48] Doc updates. --- src/OpenTelemetry.Exporter.Jaeger/README.md | 22 +++++++++------- .../README.md | 22 +++++++++------- src/OpenTelemetry.Exporter.Zipkin/README.md | 16 +++++++----- .../README.md | 26 +++++++++---------- 4 files changed, 46 insertions(+), 40 deletions(-) diff --git a/src/OpenTelemetry.Exporter.Jaeger/README.md b/src/OpenTelemetry.Exporter.Jaeger/README.md index 2a67fb66d42..2e187c4f338 100644 --- a/src/OpenTelemetry.Exporter.Jaeger/README.md +++ b/src/OpenTelemetry.Exporter.Jaeger/README.md @@ -90,17 +90,19 @@ who want to configure the `HttpClient` used by the `JaegerExporter` when implementation if you want to customize the generated `HttpClient`: ```csharp -services.AddOpenTelemetryTracing((builder) => builder - .AddJaegerExporter(o => - { - o.Protocol = JaegerExportProtocol.HttpBinaryThrift; - o.HttpClientFactory = () => +services.AddOpenTelemetry() + .WithTracing((builder) => builder + .AddJaegerExporter(o => { - HttpClient client = new HttpClient(); - client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value"); - return client; - }; - })); + o.Protocol = JaegerExportProtocol.HttpBinaryThrift; + o.HttpClientFactory = () => + { + HttpClient client = new HttpClient(); + 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 8005b5246f3..d2c5f958a00 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/README.md +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/README.md @@ -127,17 +127,19 @@ function with your own implementation if you want to customize the generated `HttpClient`: ```csharp -services.AddOpenTelemetryTracing((builder) => builder - .AddOtlpExporter(o => - { - o.Protocol = OtlpExportProtocol.HttpProtobuf; - o.HttpClientFactory = () => +services.AddOpenTelemetry() + .WithTracing((builder) => builder + .AddOtlpExporter(o => { - HttpClient client = new HttpClient(); - client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value"); - return client; - }; - })); + o.Protocol = OtlpExportProtocol.HttpProtobuf; + o.HttpClientFactory = () => + { + HttpClient client = new HttpClient(); + client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value"); + return client; + }; + })); + .StartWithHost(); ``` For users using diff --git a/src/OpenTelemetry.Exporter.Zipkin/README.md b/src/OpenTelemetry.Exporter.Zipkin/README.md index 7cfd6d2ca11..dea280f4409 100644 --- a/src/OpenTelemetry.Exporter.Zipkin/README.md +++ b/src/OpenTelemetry.Exporter.Zipkin/README.md @@ -83,13 +83,15 @@ replace the function with your own implementation if you want to customize the generated `HttpClient`: ```csharp -services.AddOpenTelemetryTracing((builder) => builder - .AddZipkinExporter(o => o.HttpClientFactory = () => - { - HttpClient client = new HttpClient(); - client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value"); - return client; - })); +services.AddOpenTelemetry() + .WithTracing((builder) => builder + .AddZipkinExporter(o => o.HttpClientFactory = () => + { + HttpClient client = new HttpClient(); + client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value"); + return client; + })); + .StartWithHost(); ``` For users using diff --git a/src/OpenTelemetry.Instrumentation.GrpcNetClient/README.md b/src/OpenTelemetry.Instrumentation.GrpcNetClient/README.md index 9f39c155ada..c6ac1f62ba0 100644 --- a/src/OpenTelemetry.Instrumentation.GrpcNetClient/README.md +++ b/src/OpenTelemetry.Instrumentation.GrpcNetClient/README.md @@ -108,20 +108,20 @@ can be enriched), the name of the event, and the actual raw object. The following code snippet shows how to add additional tags using these options. ```csharp -services.AddOpenTelemetryTracing((builder) => -{ - builder - .AddGrpcClientInstrumentation((options) => - { - options.EnrichWithHttpRequestMessage = (activity, httpRequestMessage) => - { - activity.SetTag("requestVersion", httpRequestMessage.Version); - }; - options.EnrichWithHttpResponseMessage = (activity, httpResponseMessage) => +services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddGrpcClientInstrumentation((options) => { - activity.SetTag("responseVersion", httpResponseMessage.Version); - }; - }) + options.EnrichWithHttpRequestMessage = (activity, httpRequestMessage) => + { + activity.SetTag("requestVersion", httpRequestMessage.Version); + }; + options.EnrichWithHttpResponseMessage = (activity, httpResponseMessage) => + { + activity.SetTag("responseVersion", httpResponseMessage.Version); + }; + }) + .StartWithHost(); ``` [Processor](../../docs/trace/extending-the-sdk/README.md#processor), From fae1e39f0415ae135ec77dd7e38ccc7a56e3103e Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 15:17:28 -0800 Subject: [PATCH 37/48] Doc updates and cleanup. --- .../MicroserviceExample/WebApi/Startup.cs | 2 +- src/OpenTelemetry.Exporter.Jaeger/README.md | 4 +- .../README.md | 4 +- src/OpenTelemetry.Exporter.Zipkin/README.md | 4 +- .../README.md | 69 ++++++++++--------- .../README.md | 2 +- 6 files changed, 44 insertions(+), 41 deletions(-) diff --git a/examples/MicroserviceExample/WebApi/Startup.cs b/examples/MicroserviceExample/WebApi/Startup.cs index c3d14777a6c..8a3fb88d04e 100644 --- a/examples/MicroserviceExample/WebApi/Startup.cs +++ b/examples/MicroserviceExample/WebApi/Startup.cs @@ -42,7 +42,7 @@ public void ConfigureServices(IServiceCollection services) services.AddSingleton(); services.AddOpenTelemetry() - .WithTracing((builder) => builder + .WithTracing(builder => builder .AddAspNetCoreInstrumentation() .AddSource(nameof(MessageSender)) .AddZipkinExporter(b => diff --git a/src/OpenTelemetry.Exporter.Jaeger/README.md b/src/OpenTelemetry.Exporter.Jaeger/README.md index 2e187c4f338..22fd4a382e4 100644 --- a/src/OpenTelemetry.Exporter.Jaeger/README.md +++ b/src/OpenTelemetry.Exporter.Jaeger/README.md @@ -91,7 +91,7 @@ implementation if you want to customize the generated `HttpClient`: ```csharp services.AddOpenTelemetry() - .WithTracing((builder) => builder + .WithTracing(builder => builder .AddJaegerExporter(o => { o.Protocol = JaegerExportProtocol.HttpBinaryThrift; @@ -101,7 +101,7 @@ services.AddOpenTelemetry() client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value"); return client; }; - })); + })) .StartWithHost(); ``` diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/README.md b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/README.md index d2c5f958a00..4386b891217 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/README.md +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/README.md @@ -128,7 +128,7 @@ function with your own implementation if you want to customize the generated ```csharp services.AddOpenTelemetry() - .WithTracing((builder) => builder + .WithTracing(builder => builder .AddOtlpExporter(o => { o.Protocol = OtlpExportProtocol.HttpProtobuf; @@ -138,7 +138,7 @@ services.AddOpenTelemetry() client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value"); return client; }; - })); + })) .StartWithHost(); ``` diff --git a/src/OpenTelemetry.Exporter.Zipkin/README.md b/src/OpenTelemetry.Exporter.Zipkin/README.md index dea280f4409..9b4b7c185ef 100644 --- a/src/OpenTelemetry.Exporter.Zipkin/README.md +++ b/src/OpenTelemetry.Exporter.Zipkin/README.md @@ -84,13 +84,13 @@ generated `HttpClient`: ```csharp services.AddOpenTelemetry() - .WithTracing((builder) => builder + .WithTracing(builder => builder .AddZipkinExporter(o => o.HttpClientFactory = () => { HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Add("X-MyCustomHeader", "value"); return client; - })); + })) .StartWithHost(); ``` diff --git a/src/OpenTelemetry.Instrumentation.AspNetCore/README.md b/src/OpenTelemetry.Instrumentation.AspNetCore/README.md index a5801839648..59e489b8676 100644 --- a/src/OpenTelemetry.Instrumentation.AspNetCore/README.md +++ b/src/OpenTelemetry.Instrumentation.AspNetCore/README.md @@ -55,10 +55,11 @@ using OpenTelemetry.Trace; public void ConfigureServices(IServiceCollection services) { - services.AddOpenTelemetryTracing((builder) => builder - .AddAspNetCoreInstrumentation() - .AddJaegerExporter() - ); + services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddAspNetCoreInstrumentation() + .AddJaegerExporter()) + .StartWithHost(); } ``` @@ -84,10 +85,11 @@ services.Configure(options => }; }); -services.AddOpenTelemetryTracing((builder) => builder - .AddAspNetCoreInstrumentation() - .AddJaegerExporter() -); +services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddAspNetCoreInstrumentation() + .AddJaegerExporter()) + .StartWithHost(); ``` ### Filter @@ -103,14 +105,15 @@ The following code snippet shows how to use `Filter` to only allow GET requests. ```csharp -services.AddOpenTelemetryTracing((builder) => builder - .AddAspNetCoreInstrumentation((options) => options.Filter = httpContext => - { - // only collect telemetry about HTTP GET requests - return httpContext.Request.Method.Equals("GET"); - }) - .AddJaegerExporter() -); +services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddAspNetCoreInstrumentation((options) => options.Filter = httpContext => + { + // only collect telemetry about HTTP GET requests + return httpContext.Request.Method.Equals("GET"); + }) + .AddJaegerExporter()) + .StartWithHost(); ``` It is important to note that this `Filter` option is specific to this @@ -131,24 +134,24 @@ The following code snippet shows how to enrich the activity using all 3 different options. ```csharp -services.AddOpenTelemetryTracing((builder) => -{ - builder.AddAspNetCoreInstrumentation(o => - { - o.EnrichWithHttpRequest = (activity, httpRequest) => - { - activity.SetTag("requestProtocol", httpRequest.Protocol); - }; - o.EnrichWithHttpResponse = (activity, httpResponse) => +services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddAspNetCoreInstrumentation(o => { - activity.SetTag("responseLength", httpResponse.ContentLength); - }; - o.EnrichWithException = (activity, exception) => - { - activity.SetTag("exceptionType", exception.GetType().ToString()); - }; - }) -}); + o.EnrichWithHttpRequest = (activity, httpRequest) => + { + activity.SetTag("requestProtocol", httpRequest.Protocol); + }; + o.EnrichWithHttpResponse = (activity, httpResponse) => + { + activity.SetTag("responseLength", httpResponse.ContentLength); + }; + o.EnrichWithException = (activity, exception) => + { + 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 c6ac1f62ba0..62bb0853aea 100644 --- a/src/OpenTelemetry.Instrumentation.GrpcNetClient/README.md +++ b/src/OpenTelemetry.Instrumentation.GrpcNetClient/README.md @@ -110,7 +110,7 @@ following code snippet shows how to add additional tags using these options. ```csharp services.AddOpenTelemetry() .WithTracing(builder => builder - .AddGrpcClientInstrumentation((options) => + .AddGrpcClientInstrumentation(options => { options.EnrichWithHttpRequestMessage = (activity, httpRequestMessage) => { From ae660bf28eec374cac1834685fdc0863633e6cea Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 15:18:44 -0800 Subject: [PATCH 38/48] Doc updates. --- .../README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/README.md b/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/README.md index 1387fb09736..6bcd236b5bb 100644 --- a/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/README.md +++ b/src/OpenTelemetry.Exporter.Prometheus.AspNetCore/README.md @@ -26,10 +26,10 @@ dotnet add package --prerelease OpenTelemetry.Exporter.Prometheus.AspNetCore package on .NET 6.0+: ```csharp - services.AddOpenTelemetryMetrics(builder => - { - builder.AddPrometheusExporter(); - }); + services.AddOpenTelemetry() + .WithMetrics(builder => builder + .AddPrometheusExporter()) + .StartWithHost(); ``` * Or configure directly: From a6613f41e671fc351a6b356de845995d7e9150df Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 15:20:05 -0800 Subject: [PATCH 39/48] Skip ApiCompat on new project. --- .../OpenTelemetry.DependencyInjection.csproj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj b/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj index 5f497892f00..5213198edfb 100644 --- a/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj +++ b/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj @@ -11,6 +11,11 @@ enable + + + false + + From 47d6d87c78fe51bf76bcea8b6653b13ee0730370 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 16:02:47 -0800 Subject: [PATCH 40/48] API tweaks. --- .../.publicApi/net462/PublicAPI.Unshipped.txt | 6 ++- .../.publicApi/net6.0/PublicAPI.Unshipped.txt | 6 ++- .../netstandard2.0/PublicAPI.Unshipped.txt | 6 ++- .../netstandard2.1/PublicAPI.Unshipped.txt | 6 ++- src/OpenTelemetry/OpenTelemetryBuilder.cs | 42 ++++++++++++++++--- 5 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt index f4743d08fc3..65a0375525d 100644 --- a/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt @@ -18,8 +18,10 @@ OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, ou OpenTelemetry.OpenTelemetryBuilder OpenTelemetry.OpenTelemetryBuilder.ConfigureResource(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! OpenTelemetry.OpenTelemetryBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! +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.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt index f4743d08fc3..65a0375525d 100644 --- a/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -18,8 +18,10 @@ OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, ou OpenTelemetry.OpenTelemetryBuilder OpenTelemetry.OpenTelemetryBuilder.ConfigureResource(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! OpenTelemetry.OpenTelemetryBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! +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.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index f4743d08fc3..65a0375525d 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -18,8 +18,10 @@ OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, ou OpenTelemetry.OpenTelemetryBuilder OpenTelemetry.OpenTelemetryBuilder.ConfigureResource(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! OpenTelemetry.OpenTelemetryBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! +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.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index f4743d08fc3..65a0375525d 100644 --- a/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -18,8 +18,10 @@ OpenTelemetry.Metrics.MetricPoint.TryGetHistogramMinMaxValues(out double min, ou OpenTelemetry.OpenTelemetryBuilder OpenTelemetry.OpenTelemetryBuilder.ConfigureResource(System.Action! configure) -> OpenTelemetry.OpenTelemetryBuilder! OpenTelemetry.OpenTelemetryBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection! -OpenTelemetry.OpenTelemetryBuilder.WithMetrics(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! -OpenTelemetry.OpenTelemetryBuilder.WithTracing(System.Action? configure = null) -> OpenTelemetry.OpenTelemetryBuilder! +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.Resources.ResourceBuilder.AddDetector(System.Func! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder! OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureBuilder(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! OpenTelemetry.Trace.TracerProviderBuilderBase.ConfigureServices(System.Action! configure) -> OpenTelemetry.Trace.TracerProviderBuilder! diff --git a/src/OpenTelemetry/OpenTelemetryBuilder.cs b/src/OpenTelemetry/OpenTelemetryBuilder.cs index 45f0446b553..351af48fe27 100644 --- a/src/OpenTelemetry/OpenTelemetryBuilder.cs +++ b/src/OpenTelemetry/OpenTelemetryBuilder.cs @@ -77,15 +77,30 @@ public OpenTelemetryBuilder ConfigureResource( /// Only a single will be created for a given /// . /// - /// Optional + /// The supplied for chaining + /// calls. + public OpenTelemetryBuilder WithMetrics() + => this.WithMetrics(b => { }); + + /// + /// Adds metric services into the builder. + /// + /// + /// Note: This is safe to be called multiple times and by library authors. + /// Only a single will be created for a given + /// . + /// + /// /// configuration callback. /// The supplied for chaining /// calls. - public OpenTelemetryBuilder WithMetrics(Action? configure = null) + public OpenTelemetryBuilder WithMetrics(Action configure) { + Guard.ThrowIfNull(configure); + var builder = new MeterProviderBuilderBase(this.Services); - configure?.Invoke(builder); + configure(builder); return this; } @@ -98,15 +113,30 @@ public OpenTelemetryBuilder WithMetrics(Action? configure /// Only a single will be created for a given /// . /// - /// Optional + /// The supplied for chaining + /// calls. + public OpenTelemetryBuilder WithTracing() + => this.WithTracing(b => { }); + + /// + /// Adds tracing services into the builder. + /// + /// + /// Note: This is safe to be called multiple times and by library authors. + /// Only a single will be created for a given + /// . + /// + /// /// configuration callback. /// The supplied for chaining /// calls. - public OpenTelemetryBuilder WithTracing(Action? configure = null) + public OpenTelemetryBuilder WithTracing(Action configure) { + Guard.ThrowIfNull(configure); + var builder = new TracerProviderBuilderBase(this.Services); - configure?.Invoke(builder); + configure(builder); return this; } From 6015b06cf4bf22304729a9beeb1695f8d0c607ec Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 16:20:02 -0800 Subject: [PATCH 41/48] Test fixes. --- .../BasicTests.cs | 18 +++++++++++------- .../DependencyInjectionConfigTests.cs | 6 ++++-- ...estsCollectionsIsAccordingToTheSpecTests.cs | 8 +++++--- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs index 29896d1a9f2..598815fd969 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/BasicTests.cs @@ -655,10 +655,12 @@ public async Task ActivitiesStartedInMiddlewareBySettingHostActivityToNullShould builder.ConfigureTestServices((IServiceCollection services) => { services.AddSingleton(new TestNullHostActivityMiddlewareImpl(activitySourceName, activityName)); - services.AddOpenTelemetry().WithTracing(builder => builder - .AddAspNetCoreInstrumentation() - .AddSource(activitySourceName) - .AddInMemoryExporter(exportedItems)); + services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddAspNetCoreInstrumentation() + .AddSource(activitySourceName) + .AddInMemoryExporter(exportedItems)) + .StartWithHost(); }); builder.ConfigureLogging(loggingBuilder => loggingBuilder.ClearProviders()); }) @@ -693,9 +695,11 @@ public async Task UserRegisteredActivitySourceIsUsedForActivityCreationByAspNetC var exportedItems = new List(); void ConfigureTestServices(IServiceCollection services) { - services.AddOpenTelemetry().WithTracing(builder => builder - .AddAspNetCoreInstrumentation() - .AddInMemoryExporter(exportedItems)); + services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddAspNetCoreInstrumentation() + .AddInMemoryExporter(exportedItems)) + .StartWithHost(); // 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 ee11d5f4fe5..4316a11586d 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs @@ -43,8 +43,10 @@ public void TestDIConfig(string name) bool optionsPickedFromDI = false; void ConfigureTestServices(IServiceCollection services) { - services.AddOpenTelemetry().WithTracing(builder => builder - .AddAspNetCoreInstrumentation(name, configureAspNetCoreInstrumentationOptions: null)); + services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddAspNetCoreInstrumentation(name, configureAspNetCoreInstrumentationOptions: null)) + .StartWithHost(); services.Configure(name, options => { diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs index 7d2948c57eb..a0836beea3a 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/IncomingRequestsCollectionsIsAccordingToTheSpecTests.cs @@ -64,9 +64,11 @@ public async Task SuccessfulTemplateControllerCallGeneratesASpan( builder.ConfigureTestServices((IServiceCollection services) => { services.AddSingleton(new TestCallbackMiddlewareImpl(statusCode, reasonPhrase)); - services.AddOpenTelemetry().WithTracing(builder => builder - .AddAspNetCoreInstrumentation(options => options.RecordException = recordException) - .AddInMemoryExporter(exportedItems)); + services.AddOpenTelemetry() + .WithTracing(builder => builder + .AddAspNetCoreInstrumentation(options => options.RecordException = recordException) + .AddInMemoryExporter(exportedItems)) + .StartWithHost(); }); builder.ConfigureLogging(loggingBuilder => loggingBuilder.ClearProviders()); }) From e85f8ae5cda994eaab7f141631e1ef5b355ca6f0 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Fri, 2 Dec 2022 16:28:45 -0800 Subject: [PATCH 42/48] XML doc improvements. --- src/OpenTelemetry/OpenTelemetryBuilder.cs | 38 ++++++++++++++--------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/OpenTelemetry/OpenTelemetryBuilder.cs b/src/OpenTelemetry/OpenTelemetryBuilder.cs index 351af48fe27..3751e3fb1ac 100644 --- a/src/OpenTelemetry/OpenTelemetryBuilder.cs +++ b/src/OpenTelemetry/OpenTelemetryBuilder.cs @@ -73,9 +73,18 @@ public OpenTelemetryBuilder ConfigureResource( /// Adds metric services into the builder. /// /// - /// Note: This is safe to be called multiple times and by library authors. + /// 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. /// Only a single will be created for a given - /// . + /// . + /// /// /// The supplied for chaining /// calls. @@ -85,11 +94,7 @@ public OpenTelemetryBuilder WithMetrics() /// /// Adds metric services into the builder. /// - /// - /// Note: This is safe to be called multiple times and by library authors. - /// Only a single will be created for a given - /// . - /// + /// /// /// configuration callback. /// The supplied for chaining @@ -109,9 +114,18 @@ public OpenTelemetryBuilder WithMetrics(Action configure) /// Adds tracing services into the builder. /// /// - /// Note: This is safe to be called multiple times and by library authors. + /// 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. /// Only a single will be created for a given - /// . + /// . + /// /// /// The supplied for chaining /// calls. @@ -121,11 +135,7 @@ public OpenTelemetryBuilder WithTracing() /// /// Adds tracing services into the builder. /// - /// - /// Note: This is safe to be called multiple times and by library authors. - /// Only a single will be created for a given - /// . - /// + /// /// /// configuration callback. /// The supplied for chaining From de722190b883e7ebfe5a9c201bfe860009729ba4 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Mon, 5 Dec 2022 10:11:20 -0800 Subject: [PATCH 43/48] Tweaks. --- ...viderBuilderServiceCollectionExtensions.cs | 20 ++++++++++--------- .../Builder/MeterProviderBuilderBase.cs | 1 + src/OpenTelemetry/OpenTelemetryBuilder.cs | 2 ++ .../Builder/TracerProviderBuilderBase.cs | 1 + 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs b/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs index 82d913793f8..13db86eff8f 100644 --- a/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/Internal/Builder/ProviderBuilderServiceCollectionExtensions.cs @@ -30,25 +30,25 @@ internal static class ProviderBuilderServiceCollectionExtensions { public static IServiceCollection AddOpenTelemetryMeterProviderBuilderServices(this IServiceCollection services) { - services.AddOpenTelemetryProviderBuilderServices(); + Debug.Assert(services != null, "services was null"); - services.TryAddSingleton(); - services.RegisterOptionsFactory(configuration => new MetricReaderOptions(configuration)); + services!.TryAddSingleton(); + services!.RegisterOptionsFactory(configuration => new MetricReaderOptions(configuration)); - return services; + return services!; } public static IServiceCollection AddOpenTelemetryTracerProviderBuilderServices(this IServiceCollection services) { - services.AddOpenTelemetryProviderBuilderServices(); + Debug.Assert(services != null, "services was null"); - services.TryAddSingleton(); - services.RegisterOptionsFactory(configuration => new BatchExportActivityProcessorOptions(configuration)); + services!.TryAddSingleton(); + services!.RegisterOptionsFactory(configuration => new BatchExportActivityProcessorOptions(configuration)); - return services; + return services!; } - private static void AddOpenTelemetryProviderBuilderServices(this IServiceCollection services) + public static IServiceCollection AddOpenTelemetrySharedProviderBuilderServices(this IServiceCollection services) { Debug.Assert(services != null, "services was null"); @@ -65,5 +65,7 @@ private static void AddOpenTelemetryProviderBuilderServices(this IServiceCollect // those cases. services!.TryAddSingleton( sp => new ConfigurationBuilder().AddEnvironmentVariables().Build()); + + return services!; } } diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs index fb410035eac..9d43f500c03 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderBase.cs @@ -36,6 +36,7 @@ public MeterProviderBuilderBase() var services = new ServiceCollection(); services + .AddOpenTelemetrySharedProviderBuilderServices() .AddOpenTelemetryMeterProviderBuilderServices() .TryAddSingleton( sp => throw new NotSupportedException("Self-contained MeterProvider cannot be accessed using the application IServiceProvider call Build instead.")); diff --git a/src/OpenTelemetry/OpenTelemetryBuilder.cs b/src/OpenTelemetry/OpenTelemetryBuilder.cs index 3751e3fb1ac..89c74dba609 100644 --- a/src/OpenTelemetry/OpenTelemetryBuilder.cs +++ b/src/OpenTelemetry/OpenTelemetryBuilder.cs @@ -35,6 +35,8 @@ internal OpenTelemetryBuilder(IServiceCollection services) { Guard.ThrowIfNull(services); + services.AddOpenTelemetrySharedProviderBuilderServices(); + this.Services = services; } diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs index e5c759962c3..e9212cf1b50 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs @@ -39,6 +39,7 @@ public TracerProviderBuilderBase() var services = new ServiceCollection(); services + .AddOpenTelemetrySharedProviderBuilderServices() .AddOpenTelemetryTracerProviderBuilderServices() .TryAddSingleton( sp => throw new NotSupportedException("Self-contained TracerProvider cannot be accessed using the application IServiceProvider call Build instead.")); From 752ad566244213dc6030c68f4b2dab5ad18d8f4b Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 8 Dec 2022 11:34:47 -0800 Subject: [PATCH 44/48] Project file updates. --- .../OpenTelemetry.DependencyInjection.csproj | 3 --- .../OpenTelemetry.DependencyInjection.Tests.csproj | 3 --- 2 files changed, 6 deletions(-) diff --git a/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj b/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj index 5213198edfb..724efc1b29d 100644 --- a/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj +++ b/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj @@ -6,9 +6,6 @@ OpenTelemetry .NET dependency injection extensions OpenTelemetry core- - enable - latest-all - enable diff --git a/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj b/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj index bfcb3427cec..d83edd8fffb 100644 --- a/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj +++ b/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj @@ -4,9 +4,6 @@ net7.0;net6.0 $(TargetFrameworks);net462 - enable - latest-all - enable From b1848c0c8ca8fb6950ffd597aedcd2ab5b23d37e Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 8 Dec 2022 11:46:51 -0800 Subject: [PATCH 45/48] Test fix. --- .../DependencyInjectionConfigTests.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs index e94f55b32e7..16136110509 100644 --- a/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs +++ b/test/OpenTelemetry.Instrumentation.AspNetCore.Tests/DependencyInjectionConfigTests.cs @@ -76,8 +76,10 @@ public void TestMetricsOptionsDIConfig(string name) bool optionsPickedFromDI = false; void ConfigureTestServices(IServiceCollection services) { - services.AddOpenTelemetryMetrics( - builder => builder.AddAspNetCoreInstrumentation(name, configureAspNetCoreInstrumentationOptions: null)); + services.AddOpenTelemetry() + .WithMetrics(builder => builder + .AddAspNetCoreInstrumentation(name, configureAspNetCoreInstrumentationOptions: null)) + .StartWithHost(); services.Configure(name, options => { @@ -87,9 +89,9 @@ void ConfigureTestServices(IServiceCollection services) // Arrange using (var client = this.factory - .WithWebHostBuilder(builder => - builder.ConfigureTestServices(ConfigureTestServices)) - .CreateClient()) + .WithWebHostBuilder(builder => + builder.ConfigureTestServices(ConfigureTestServices)) + .CreateClient()) { } From 1b8c89424bb807cf9445e3cc18c782f0b1e07ea0 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 8 Dec 2022 14:02:04 -0800 Subject: [PATCH 46/48] Project rename. --- OpenTelemetry.sln | 4 +-- .../README.md | 25 ------------------- .../.publicApi/net462/PublicAPI.Shipped.txt | 0 .../.publicApi/net462/PublicAPI.Unshipped.txt | 0 .../netstandard2.0/PublicAPI.Shipped.txt | 0 .../netstandard2.0/PublicAPI.Unshipped.txt | 0 .../AssemblyInfo.cs | 2 +- .../CHANGELOG.md | 0 .../Metrics/IConfigureMeterProviderBuilder.cs | 0 .../Metrics/IMeterProviderBuilder.cs | 0 ...InjectionMeterProviderBuilderExtensions.cs | 0 ...ctionMetricsServiceCollectionExtensions.cs | 0 ...try.Extensions.DependencyInjection.csproj} | 2 +- .../README.md | 25 +++++++++++++++++++ .../Trace/IConfigureTracerProviderBuilder.cs | 0 .../Trace/ITracerProviderBuilder.cs | 0 ...njectionTracerProviderBuilderExtensions.cs | 0 ...ctionTracingServiceCollectionExtensions.cs | 0 .../OpenTelemetry.Extensions.Hosting.csproj | 2 +- src/OpenTelemetry/CHANGELOG.md | 4 +-- src/OpenTelemetry/OpenTelemetry.csproj | 2 +- .../MeterProviderBuilderExtensionsTests.cs | 2 +- ...tensions.DependencyInjection.Tests.csproj} | 2 +- .../ServiceCollectionExtensionsTests.cs | 2 +- .../TestMeterProviderBuilder.cs | 2 +- .../TestTracerProviderBuilder.cs | 2 +- .../TracerProviderBuilderExtensionsTests.cs | 2 +- 27 files changed, 39 insertions(+), 39 deletions(-) delete mode 100644 src/OpenTelemetry.DependencyInjection/README.md rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/.publicApi/net462/PublicAPI.Shipped.txt (100%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/.publicApi/net462/PublicAPI.Unshipped.txt (100%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/.publicApi/netstandard2.0/PublicAPI.Shipped.txt (100%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt (100%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/AssemblyInfo.cs (93%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/CHANGELOG.md (100%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/Metrics/IConfigureMeterProviderBuilder.cs (100%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/Metrics/IMeterProviderBuilder.cs (100%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs (100%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs (100%) rename src/{OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj => OpenTelemetry.Extensions.DependencyInjection/OpenTelemetry.Extensions.DependencyInjection.csproj} (88%) create mode 100644 src/OpenTelemetry.Extensions.DependencyInjection/README.md rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/Trace/IConfigureTracerProviderBuilder.cs (100%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/Trace/ITracerProviderBuilder.cs (100%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs (100%) rename src/{OpenTelemetry.DependencyInjection => OpenTelemetry.Extensions.DependencyInjection}/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs (100%) rename test/{OpenTelemetry.DependencyInjection.Tests => OpenTelemetry.Extensions.DependencyInjection.Tests}/MeterProviderBuilderExtensionsTests.cs (98%) rename test/{OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj => OpenTelemetry.Extensions.DependencyInjection.Tests/OpenTelemetry.Extensions.DependencyInjection.Tests.csproj} (88%) rename test/{OpenTelemetry.DependencyInjection.Tests => OpenTelemetry.Extensions.DependencyInjection.Tests}/ServiceCollectionExtensionsTests.cs (97%) rename test/{OpenTelemetry.DependencyInjection.Tests => OpenTelemetry.Extensions.DependencyInjection.Tests}/TestMeterProviderBuilder.cs (98%) rename test/{OpenTelemetry.DependencyInjection.Tests => OpenTelemetry.Extensions.DependencyInjection.Tests}/TestTracerProviderBuilder.cs (98%) rename test/{OpenTelemetry.DependencyInjection.Tests => OpenTelemetry.Extensions.DependencyInjection.Tests}/TracerProviderBuilderExtensionsTests.cs (98%) diff --git a/OpenTelemetry.sln b/OpenTelemetry.sln index 09334f0f2d7..b0929341fda 100644 --- a/OpenTelemetry.sln +++ b/OpenTelemetry.sln @@ -240,9 +240,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Exporter.Open EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Exporter.Console.Tests", "test\OpenTelemetry.Exporter.Console.Tests\OpenTelemetry.Exporter.Console.Tests.csproj", "{011E70E1-152A-47BB-AF83-12DD12B125ED}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.DependencyInjection", "src\OpenTelemetry.DependencyInjection\OpenTelemetry.DependencyInjection.csproj", "{171A87CB-393C-4296-913F-E704CD8CEAE9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Extensions.DependencyInjection", "src\OpenTelemetry.Extensions.DependencyInjection\OpenTelemetry.Extensions.DependencyInjection.csproj", "{171A87CB-393C-4296-913F-E704CD8CEAE9}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.DependencyInjection.Tests", "test\OpenTelemetry.DependencyInjection.Tests\OpenTelemetry.DependencyInjection.Tests.csproj", "{662476AA-5875-4E74-B992-DDF309168EFB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenTelemetry.Extensions.DependencyInjection.Tests", "test\OpenTelemetry.Extensions.DependencyInjection.Tests\OpenTelemetry.Extensions.DependencyInjection.Tests.csproj", "{662476AA-5875-4E74-B992-DDF309168EFB}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/OpenTelemetry.DependencyInjection/README.md b/src/OpenTelemetry.DependencyInjection/README.md deleted file mode 100644 index 309f2c8f2fb..00000000000 --- a/src/OpenTelemetry.DependencyInjection/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# OpenTelemetry .NET DependencyInjection - -[![NuGet](https://img.shields.io/nuget/v/OpenTelemetry.DependencyInjection.svg)](https://www.nuget.org/packages/OpenTelemetry.DependencyInjection) -[![NuGet](https://img.shields.io/nuget/dt/OpenTelemetry.DependencyInjection.svg)](https://www.nuget.org/packages/OpenTelemetry.DependencyInjection) - -## Installation - -```shell -dotnet add package --prerelease OpenTelemetry.DependencyInjection -``` - -## Overview - -The OpenTelemetry.DependencyInjection package provides extension methods and -helpers for building `TracerProvider`s and `MeterProvider`s using the -Microsoft.Extensions.DependencyInjection API. - -The Microsoft.Extensions.DependencyInjection package is primarily intended for -library authors who need to integrate with the OpenTelemetry SDK. For more -details see: [Registration extension method guidance for library -authors](../../docs/trace/extending-the-sdk/README.md#registration-extension-method-guidance-for-library-authors). - -## References - -* [OpenTelemetry Project](https://opentelemetry.io/) diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Shipped.txt b/src/OpenTelemetry.Extensions.DependencyInjection/.publicApi/net462/PublicAPI.Shipped.txt similarity index 100% rename from src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Shipped.txt rename to src/OpenTelemetry.Extensions.DependencyInjection/.publicApi/net462/PublicAPI.Shipped.txt diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Extensions.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt similarity index 100% rename from src/OpenTelemetry.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt rename to src/OpenTelemetry.Extensions.DependencyInjection/.publicApi/net462/PublicAPI.Unshipped.txt diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Shipped.txt b/src/OpenTelemetry.Extensions.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Shipped.txt similarity index 100% rename from src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Shipped.txt rename to src/OpenTelemetry.Extensions.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Shipped.txt diff --git a/src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Extensions.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt similarity index 100% rename from src/OpenTelemetry.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt rename to src/OpenTelemetry.Extensions.DependencyInjection/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt diff --git a/src/OpenTelemetry.DependencyInjection/AssemblyInfo.cs b/src/OpenTelemetry.Extensions.DependencyInjection/AssemblyInfo.cs similarity index 93% rename from src/OpenTelemetry.DependencyInjection/AssemblyInfo.cs rename to src/OpenTelemetry.Extensions.DependencyInjection/AssemblyInfo.cs index 7ccb6e5c98b..f07bd3cd4ba 100644 --- a/src/OpenTelemetry.DependencyInjection/AssemblyInfo.cs +++ b/src/OpenTelemetry.Extensions.DependencyInjection/AssemblyInfo.cs @@ -16,7 +16,7 @@ using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("OpenTelemetry.DependencyInjection.Tests" + AssemblyInfo.PublicKey)] +[assembly: InternalsVisibleTo("OpenTelemetry.Extensions.DependencyInjection.Tests" + AssemblyInfo.PublicKey)] #if SIGNED internal static class AssemblyInfo diff --git a/src/OpenTelemetry.DependencyInjection/CHANGELOG.md b/src/OpenTelemetry.Extensions.DependencyInjection/CHANGELOG.md similarity index 100% rename from src/OpenTelemetry.DependencyInjection/CHANGELOG.md rename to src/OpenTelemetry.Extensions.DependencyInjection/CHANGELOG.md diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs b/src/OpenTelemetry.Extensions.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs similarity index 100% rename from src/OpenTelemetry.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs rename to src/OpenTelemetry.Extensions.DependencyInjection/Metrics/IConfigureMeterProviderBuilder.cs diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs b/src/OpenTelemetry.Extensions.DependencyInjection/Metrics/IMeterProviderBuilder.cs similarity index 100% rename from src/OpenTelemetry.DependencyInjection/Metrics/IMeterProviderBuilder.cs rename to src/OpenTelemetry.Extensions.DependencyInjection/Metrics/IMeterProviderBuilder.cs diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs b/src/OpenTelemetry.Extensions.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs similarity index 100% rename from src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs rename to src/OpenTelemetry.Extensions.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMeterProviderBuilderExtensions.cs diff --git a/src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs b/src/OpenTelemetry.Extensions.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs similarity index 100% rename from src/OpenTelemetry.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs rename to src/OpenTelemetry.Extensions.DependencyInjection/Metrics/OpenTelemetryDependencyInjectionMetricsServiceCollectionExtensions.cs diff --git a/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj b/src/OpenTelemetry.Extensions.DependencyInjection/OpenTelemetry.Extensions.DependencyInjection.csproj similarity index 88% rename from src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj rename to src/OpenTelemetry.Extensions.DependencyInjection/OpenTelemetry.Extensions.DependencyInjection.csproj index 724efc1b29d..4655980ddf5 100644 --- a/src/OpenTelemetry.DependencyInjection/OpenTelemetry.DependencyInjection.csproj +++ b/src/OpenTelemetry.Extensions.DependencyInjection/OpenTelemetry.Extensions.DependencyInjection.csproj @@ -3,7 +3,7 @@ netstandard2.0;net462 - OpenTelemetry .NET dependency injection extensions + Contains extensions to register OpenTelemetry in applications using Microsoft.Extensions.DependencyInjection OpenTelemetry core- diff --git a/src/OpenTelemetry.Extensions.DependencyInjection/README.md b/src/OpenTelemetry.Extensions.DependencyInjection/README.md new file mode 100644 index 00000000000..3e783d502ee --- /dev/null +++ b/src/OpenTelemetry.Extensions.DependencyInjection/README.md @@ -0,0 +1,25 @@ +# OpenTelemetry.Extensions.DependencyInjection + +[![NuGet](https://img.shields.io/nuget/v/OpenTelemetry.Extensions.DependencyInjection.svg)](https://www.nuget.org/packages/OpenTelemetry.Extensions.DependencyInjection) +[![NuGet](https://img.shields.io/nuget/dt/OpenTelemetry.Extensions.DependencyInjection.svg)](https://www.nuget.org/packages/OpenTelemetry.Extensions.DependencyInjection) + +## Installation + +```shell +dotnet add package --prerelease OpenTelemetry.Extensions.DependencyInjection +``` + +## Overview + +The OpenTelemetry.Extensions.DependencyInjection package provides extension +methods and helpers for building `TracerProvider`s and `MeterProvider`s using +the Microsoft.Extensions.DependencyInjection API. + +The Microsoft.Extensions.DependencyInjection package is primarily intended for +library authors who need to integrate with the OpenTelemetry SDK. For more +details see: [Registration extension method guidance for library +authors](../../docs/trace/extending-the-sdk/README.md#registration-extension-method-guidance-for-library-authors). + +## References + +* [OpenTelemetry Project](https://opentelemetry.io/) diff --git a/src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs b/src/OpenTelemetry.Extensions.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs similarity index 100% rename from src/OpenTelemetry.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs rename to src/OpenTelemetry.Extensions.DependencyInjection/Trace/IConfigureTracerProviderBuilder.cs diff --git a/src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs b/src/OpenTelemetry.Extensions.DependencyInjection/Trace/ITracerProviderBuilder.cs similarity index 100% rename from src/OpenTelemetry.DependencyInjection/Trace/ITracerProviderBuilder.cs rename to src/OpenTelemetry.Extensions.DependencyInjection/Trace/ITracerProviderBuilder.cs diff --git a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs b/src/OpenTelemetry.Extensions.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs similarity index 100% rename from src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs rename to src/OpenTelemetry.Extensions.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs diff --git a/src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs b/src/OpenTelemetry.Extensions.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs similarity index 100% rename from src/OpenTelemetry.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs rename to src/OpenTelemetry.Extensions.DependencyInjection/Trace/OpenTelemetryDependencyInjectionTracingServiceCollectionExtensions.cs diff --git a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj index abefb22d1f1..e636ed6c65d 100644 --- a/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj +++ b/src/OpenTelemetry.Extensions.Hosting/OpenTelemetry.Extensions.Hosting.csproj @@ -2,7 +2,7 @@ netstandard2.0 - Contains extensions to register and start OpenTelemetry in applications using Microsoft.Extensions.Hosting + Contains extensions to start OpenTelemetry in applications using Microsoft.Extensions.Hosting OpenTelemetry diff --git a/src/OpenTelemetry/CHANGELOG.md b/src/OpenTelemetry/CHANGELOG.md index aa47df8e0da..1a3e32517c8 100644 --- a/src/OpenTelemetry/CHANGELOG.md +++ b/src/OpenTelemetry/CHANGELOG.md @@ -8,8 +8,8 @@ ([#3889](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3889)) * Refactored `AddInstrumentation`, `ConfigureServices` and `ConfigureBuilder` - APIs into the OpenTelemetry.DependencyInjection package and added the - `IServiceCollection.AddOpenTelemetry` API + APIs into the OpenTelemetry.Extensions.DependencyInjection package and added + the `IServiceCollection.AddOpenTelemetry` API ([#3923](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3923)) ## 1.4.0-beta.3 diff --git a/src/OpenTelemetry/OpenTelemetry.csproj b/src/OpenTelemetry/OpenTelemetry.csproj index 63f2620ae0a..9b6d5d56dd9 100644 --- a/src/OpenTelemetry/OpenTelemetry.csproj +++ b/src/OpenTelemetry/OpenTelemetry.csproj @@ -28,7 +28,7 @@ - + diff --git a/test/OpenTelemetry.DependencyInjection.Tests/MeterProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/MeterProviderBuilderExtensionsTests.cs similarity index 98% rename from test/OpenTelemetry.DependencyInjection.Tests/MeterProviderBuilderExtensionsTests.cs rename to test/OpenTelemetry.Extensions.DependencyInjection.Tests/MeterProviderBuilderExtensionsTests.cs index 69e7755ca0b..14136ffa92a 100644 --- a/test/OpenTelemetry.DependencyInjection.Tests/MeterProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/MeterProviderBuilderExtensionsTests.cs @@ -19,7 +19,7 @@ using OpenTelemetry.Metrics; using Xunit; -namespace OpenTelemetry.DependencyInjection.Tests; +namespace OpenTelemetry.Extensions.DependencyInjection.Tests; public class MeterProviderBuilderExtensionsTests { diff --git a/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/OpenTelemetry.Extensions.DependencyInjection.Tests.csproj similarity index 88% rename from test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj rename to test/OpenTelemetry.Extensions.DependencyInjection.Tests/OpenTelemetry.Extensions.DependencyInjection.Tests.csproj index d83edd8fffb..1156b1c5633 100644 --- a/test/OpenTelemetry.DependencyInjection.Tests/OpenTelemetry.DependencyInjection.Tests.csproj +++ b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/OpenTelemetry.Extensions.DependencyInjection.Tests.csproj @@ -7,7 +7,7 @@ - + diff --git a/test/OpenTelemetry.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs similarity index 97% rename from test/OpenTelemetry.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs rename to test/OpenTelemetry.Extensions.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs index edfeeee4b02..72ede87e3e9 100644 --- a/test/OpenTelemetry.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs +++ b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/ServiceCollectionExtensionsTests.cs @@ -19,7 +19,7 @@ using OpenTelemetry.Trace; using Xunit; -namespace OpenTelemetry.DependencyInjection.Tests; +namespace OpenTelemetry.Extensions.DependencyInjection.Tests; public class ServiceCollectionExtensionsTests { diff --git a/test/OpenTelemetry.DependencyInjection.Tests/TestMeterProviderBuilder.cs b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/TestMeterProviderBuilder.cs similarity index 98% rename from test/OpenTelemetry.DependencyInjection.Tests/TestMeterProviderBuilder.cs rename to test/OpenTelemetry.Extensions.DependencyInjection.Tests/TestMeterProviderBuilder.cs index 53dd3ed9df1..86f7d523274 100644 --- a/test/OpenTelemetry.DependencyInjection.Tests/TestMeterProviderBuilder.cs +++ b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/TestMeterProviderBuilder.cs @@ -17,7 +17,7 @@ using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Metrics; -namespace OpenTelemetry.DependencyInjection.Tests; +namespace OpenTelemetry.Extensions.DependencyInjection.Tests; public sealed class TestMeterProviderBuilder : MeterProviderBuilder, IMeterProviderBuilder, IDisposable { diff --git a/test/OpenTelemetry.DependencyInjection.Tests/TestTracerProviderBuilder.cs b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/TestTracerProviderBuilder.cs similarity index 98% rename from test/OpenTelemetry.DependencyInjection.Tests/TestTracerProviderBuilder.cs rename to test/OpenTelemetry.Extensions.DependencyInjection.Tests/TestTracerProviderBuilder.cs index ae161c6b1ff..89f61ae2bcf 100644 --- a/test/OpenTelemetry.DependencyInjection.Tests/TestTracerProviderBuilder.cs +++ b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/TestTracerProviderBuilder.cs @@ -17,7 +17,7 @@ using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Trace; -namespace OpenTelemetry.DependencyInjection.Tests; +namespace OpenTelemetry.Extensions.DependencyInjection.Tests; public sealed class TestTracerProviderBuilder : TracerProviderBuilder, ITracerProviderBuilder, IDisposable { diff --git a/test/OpenTelemetry.DependencyInjection.Tests/TracerProviderBuilderExtensionsTests.cs b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/TracerProviderBuilderExtensionsTests.cs similarity index 98% rename from test/OpenTelemetry.DependencyInjection.Tests/TracerProviderBuilderExtensionsTests.cs rename to test/OpenTelemetry.Extensions.DependencyInjection.Tests/TracerProviderBuilderExtensionsTests.cs index 5a47595efbc..48f8ec50993 100644 --- a/test/OpenTelemetry.DependencyInjection.Tests/TracerProviderBuilderExtensionsTests.cs +++ b/test/OpenTelemetry.Extensions.DependencyInjection.Tests/TracerProviderBuilderExtensionsTests.cs @@ -19,7 +19,7 @@ using OpenTelemetry.Trace; using Xunit; -namespace OpenTelemetry.DependencyInjection.Tests; +namespace OpenTelemetry.Extensions.DependencyInjection.Tests; public class TracerProviderBuilderExtensionsTests { From 91d678485d4ebbec78434f68cf3c1474f9312253 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 8 Dec 2022 15:08:03 -0800 Subject: [PATCH 47/48] Manual fixes for merge from main. --- src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs | 2 -- src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs index baba4c07ac9..bf703f5b38d 100644 --- a/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Metrics/Builder/MeterProviderBuilderSdk.cs @@ -16,8 +16,6 @@ #nullable enable -using System; -using System.Collections.Generic; using System.Diagnostics; using System.Diagnostics.Metrics; using System.Text.RegularExpressions; diff --git a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs index 1cf3b5d6f0c..c56044b884a 100644 --- a/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs +++ b/src/OpenTelemetry/Trace/Builder/TracerProviderBuilderSdk.cs @@ -16,8 +16,6 @@ #nullable enable -using System; -using System.Collections.Generic; using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; From d95757e5e2e8a61a033b940972612e5917d82d58 Mon Sep 17 00:00:00 2001 From: Mikel Blanchard Date: Thu, 8 Dec 2022 15:10:52 -0800 Subject: [PATCH 48/48] More manual fixes for merge from main. --- src/OpenTelemetry/OpenTelemetryBuilder.cs | 1 - src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/src/OpenTelemetry/OpenTelemetryBuilder.cs b/src/OpenTelemetry/OpenTelemetryBuilder.cs index 89c74dba609..f817e0bfe68 100644 --- a/src/OpenTelemetry/OpenTelemetryBuilder.cs +++ b/src/OpenTelemetry/OpenTelemetryBuilder.cs @@ -16,7 +16,6 @@ #nullable enable -using System; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Internal; using OpenTelemetry.Metrics; diff --git a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs index 2b7b0ce9119..2541a85f7bb 100644 --- a/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs +++ b/src/OpenTelemetry/OpenTelemetryServiceCollectionExtensions.cs @@ -16,7 +16,6 @@ #nullable enable -using System; using Microsoft.Extensions.DependencyInjection; using OpenTelemetry.Metrics; using OpenTelemetry.Trace;