[Tracing] Improve dependency injection support in tracing build-up using SDK (#3533)

* TracerBuilder depedency injection improvements.

* Fixes and API updates.

* Update skipped test.

* Tweak.

* Tweaks.

* Test fix.

* Turn on options in TracerProviderBuilderBase.

* Updated CHANGELOGs.

* Added XML comments to AddOpenTelemetryTracing methods.

* Tweaks.

* Added export helpers and restored removed API from hosting library so that there is no breakage during upgrades.

* Export extension tweaks.

* Tweak.

* Tracer builder improvements.

* Fix hosting multiple configurations test.

* Cleanup.

* Cleanup and fixes.

* Added "UseOpenTelemetry" extensions.

* Cleanup.

* Code review.

* Code review.

* Rename SDK extension "Configure" and restore "Add" in the hosting lib.

* Doc clarification.

* Some test coverage.

* README updates.

* Fix double dispose of TracerProvider when using Sdk.CreateTracerProviderBuilder.

* AddExporter tests.

* More test coverage.

* More test coverage.

* Code review.
This commit is contained in:
Mikel Blanchard 2022-08-29 13:14:24 -07:00 committed by GitHub
parent 8700d5dd9b
commit e6d39b8b14
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 1685 additions and 721 deletions

View File

@ -37,7 +37,7 @@ namespace WorkerService
services.AddSingleton<MessageReceiver>();
services.AddOpenTelemetryTracing((builder) =>
services.AddOpenTelemetryTracing(builder =>
{
builder
.AddSource(nameof(MessageReceiver))

View File

@ -10,9 +10,5 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader<T>(this Op
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.Build(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.IServiceProvider serviceProvider) -> OpenTelemetry.Metrics.MeterProvider
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.Configure(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action<System.IServiceProvider, OpenTelemetry.Metrics.MeterProviderBuilder> configure) -> OpenTelemetry.Metrics.MeterProviderBuilder
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.GetServices(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor<T>(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.IServiceProvider serviceProvider) -> OpenTelemetry.Trace.TracerProvider
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Configure(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.Action<System.IServiceProvider, OpenTelemetry.Trace.TracerProviderBuilder> configure) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.GetServices(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler<T>(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder

View File

@ -2,6 +2,10 @@
## Unreleased
* Dependency injection support when configuring
`TracerProvider` has been moved into the SDK.
([#3533](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3533))
## 1.0.0-rc9.6
Released 2022-Aug-18

View File

@ -15,6 +15,7 @@
// </copyright>
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
@ -22,42 +23,48 @@ using Microsoft.Extensions.Hosting;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
namespace OpenTelemetry.Extensions.Hosting.Implementation
namespace OpenTelemetry.Extensions.Hosting.Implementation;
internal sealed class TelemetryHostedService : IHostedService
{
internal class TelemetryHostedService : IHostedService
private readonly IServiceProvider serviceProvider;
public TelemetryHostedService(IServiceProvider serviceProvider)
{
private readonly IServiceProvider serviceProvider;
this.serviceProvider = serviceProvider;
}
public TelemetryHostedService(IServiceProvider serviceProvider)
public Task StartAsync(CancellationToken cancellationToken)
{
try
{
this.serviceProvider = serviceProvider;
// The sole purpose of this HostedService is to ensure all
// instrumentations, exporters, etc., are created and started.
Initialize(this.serviceProvider);
}
catch (Exception ex)
{
HostingExtensionsEventSource.Log.FailedOpenTelemetrySDK(ex);
}
public Task StartAsync(CancellationToken cancellationToken)
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
internal static void Initialize(IServiceProvider serviceProvider)
{
Debug.Assert(serviceProvider != null, "serviceProvider was null");
var meterProvider = serviceProvider.GetService<MeterProvider>();
var tracerProvider = serviceProvider.GetService<TracerProvider>();
if (meterProvider == null && tracerProvider == null)
{
try
{
// The sole purpose of this HostedService is to ensure all
// instrumentations, exporters, etc., are created and started.
var meterProvider = this.serviceProvider.GetService<MeterProvider>();
var tracerProvider = this.serviceProvider.GetService<TracerProvider>();
if (meterProvider == null && tracerProvider == null)
{
throw new InvalidOperationException("Could not resolve either MeterProvider or TracerProvider through application ServiceProvider, OpenTelemetry SDK has not been initialized.");
}
}
catch (Exception ex)
{
HostingExtensionsEventSource.Log.FailedOpenTelemetrySDK(ex);
}
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
throw new InvalidOperationException("Could not resolve either MeterProvider or TracerProvider through application ServiceProvider, OpenTelemetry SDK has not been initialized.");
}
}
}

View File

@ -1,62 +0,0 @@
// <copyright file="TracerProviderBuilderHosting.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
using System;
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Internal;
namespace OpenTelemetry.Trace
{
/// <summary>
/// A <see cref="TracerProviderBuilderBase"/> with support for deferred initialization using <see cref="IServiceProvider"/> for dependency injection.
/// </summary>
internal sealed class TracerProviderBuilderHosting : TracerProviderBuilderBase, IDeferredTracerProviderBuilder
{
private readonly List<Action<IServiceProvider, TracerProviderBuilder>> configurationActions = new();
public TracerProviderBuilderHosting(IServiceCollection services)
{
Guard.ThrowIfNull(services);
this.Services = services;
}
public IServiceCollection Services { get; }
public TracerProviderBuilder Configure(Action<IServiceProvider, TracerProviderBuilder> configure)
{
Guard.ThrowIfNull(configure);
this.configurationActions.Add(configure);
return this;
}
public TracerProvider Build(IServiceProvider serviceProvider)
{
Guard.ThrowIfNull(serviceProvider);
// Note: Not using a foreach loop because additional actions can be
// added during each call.
for (int i = 0; i < this.configurationActions.Count; i++)
{
this.configurationActions[i](serviceProvider, this);
}
return this.Build();
}
}
}

View File

@ -1,8 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- OmniSharp/VS Code requires TargetFrameworks to be in descending order for IntelliSense and analysis. -->
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<Description>Startup extensions to register OpenTelemetry into the applications using Microsoft.Extensions.DependencyInjection and Microsoft.Extensions.Hosting</Description>
<Description>Contains extensions to register and start OpenTelemetry in applications using Microsoft.Extensions.Hosting</Description>
<RootNamespace>OpenTelemetry</RootNamespace>
</PropertyGroup>

View File

@ -32,28 +32,38 @@ namespace Microsoft.Extensions.DependencyInjection
public static class OpenTelemetryServicesExtensions
{
/// <summary>
/// Adds OpenTelemetry TracerProvider to the specified <see cref="IServiceCollection" />.
/// Configure OpenTelemetry and register a <see cref="IHostedService"/>
/// to automatically start tracing services in the supplied <see
/// cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
/// <remarks>
/// Note: This is safe to be called multiple times and by library authors.
/// Only a single <see cref="TracerProvider"/> will be created for a given
/// <see cref="IServiceCollection"/>.
/// </remarks>
/// <param name="services"><see cref="IServiceCollection"/>.</param>
/// <returns>Supplied <see cref="IServiceCollection"/> for chaining calls.</returns>
public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services)
{
return services.AddOpenTelemetryTracing(builder => { });
}
=> AddOpenTelemetryTracing(services, (b) => { });
/// <summary>
/// Adds OpenTelemetry TracerProvider to the specified <see cref="IServiceCollection" />.
/// Configure OpenTelemetry and register a <see cref="IHostedService"/>
/// to automatically start tracing services in the supplied <see
/// cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <remarks><inheritdoc cref="AddOpenTelemetryTracing(IServiceCollection)" path="/remarks"/></remarks>
/// <param name="services"><see cref="IServiceCollection"/>.</param>
/// <param name="configure">Callback action to configure the <see cref="TracerProviderBuilder"/>.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
/// <returns>Supplied <see cref="IServiceCollection"/> for chaining calls.</returns>
public static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Action<TracerProviderBuilder> configure)
{
Guard.ThrowIfNull(configure);
Guard.ThrowIfNull(services);
var builder = new TracerProviderBuilderHosting(services);
configure(builder);
return services.AddOpenTelemetryTracing(sp => builder.Build(sp));
services.ConfigureOpenTelemetryTracing(configure);
services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, TelemetryHostedService>());
return services;
}
/// <summary>
@ -81,34 +91,6 @@ namespace Microsoft.Extensions.DependencyInjection
return services.AddOpenTelemetryMetrics(sp => builder.Build(sp));
}
/// <summary>
/// Adds OpenTelemetry TracerProvider to the specified <see cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="createTracerProvider">A delegate that provides the tracer provider to be registered.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
private static IServiceCollection AddOpenTelemetryTracing(this IServiceCollection services, Func<IServiceProvider, TracerProvider> createTracerProvider)
{
Guard.ThrowIfNull(services);
Guard.ThrowIfNull(createTracerProvider);
// Accessing Sdk class is just to trigger its static ctor,
// which sets default Propagators and default Activity Id format
_ = Sdk.SuppressInstrumentation;
try
{
services.TryAddEnumerable(ServiceDescriptor.Singleton<IHostedService, TelemetryHostedService>());
return services.AddSingleton(s => createTracerProvider(s));
}
catch (Exception ex)
{
HostingExtensionsEventSource.Log.FailedInitialize(ex);
}
return services;
}
/// <summary>
/// Adds OpenTelemetry MeterProvider to the specified <see cref="IServiceCollection" />.
/// </summary>

View File

@ -45,27 +45,27 @@ Similar methods exist for registering instrumentation (`AddInstrumentation<T>`)
and setting a sampler (`SetSampler<T>`).
You can also access the application `IServiceProvider` directly and accomplish
the same registration using the `Configure` extension like this:
the same registration using the `ConfigureBuilder` extension like this:
```csharp
services.AddSingleton<MyProcessor>();
services.AddOpenTelemetryTracing(hostingBuilder => hostingBuilder
.Configure((sp, builder) => builder
.ConfigureBuilder((sp, builder) => builder
.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddProcessor(sp.GetRequiredService<MyProcessor>())));
```
**Note:** `Configure` is called _after_ the `IServiceProvider` has been built
**Note:** `ConfigureBuilder` is called _after_ the `IServiceProvider` has been built
from the application `IServiceCollection` so any services registered in the
`Configure` callback will be ignored.
`ConfigureBuilder` callback will be ignored.
#### Building Extension Methods
Library authors may want to configure the OpenTelemetry `TracerProvider` and
register application services to provide more complex features. This can be
accomplished concisely by using the `TracerProviderBuilder.GetServices`
accomplished concisely by using the `TracerProviderBuilder.ConfigureServices`
extension method inside of a more general `TracerProviderBuilder` configuration
extension like this:
@ -74,15 +74,13 @@ public static class MyLibraryExtensions
{
public static TracerProviderBuilder AddMyFeature(this TracerProviderBuilder tracerProviderBuilder)
{
(tracerProviderBuilder.GetServices()
?? throw new NotSupportedException(
"MyFeature requires a hosting TracerProviderBuilder instance."))
.AddHostedService<MyHostedService>()
.AddSingleton<MyService>()
.AddSingleton<MyProcessor>()
.AddSingleton<MySampler>();
return tracerProviderBuilder
.ConfigureServices(services =>
services
.AddHostedService<MyHostedService>()
.AddSingleton<MyService>()
.AddSingleton<MyProcessor>()
.AddSingleton<MySampler>())
.AddProcessor<MyProcessor>()
.SetSampler<MySampler>();
}

View File

@ -15,7 +15,6 @@
// </copyright>
using System;
using System.Diagnostics;
using Microsoft.Extensions.DependencyInjection;
namespace OpenTelemetry.Trace
@ -25,60 +24,6 @@ namespace OpenTelemetry.Trace
/// </summary>
public static class TracerProviderBuilderExtensions
{
/// <summary>
/// Adds instrumentation to the provider.
/// </summary>
/// <typeparam name="T">Instrumentation type.</typeparam>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <returns>The supplied <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder AddInstrumentation<T>(this TracerProviderBuilder tracerProviderBuilder)
where T : class
{
if (tracerProviderBuilder is TracerProviderBuilderHosting tracerProviderBuilderHosting)
{
tracerProviderBuilderHosting.Configure((sp, builder) => builder
.AddInstrumentation(() => sp.GetRequiredService<T>()));
}
return tracerProviderBuilder;
}
/// <summary>
/// Adds a processor to the provider.
/// </summary>
/// <typeparam name="T">Processor type.</typeparam>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <returns>The supplied <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder AddProcessor<T>(this TracerProviderBuilder tracerProviderBuilder)
where T : BaseProcessor<Activity>
{
if (tracerProviderBuilder is TracerProviderBuilderHosting tracerProviderBuilderHosting)
{
tracerProviderBuilderHosting.Configure((sp, builder) => builder
.AddProcessor(sp.GetRequiredService<T>()));
}
return tracerProviderBuilder;
}
/// <summary>
/// Sets the sampler on the provider.
/// </summary>
/// <typeparam name="T">Sampler type.</typeparam>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <returns>The supplied <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder SetSampler<T>(this TracerProviderBuilder tracerProviderBuilder)
where T : Sampler
{
if (tracerProviderBuilder is TracerProviderBuilderHosting tracerProviderBuilderHosting)
{
tracerProviderBuilderHosting.Configure((sp, builder) => builder
.SetSampler(sp.GetRequiredService<T>()));
}
return tracerProviderBuilder;
}
/// <summary>
/// Register a callback action to configure the <see
/// cref="TracerProviderBuilder"/> once the application <see
@ -87,14 +32,10 @@ namespace OpenTelemetry.Trace
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="configure">Configuration callback.</param>
/// <returns>The supplied <see cref="TracerProviderBuilder"/> for chaining.</returns>
[Obsolete("Call ConfigureBuilder instead this method will be removed in a future version.")]
public static TracerProviderBuilder Configure(this TracerProviderBuilder tracerProviderBuilder, Action<IServiceProvider, TracerProviderBuilder> configure)
{
if (tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder)
{
deferredTracerProviderBuilder.Configure(configure);
}
return tracerProviderBuilder;
return tracerProviderBuilder.ConfigureBuilder(configure);
}
/// <summary>
@ -104,35 +45,12 @@ namespace OpenTelemetry.Trace
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <returns><see cref="IServiceCollection"/> or <see langword="null"/>
/// if services are unavailable.</returns>
[Obsolete("Call ConfigureServices instead this method will be removed in a future version.")]
public static IServiceCollection GetServices(this TracerProviderBuilder tracerProviderBuilder)
{
if (tracerProviderBuilder is TracerProviderBuilderHosting tracerProviderBuilderHosting)
{
return tracerProviderBuilderHosting.Services;
}
return null;
}
/// <summary>
/// Run the configured actions to initialize the <see cref="TracerProvider"/>.
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="serviceProvider"><see cref="IServiceProvider"/>.</param>
/// <returns><see cref="TracerProvider"/>.</returns>
public static TracerProvider Build(this TracerProviderBuilder tracerProviderBuilder, IServiceProvider serviceProvider)
{
if (tracerProviderBuilder is TracerProviderBuilderHosting tracerProviderBuilderHosting)
{
return tracerProviderBuilderHosting.Build(serviceProvider);
}
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
return tracerProviderBuilderBase.Build();
}
return null;
IServiceCollection services = null;
tracerProviderBuilder.ConfigureServices(s => services = s);
return services;
}
}
}

View File

@ -58,8 +58,8 @@ OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseE
~OpenTelemetry.Trace.SamplingParameters.Tags.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Trace.SamplingResult.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void
~OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func<object> instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder
~OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider
OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string! instrumentationName, string! instrumentationVersion, System.Func<object!>! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder!
OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider!
override OpenTelemetry.BaseExportProcessor<T>.OnEnd(T! data) -> void
~override OpenTelemetry.BatchActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void
override OpenTelemetry.BatchExportProcessor<T>.OnExport(T! data) -> void
@ -68,9 +68,9 @@ override OpenTelemetry.BatchExportProcessor<T>.OnExport(T! data) -> void
~override OpenTelemetry.SimpleActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void
override OpenTelemetry.SimpleExportProcessor<T>.OnExport(T! data) -> void
~override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation<TInstrumentation>(System.Func<TInstrumentation> instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string operationName) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string[] names) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation<TInstrumentation>(System.Func<TInstrumentation>! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder!
override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder!
override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder!
override sealed OpenTelemetry.BaseExportProcessor<T>.OnStart(T! data) -> void
readonly OpenTelemetry.BaseExportProcessor<T>.exporter -> OpenTelemetry.BaseExporter<T!>!
~readonly OpenTelemetry.Metrics.BaseExportingMetricReader.exporter -> OpenTelemetry.BaseExporter<OpenTelemetry.Metrics.Metric>
@ -98,14 +98,14 @@ static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.M
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void
~static OpenTelemetry.SuppressInstrumentationScope.Begin(bool value = true) -> System.IDisposable
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProvider
~static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool
~static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity!>! processor) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider?
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.Sampler! sampler) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider! provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity!>! processor) -> OpenTelemetry.Trace.TracerProvider!
static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool
static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool
abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult
Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions
OpenTelemetry.BaseExporter<T>.BaseExporter() -> void

View File

@ -1,3 +1,4 @@
Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions
OpenTelemetry.Logs.LogRecord.CategoryName.set -> void
OpenTelemetry.Logs.LogRecord.EventId.set -> void
OpenTelemetry.Logs.LogRecord.Exception.set -> void
@ -19,11 +20,28 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.AddProcessor(OpenTelemetry.BasePr
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMilliseconds = -1) -> bool
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void
*REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions!>? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder!
OpenTelemetry.Trace.ExportActivityProcessorOptions
OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.Trace.BatchExportActivityProcessorOptions!
OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.set -> void
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions!>? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<System.IServiceProvider!, OpenTelemetry.Trace.TracerProviderBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider!
static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions!
static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Trace.TracerProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder> configure) -> OpenTelemetry.Metrics.MeterProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder> configure) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!

View File

@ -58,8 +58,8 @@ OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseE
~OpenTelemetry.Trace.SamplingParameters.Tags.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Trace.SamplingResult.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void
~OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func<object> instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder
~OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider
OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string! instrumentationName, string! instrumentationVersion, System.Func<object!>! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder!
OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider!
override OpenTelemetry.BaseExportProcessor<T>.OnEnd(T! data) -> void
~override OpenTelemetry.BatchActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void
override OpenTelemetry.BatchExportProcessor<T>.OnExport(T! data) -> void
@ -68,9 +68,9 @@ override OpenTelemetry.BatchExportProcessor<T>.OnExport(T! data) -> void
~override OpenTelemetry.SimpleActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void
override OpenTelemetry.SimpleExportProcessor<T>.OnExport(T! data) -> void
~override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation<TInstrumentation>(System.Func<TInstrumentation> instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string operationName) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string[] names) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation<TInstrumentation>(System.Func<TInstrumentation>! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder!
override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder!
override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder!
override sealed OpenTelemetry.BaseExportProcessor<T>.OnStart(T! data) -> void
readonly OpenTelemetry.BaseExportProcessor<T>.exporter -> OpenTelemetry.BaseExporter<T!>!
~readonly OpenTelemetry.Metrics.BaseExportingMetricReader.exporter -> OpenTelemetry.BaseExporter<OpenTelemetry.Metrics.Metric>
@ -98,14 +98,14 @@ static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.M
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void
~static OpenTelemetry.SuppressInstrumentationScope.Begin(bool value = true) -> System.IDisposable
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProvider
~static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool
~static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity!>! processor) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider?
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.Sampler! sampler) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider! provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity!>! processor) -> OpenTelemetry.Trace.TracerProvider!
static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool
static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool
abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult
Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions
OpenTelemetry.BaseExporter<T>.BaseExporter() -> void

View File

@ -1,3 +1,4 @@
Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions
OpenTelemetry.Logs.LogRecord.CategoryName.set -> void
OpenTelemetry.Logs.LogRecord.EventId.set -> void
OpenTelemetry.Logs.LogRecord.Exception.set -> void
@ -19,11 +20,28 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.AddProcessor(OpenTelemetry.BasePr
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMilliseconds = -1) -> bool
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void
*REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions!>? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder!
OpenTelemetry.Trace.ExportActivityProcessorOptions
OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.Trace.BatchExportActivityProcessorOptions!
OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.set -> void
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions!>? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<System.IServiceProvider!, OpenTelemetry.Trace.TracerProviderBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider!
static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions!
static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Trace.TracerProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder> configure) -> OpenTelemetry.Metrics.MeterProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder> configure) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!

View File

@ -58,8 +58,8 @@ OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseE
~OpenTelemetry.Trace.SamplingParameters.Tags.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Trace.SamplingResult.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void
~OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func<object> instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder
~OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider
OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string! instrumentationName, string! instrumentationVersion, System.Func<object!>! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder!
OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider!
override OpenTelemetry.BaseExportProcessor<T>.OnEnd(T! data) -> void
~override OpenTelemetry.BatchActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void
override OpenTelemetry.BatchExportProcessor<T>.OnExport(T! data) -> void
@ -68,9 +68,9 @@ override OpenTelemetry.BatchExportProcessor<T>.OnExport(T! data) -> void
~override OpenTelemetry.SimpleActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void
override OpenTelemetry.SimpleExportProcessor<T>.OnExport(T! data) -> void
~override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation<TInstrumentation>(System.Func<TInstrumentation> instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string operationName) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string[] names) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation<TInstrumentation>(System.Func<TInstrumentation>! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder!
override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder!
override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder!
override sealed OpenTelemetry.BaseExportProcessor<T>.OnStart(T! data) -> void
readonly OpenTelemetry.BaseExportProcessor<T>.exporter -> OpenTelemetry.BaseExporter<T!>!
~readonly OpenTelemetry.Metrics.BaseExportingMetricReader.exporter -> OpenTelemetry.BaseExporter<OpenTelemetry.Metrics.Metric>
@ -98,14 +98,14 @@ static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.M
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void
~static OpenTelemetry.SuppressInstrumentationScope.Begin(bool value = true) -> System.IDisposable
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProvider
~static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool
~static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity!>! processor) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider?
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.Sampler! sampler) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider! provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity!>! processor) -> OpenTelemetry.Trace.TracerProvider!
static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool
static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool
abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult
Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions
OpenTelemetry.BaseExporter<T>.BaseExporter() -> void

View File

@ -1,3 +1,4 @@
Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions
OpenTelemetry.Logs.LogRecord.CategoryName.set -> void
OpenTelemetry.Logs.LogRecord.EventId.set -> void
OpenTelemetry.Logs.LogRecord.Exception.set -> void
@ -19,11 +20,28 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMillisecond
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void
OpenTelemetry.Logs.OpenTelemetryLoggerOptions.ConfigureResource(System.Action<OpenTelemetry.Resources.ResourceBuilder!>! configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions!
*REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions!>? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder!
OpenTelemetry.Trace.ExportActivityProcessorOptions
OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.Trace.BatchExportActivityProcessorOptions!
OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.set -> void
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions!>? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<System.IServiceProvider!, OpenTelemetry.Trace.TracerProviderBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider!
static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions!
static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Trace.TracerProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder> configure) -> OpenTelemetry.Metrics.MeterProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder> configure) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!

View File

@ -58,8 +58,8 @@ OpenTelemetry.SimpleExportProcessor<T>.SimpleExportProcessor(OpenTelemetry.BaseE
~OpenTelemetry.Trace.SamplingParameters.Tags.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Trace.SamplingResult.Attributes.get -> System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>>
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes) -> void
~OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string instrumentationName, string instrumentationVersion, System.Func<object> instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder
~OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider
OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation(string! instrumentationName, string! instrumentationVersion, System.Func<object!>! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder!
OpenTelemetry.Trace.TracerProviderBuilderBase.Build() -> OpenTelemetry.Trace.TracerProvider!
override OpenTelemetry.BaseExportProcessor<T>.OnEnd(T! data) -> void
~override OpenTelemetry.BatchActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void
override OpenTelemetry.BatchExportProcessor<T>.OnExport(T! data) -> void
@ -68,9 +68,9 @@ override OpenTelemetry.BatchExportProcessor<T>.OnExport(T! data) -> void
~override OpenTelemetry.SimpleActivityExportProcessor.OnEnd(System.Diagnostics.Activity data) -> void
override OpenTelemetry.SimpleExportProcessor<T>.OnExport(T! data) -> void
~override OpenTelemetry.Trace.SamplingResult.Equals(object obj) -> bool
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation<TInstrumentation>(System.Func<TInstrumentation> instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string operationName) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string[] names) -> OpenTelemetry.Trace.TracerProviderBuilder
~override OpenTelemetry.Trace.TracerProviderBuilderBase.AddInstrumentation<TInstrumentation>(System.Func<TInstrumentation>! instrumentationFactory) -> OpenTelemetry.Trace.TracerProviderBuilder!
override OpenTelemetry.Trace.TracerProviderBuilderBase.AddLegacySource(string! operationName) -> OpenTelemetry.Trace.TracerProviderBuilder!
override OpenTelemetry.Trace.TracerProviderBuilderBase.AddSource(params string![]! names) -> OpenTelemetry.Trace.TracerProviderBuilder!
override sealed OpenTelemetry.BaseExportProcessor<T>.OnStart(T! data) -> void
readonly OpenTelemetry.BaseExportProcessor<T>.exporter -> OpenTelemetry.BaseExporter<T!>!
~readonly OpenTelemetry.Metrics.BaseExportingMetricReader.exporter -> OpenTelemetry.BaseExporter<OpenTelemetry.Metrics.Metric>
@ -98,14 +98,14 @@ static OpenTelemetry.Sdk.CreateMeterProviderBuilder() -> OpenTelemetry.Metrics.M
static OpenTelemetry.Sdk.CreateTracerProviderBuilder() -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Sdk.SetDefaultTextMapPropagator(OpenTelemetry.Context.Propagation.TextMapPropagator! textMapPropagator) -> void
~static OpenTelemetry.SuppressInstrumentationScope.Begin(bool value = true) -> System.IDisposable
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.TracerProviderBuilder
~static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity> processor) -> OpenTelemetry.Trace.TracerProvider
~static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool
~static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider provider, int timeoutMilliseconds = -1) -> bool
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity!>! processor) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.Build(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProvider?
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetErrorStatusOnException(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, bool enabled = true) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetResourceBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Resources.ResourceBuilder! resourceBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.Sampler! sampler) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderExtensions.AddProcessor(this OpenTelemetry.Trace.TracerProvider! provider, OpenTelemetry.BaseProcessor<System.Diagnostics.Activity!>! processor) -> OpenTelemetry.Trace.TracerProvider!
static OpenTelemetry.Trace.TracerProviderExtensions.ForceFlush(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool
static OpenTelemetry.Trace.TracerProviderExtensions.Shutdown(this OpenTelemetry.Trace.TracerProvider! provider, int timeoutMilliseconds = -1) -> bool
abstract OpenTelemetry.Trace.Sampler.ShouldSample(in OpenTelemetry.Trace.SamplingParameters samplingParameters) -> OpenTelemetry.Trace.SamplingResult
Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions
OpenTelemetry.BaseExporter<T>.BaseExporter() -> void

View File

@ -1,3 +1,4 @@
Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions
OpenTelemetry.Logs.LogRecord.CategoryName.set -> void
OpenTelemetry.Logs.LogRecord.EventId.set -> void
OpenTelemetry.Logs.LogRecord.Exception.set -> void
@ -19,11 +20,28 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.AddProcessor(OpenTelemetry.BasePr
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMilliseconds = -1) -> bool
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void
*REMOVED*static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions!>? configure = null) -> Microsoft.Extensions.Logging.ILoggingBuilder!
OpenTelemetry.Trace.ExportActivityProcessorOptions
OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.get -> OpenTelemetry.Trace.BatchExportActivityProcessorOptions!
OpenTelemetry.Trace.ExportActivityProcessorOptions.BatchExportProcessorOptions.set -> void
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportActivityProcessorOptions() -> void
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.get -> OpenTelemetry.ExportProcessorType
OpenTelemetry.Trace.ExportActivityProcessorOptions.ExportProcessorType.set -> void
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, OpenTelemetry.Logs.OpenTelemetryLoggerProvider! openTelemetryLoggerProvider, bool disposeProvider) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static Microsoft.Extensions.Logging.OpenTelemetryLoggingExtensions.AddOpenTelemetry(this Microsoft.Extensions.Logging.ILoggingBuilder! builder, System.Action<OpenTelemetry.Logs.OpenTelemetryLoggerOptions!>? configure) -> Microsoft.Extensions.Logging.ILoggingBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddProcessor<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<System.IServiceProvider!, OpenTelemetry.Trace.TracerProviderBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSampler<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions.Build(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions! options) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider!
static OpenTelemetry.Sdk.CreateLoggerProviderBuilder() -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions!
static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceCollectionExtensions.ConfigureOpenTelemetryTracing(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Trace.TracerProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
~static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Metrics.MeterProviderBuilder meterProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder> configure) -> OpenTelemetry.Metrics.MeterProviderBuilder
~static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder> configure) -> OpenTelemetry.Trace.TracerProviderBuilder
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!

View File

@ -62,6 +62,8 @@ namespace OpenTelemetry
this.exporter = exporter;
}
internal BaseExporter<T> Exporter => this.exporter;
/// <inheritdoc />
public sealed override void OnStart(T data)
{

View File

@ -36,10 +36,11 @@ namespace OpenTelemetry
internal const int DefaultExporterTimeoutMilliseconds = 30000;
internal const int DefaultMaxExportBatchSize = 512;
internal readonly int MaxExportBatchSize;
private readonly CircularBuffer<T> circularBuffer;
private readonly int scheduledDelayMilliseconds;
private readonly int exporterTimeoutMilliseconds;
private readonly int maxExportBatchSize;
private readonly Thread exporterThread;
private readonly AutoResetEvent exportTrigger = new(false);
private readonly ManualResetEvent dataExportedNotification = new(false);
@ -72,7 +73,7 @@ namespace OpenTelemetry
this.circularBuffer = new CircularBuffer<T>(maxQueueSize);
this.scheduledDelayMilliseconds = scheduledDelayMilliseconds;
this.exporterTimeoutMilliseconds = exporterTimeoutMilliseconds;
this.maxExportBatchSize = maxExportBatchSize;
this.MaxExportBatchSize = maxExportBatchSize;
this.exporterThread = new Thread(new ThreadStart(this.ExporterProc))
{
IsBackground = true,
@ -101,7 +102,7 @@ namespace OpenTelemetry
{
if (this.circularBuffer.TryAdd(data, maxSpinCount: 50000))
{
if (this.circularBuffer.Count >= this.maxExportBatchSize)
if (this.circularBuffer.Count >= this.MaxExportBatchSize)
{
try
{
@ -264,7 +265,7 @@ namespace OpenTelemetry
while (true)
{
// only wait when the queue doesn't have enough items, otherwise keep busy and send data continuously
if (this.circularBuffer.Count < this.maxExportBatchSize)
if (this.circularBuffer.Count < this.MaxExportBatchSize)
{
try
{
@ -279,7 +280,7 @@ namespace OpenTelemetry
if (this.circularBuffer.Count > 0)
{
using (var batch = new Batch<T>(this.circularBuffer, this.maxExportBatchSize))
using (var batch = new Batch<T>(this.circularBuffer, this.MaxExportBatchSize))
{
this.exporter.Export(batch);
}

View File

@ -10,6 +10,10 @@ Released 2022-Aug-18
injection scenarios when configuring `OpenTelemetryLoggerProvider`
([#3504](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3504))
* Added support for dependency injection scenarios when configuring
`TracerProvider`
([#3533](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3533))
## 1.4.0-alpha.1
Released 2022-Aug-02

View File

@ -25,7 +25,7 @@ namespace OpenTelemetry.Resources
/// </summary>
public class ResourceBuilder
{
private readonly List<Resource> resources = new();
internal readonly List<Resource> Resources = new();
static ResourceBuilder()
{
@ -83,7 +83,7 @@ namespace OpenTelemetry.Resources
/// <returns><see cref="ResourceBuilder"/> for chaining.</returns>
public ResourceBuilder Clear()
{
this.resources.Clear();
this.Resources.Clear();
return this;
}
@ -96,7 +96,7 @@ namespace OpenTelemetry.Resources
{
Resource finalResource = Resource.Empty;
foreach (Resource resource in this.resources)
foreach (Resource resource in this.Resources)
{
finalResource = finalResource.Merge(resource);
}
@ -112,7 +112,7 @@ namespace OpenTelemetry.Resources
if (resource != null)
{
this.resources.Add(resource);
this.Resources.Add(resource);
}
return this;
@ -122,7 +122,7 @@ namespace OpenTelemetry.Resources
{
Guard.ThrowIfNull(resource);
this.resources.Add(resource);
this.Resources.Add(resource);
return this;
}

View File

@ -0,0 +1,341 @@
// <copyright file="TracerProviderBuilderBase.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
#nullable enable
using System;
using System.Diagnostics;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
using OpenTelemetry.Internal;
using OpenTelemetry.Resources;
namespace OpenTelemetry.Trace
{
/// <summary>
/// Contains methods for building <see cref="TracerProvider"/> instances.
/// </summary>
public abstract class TracerProviderBuilderBase : TracerProviderBuilder, IDeferredTracerProviderBuilder
{
internal readonly TracerProviderBuilderState? State;
private readonly bool ownsServices;
private IServiceCollection? services;
// This ctor is for a builder created from TracerProviderBuilderState which
// happens after the service provider has been created.
internal TracerProviderBuilderBase(TracerProviderBuilderState state)
{
Debug.Assert(state != null, "state was null");
this.State = state;
}
// This ctor is for AddOpenTelemetryTracing scenario where the builder
// is bound to an external service collection.
internal TracerProviderBuilderBase(IServiceCollection services)
{
Guard.ThrowIfNull(services);
services.AddOptions();
services.TryAddSingleton<TracerProvider>(sp => new TracerProviderSdk(sp, ownsServiceProvider: false));
this.services = services;
this.ownsServices = false;
}
// This ctor is for Sdk.CreateTracerProviderBuilder where the builder
// owns its services and service provider.
protected TracerProviderBuilderBase()
{
var services = new ServiceCollection();
services.AddOptions();
this.services = services;
this.ownsServices = true;
}
/// <inheritdoc />
public override TracerProviderBuilder AddInstrumentation<TInstrumentation>(
Func<TInstrumentation> instrumentationFactory)
where TInstrumentation : class
{
Guard.ThrowIfNull(instrumentationFactory);
return this.AddInstrumentation((sp) => instrumentationFactory());
}
/// <inheritdoc />
public override TracerProviderBuilder AddSource(params string[] names)
{
Guard.ThrowIfNull(names);
return this.ConfigureState((sp, state) => state.AddSource(names));
}
/// <inheritdoc />
public override TracerProviderBuilder AddLegacySource(string operationName)
{
Guard.ThrowIfNullOrWhitespace(operationName);
return this.ConfigureState((sp, state) => state.AddLegacySource(operationName));
}
/// <inheritdoc />
TracerProviderBuilder IDeferredTracerProviderBuilder.Configure(
Action<IServiceProvider, TracerProviderBuilder> configure)
{
Guard.ThrowIfNull(configure);
if (this.State != null)
{
configure(this.State.ServiceProvider, this);
}
else
{
this.ConfigureServices(services
=> TracerProviderBuilderServiceCollectionHelper.RegisterConfigureBuilderCallback(services, configure));
}
return this;
}
internal TracerProviderBuilder AddExporter<T>(ExportProcessorType exportProcessorType, Action<ExportActivityProcessorOptions> configure)
where T : BaseExporter<Activity>
{
Guard.ThrowIfNull(configure);
this.TryAddSingleton<T>();
this.ConfigureState((sp, state)
=> state.AddProcessor(
BuildExportProcessor(state.ServiceProvider, exportProcessorType, sp.GetRequiredService<T>(), configure)));
return this;
}
internal TracerProviderBuilder AddExporter(ExportProcessorType exportProcessorType, BaseExporter<Activity> exporter, Action<ExportActivityProcessorOptions> configure)
{
Guard.ThrowIfNull(exporter);
Guard.ThrowIfNull(configure);
this.ConfigureState((sp, state)
=> state.AddProcessor(
BuildExportProcessor(state.ServiceProvider, exportProcessorType, exporter, configure)));
return this;
}
internal TracerProviderBuilder AddInstrumentation<T>()
where T : class
{
this.TryAddSingleton<T>();
this.AddInstrumentation((sp) => sp.GetRequiredService<T>());
return this;
}
internal TracerProviderBuilder AddProcessor<T>()
where T : BaseProcessor<Activity>
{
this.TryAddSingleton<T>();
this.ConfigureState((sp, state) => state.AddProcessor(sp.GetRequiredService<T>()));
return this;
}
internal TracerProviderBuilder AddProcessor(BaseProcessor<Activity> processor)
{
Guard.ThrowIfNull(processor);
return this.ConfigureState((sp, state) => state.AddProcessor(processor));
}
internal TracerProviderBuilder ConfigureResource(Action<ResourceBuilder> configure)
{
Guard.ThrowIfNull(configure);
return this.ConfigureState((sp, state) => state.ConfigureResource(configure));
}
internal TracerProviderBuilder ConfigureServices(Action<IServiceCollection> configure)
{
Guard.ThrowIfNull(configure);
var services = this.services;
if (services == null)
{
throw new NotSupportedException("Services cannot be configured after ServiceProvider has been created.");
}
configure(services);
return this;
}
internal TracerProvider InvokeBuild()
=> this.Build();
internal TracerProviderBuilder SetErrorStatusOnException(bool enabled)
{
return this.ConfigureState((sp, state) => state.SetErrorStatusOnException = enabled);
}
internal TracerProviderBuilder SetResourceBuilder(ResourceBuilder resourceBuilder)
{
Guard.ThrowIfNull(resourceBuilder);
return this.ConfigureState((sp, state) => state.SetResourceBuilder(resourceBuilder));
}
internal TracerProviderBuilder SetSampler<T>()
where T : Sampler
{
this.TryAddSingleton<T>();
this.ConfigureState((sp, state) => state.SetSampler(sp.GetRequiredService<T>()));
return this;
}
internal TracerProviderBuilder SetSampler(Sampler sampler)
{
Guard.ThrowIfNull(sampler);
return this.ConfigureState((sp, state) => state.SetSampler(sampler));
}
/// <summary>
/// Adds instrumentation to the provider.
/// </summary>d
/// <param name="instrumentationName">Instrumentation name.</param>
/// <param name="instrumentationVersion">Instrumentation version.</param>
/// <param name="instrumentationFactory">Function that builds instrumentation.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
protected TracerProviderBuilder AddInstrumentation(
string instrumentationName,
string instrumentationVersion,
Func<object> instrumentationFactory)
{
Guard.ThrowIfNullOrWhitespace(instrumentationName);
Guard.ThrowIfNullOrWhitespace(instrumentationVersion);
Guard.ThrowIfNull(instrumentationFactory);
return this.ConfigureState((sp, state)
=> state.AddInstrumentation(
instrumentationName,
instrumentationVersion,
instrumentationFactory()));
}
/// <summary>
/// Run the configured actions to initialize the <see cref="TracerProvider"/>.
/// </summary>
/// <returns><see cref="TracerProvider"/>.</returns>
protected TracerProvider Build()
{
if (!this.ownsServices || this.State != null)
{
throw new NotSupportedException("Build cannot be called directly on TracerProviderBuilder tied to external services.");
}
var services = this.services;
if (services == null)
{
throw new NotSupportedException("TracerProviderBuilder build method cannot be called multiple times.");
}
this.services = null;
var serviceProvider = services.BuildServiceProvider();
return new TracerProviderSdk(serviceProvider, ownsServiceProvider: true);
}
private static BaseProcessor<Activity> BuildExportProcessor(
IServiceProvider serviceProvider,
ExportProcessorType exportProcessorType,
BaseExporter<Activity> exporter,
Action<ExportActivityProcessorOptions> configure)
{
switch (exportProcessorType)
{
case ExportProcessorType.Simple:
return new SimpleActivityExportProcessor(exporter);
case ExportProcessorType.Batch:
var options = new ExportActivityProcessorOptions
{
ExportProcessorType = ExportProcessorType.Batch,
BatchExportProcessorOptions = serviceProvider.GetRequiredService<IOptions<BatchExportActivityProcessorOptions>>().Value,
};
configure(options);
var batchOptions = options.BatchExportProcessorOptions;
return new BatchActivityExportProcessor(
exporter,
batchOptions.MaxQueueSize,
batchOptions.ScheduledDelayMilliseconds,
batchOptions.ExporterTimeoutMilliseconds,
batchOptions.MaxExportBatchSize);
default:
throw new NotSupportedException($"ExportProcessorType '{exportProcessorType}' is not supported.");
}
}
private TracerProviderBuilder AddInstrumentation<T>(Func<IServiceProvider, T> 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<IServiceProvider, TracerProviderBuilderState> configure)
{
Debug.Assert(configure != null, "configure was null");
if (this.State != null)
{
configure!(this.State.ServiceProvider, this.State);
}
else
{
this.ConfigureServices(services => TracerProviderBuilderServiceCollectionHelper.RegisterConfigureStateCallback(services, configure!));
}
return this;
}
private void TryAddSingleton<T>()
where T : class
{
var services = this.services;
if (services != null)
{
services.TryAddSingleton<T>();
}
}
}
}

View File

@ -0,0 +1,321 @@
// <copyright file="TracerProviderBuilderExtensions.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
#nullable enable
using System;
using System.Diagnostics;
using Microsoft.Extensions.DependencyInjection;
using OpenTelemetry.Resources;
namespace OpenTelemetry.Trace
{
/// <summary>
/// Contains extension methods for the <see cref="TracerProviderBuilder"/> class.
/// </summary>
public static class TracerProviderBuilderExtensions
{
/// <summary>
/// Sets whether the status of <see cref="Activity"/>
/// should be set to <c>Status.Error</c> when it ended abnormally due to an unhandled exception.
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="enabled">Enabled or not. Default value is <c>true</c>.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder SetErrorStatusOnException(this TracerProviderBuilder tracerProviderBuilder, bool enabled = true)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.SetErrorStatusOnException(enabled);
}
return tracerProviderBuilder;
}
/// <summary>
/// Sets sampler.
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="sampler">Sampler instance.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracerProviderBuilder, Sampler sampler)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.SetSampler(sampler);
}
return tracerProviderBuilder;
}
/// <summary>
/// Sets the sampler on the provider.
/// </summary>
/// <remarks>
/// Note: The type specified by <typeparamref name="T"/> will be
/// registered as a singleton service into application services.
/// </remarks>
/// <typeparam name="T">Sampler type.</typeparam>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <returns>The supplied <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder SetSampler<T>(this TracerProviderBuilder tracerProviderBuilder)
where T : Sampler
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.SetSampler<T>();
}
return tracerProviderBuilder;
}
/// <summary>
/// Sets the <see cref="ResourceBuilder"/> from which the Resource associated with
/// this provider is built from. Overwrites currently set ResourceBuilder.
/// You should usually use <see cref="ConfigureResource(TracerProviderBuilder, Action{ResourceBuilder})"/> instead
/// (call <see cref="ResourceBuilder.Clear"/> if desired).
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="resourceBuilder"><see cref="ResourceBuilder"/> from which Resource will be built.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder SetResourceBuilder(this TracerProviderBuilder tracerProviderBuilder, ResourceBuilder resourceBuilder)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.SetResourceBuilder(resourceBuilder);
}
return tracerProviderBuilder;
}
/// <summary>
/// Modify the <see cref="ResourceBuilder"/> from which the Resource associated with
/// this provider is built from in-place.
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="configure">An action which modifies the provided <see cref="ResourceBuilder"/> in-place.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder ConfigureResource(this TracerProviderBuilder tracerProviderBuilder, Action<ResourceBuilder> configure)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.ConfigureResource(configure);
}
return tracerProviderBuilder;
}
/// <summary>
/// Adds a processor to the provider.
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="processor">Activity processor to add.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder, BaseProcessor<Activity> processor)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.AddProcessor(processor);
}
return tracerProviderBuilder;
}
/// <summary>
/// Adds a processor to the provider which will be retrieved using dependency injection.
/// </summary>
/// <remarks>
/// Note: The type specified by <typeparamref name="T"/> will be
/// registered as a singleton service into application services.
/// </remarks>
/// <typeparam name="T">Processor type.</typeparam>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <returns>The supplied <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder AddProcessor<T>(this TracerProviderBuilder tracerProviderBuilder)
where T : BaseProcessor<Activity>
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.AddProcessor<T>();
}
return tracerProviderBuilder;
}
/// <summary>
/// Adds an exporter to the provider.
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="exportProcessorType"><see cref="ExportProcessorType"/>.</param>
/// <param name="exporter">Activity exporter to add.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder AddExporter(
this TracerProviderBuilder tracerProviderBuilder,
ExportProcessorType exportProcessorType,
BaseExporter<Activity> exporter)
=> AddExporter(tracerProviderBuilder, exportProcessorType, exporter, o => { });
/// <summary>
/// Adds an exporter to the provider.
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="exportProcessorType"><see cref="ExportProcessorType"/>.</param>
/// <param name="exporter">Activity exporter to add.</param>
/// <param name="configure">Callback action to configure <see
/// cref="ExportActivityProcessorOptions"/>. Only invoked when <paramref
/// name="exportProcessorType"/> is <see
/// cref="ExportProcessorType.Batch"/>.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder AddExporter(
this TracerProviderBuilder tracerProviderBuilder,
ExportProcessorType exportProcessorType,
BaseExporter<Activity> exporter,
Action<ExportActivityProcessorOptions> configure)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.AddExporter(exportProcessorType, exporter, configure);
}
return tracerProviderBuilder;
}
/// <summary>
/// Adds an exporter to the provider which will be retrieved using dependency injection.
/// </summary>
/// <remarks>
/// Note: The type specified by <typeparamref name="T"/> will be
/// registered as a singleton service into application services.
/// </remarks>
/// <typeparam name="T">Exporter type.</typeparam>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="exportProcessorType"><see cref="ExportProcessorType"/>.</param>
/// <returns>The supplied <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder AddExporter<T>(
this TracerProviderBuilder tracerProviderBuilder,
ExportProcessorType exportProcessorType)
where T : BaseExporter<Activity>
=> AddExporter<T>(tracerProviderBuilder, exportProcessorType, o => { });
/// <summary>
/// Adds an exporter to the provider which will be retrieved using dependency injection.
/// </summary>
/// <remarks>
/// Note: The type specified by <typeparamref name="T"/> will be
/// registered as a singleton service into application services.
/// </remarks>
/// <typeparam name="T">Exporter type.</typeparam>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="exportProcessorType"><see cref="ExportProcessorType"/>.</param>
/// <param name="configure">Callback action to configure <see
/// cref="ExportActivityProcessorOptions"/>. Only invoked when <paramref
/// name="exportProcessorType"/> is <see
/// cref="ExportProcessorType.Batch"/>.</param>
/// <returns>The supplied <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder AddExporter<T>(
this TracerProviderBuilder tracerProviderBuilder,
ExportProcessorType exportProcessorType,
Action<ExportActivityProcessorOptions> configure)
where T : BaseExporter<Activity>
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.AddExporter<T>(exportProcessorType, configure);
}
return tracerProviderBuilder;
}
/// <summary>
/// Adds instrumentation to the provider.
/// </summary>
/// <remarks>
/// Note: The type specified by <typeparamref name="T"/> will be
/// registered as a singleton service into application services.
/// </remarks>
/// <typeparam name="T">Instrumentation type.</typeparam>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <returns>The supplied <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder AddInstrumentation<T>(this TracerProviderBuilder tracerProviderBuilder)
where T : class
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.AddInstrumentation<T>();
}
return tracerProviderBuilder;
}
/// <summary>
/// Register a callback action to configure the <see
/// cref="IServiceCollection"/> where tracing services are configured.
/// </summary>
/// <remarks>
/// Note: Tracing services are only available during the application
/// configuration phase.
/// </remarks>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="configure">Configuration callback.</param>
/// <returns>The supplied <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder ConfigureServices(
this TracerProviderBuilder tracerProviderBuilder,
Action<IServiceCollection> configure)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.ConfigureServices(configure);
}
return tracerProviderBuilder;
}
/// <summary>
/// Register a callback action to configure the <see
/// cref="TracerProviderBuilder"/> once the application <see
/// cref="IServiceProvider"/> is available.
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="configure">Configuration callback.</param>
/// <returns>The supplied <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder ConfigureBuilder(
this TracerProviderBuilder tracerProviderBuilder,
Action<IServiceProvider, TracerProviderBuilder> configure)
{
if (tracerProviderBuilder is IDeferredTracerProviderBuilder deferredTracerProviderBuilder)
{
deferredTracerProviderBuilder.Configure(configure);
}
return tracerProviderBuilder;
}
/// <summary>
/// Run the given actions to initialize the <see cref="TracerProvider"/>.
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <returns><see cref="TracerProvider"/>.</returns>
public static TracerProvider? Build(this TracerProviderBuilder tracerProviderBuilder)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
return tracerProviderBuilderBase.InvokeBuild();
}
return null;
}
}
}

View File

@ -14,10 +14,26 @@
// limitations under the License.
// </copyright>
#nullable enable
using Microsoft.Extensions.DependencyInjection;
namespace OpenTelemetry.Trace
{
internal sealed class TracerProviderBuilderSdk : TracerProviderBuilderBase
{
internal TracerProvider BuildSdk() => this.Build();
public TracerProviderBuilderSdk()
{
}
public TracerProviderBuilderSdk(IServiceCollection services)
: base(services)
{
}
public TracerProviderBuilderSdk(TracerProviderBuilderState state)
: base(state)
{
}
}
}

View File

@ -0,0 +1,77 @@
// <copyright file="TracerProviderBuilderServiceCollectionExtensions.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
#nullable enable
using System;
using OpenTelemetry;
using OpenTelemetry.Internal;
using OpenTelemetry.Trace;
namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Extension methods for setting up OpenTelemetry tracing services in an <see cref="IServiceCollection" />.
/// </summary>
public static class TracerProviderBuilderServiceCollectionExtensions
{
/// <summary>
/// Configures OpenTelemetry tracing services in the supplied <see cref="IServiceCollection" />.
/// </summary>
/// <remarks>
/// Notes:
/// <list type="bullet">
/// <item>A <see cref="TracerProvider"/> will not be created automatically
/// using this method. Either use the
/// <c>IServiceCollection.AddOpenTelemetryTracing</c> extension in the
/// <c>OpenTelemetry.Extensions.Hosting</c> package or access the <see
/// cref="TracerProvider"/> through the application <see
/// cref="IServiceProvider"/> to begin collecting traces.</item>
/// <item>This is safe to be called multiple times and by library authors.
/// Only a single <see cref="TracerProvider"/> will be created for a given
/// <see cref="IServiceCollection"/>.</item>
/// </list>
/// </remarks>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection ConfigureOpenTelemetryTracing(this IServiceCollection services)
=> ConfigureOpenTelemetryTracing(services, (b) => { });
/// <summary>
/// Configures OpenTelemetry tracing services in the supplied <see cref="IServiceCollection" />.
/// </summary>
/// <remarks><inheritdoc cref="ConfigureOpenTelemetryTracing(IServiceCollection)" path="/remarks"/></remarks>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
/// <param name="configure">Callback action to configure the <see cref="TracerProviderBuilder"/>.</param>
/// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
public static IServiceCollection ConfigureOpenTelemetryTracing(this IServiceCollection services, Action<TracerProviderBuilder> configure)
{
Guard.ThrowIfNull(services);
Guard.ThrowIfNull(configure);
// Accessing Sdk class is just to trigger its static ctor,
// which sets default Propagators and default Activity Id format
_ = Sdk.SuppressInstrumentation;
// Note: We need to create a builder even if there is no configure
// because the builder will register services
var builder = new TracerProviderBuilderSdk(services);
configure(builder);
return services;
}
}

View File

@ -0,0 +1,81 @@
// <copyright file="TracerProviderBuilderServiceCollectionHelper.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
#nullable enable
using System;
using System.Diagnostics;
using Microsoft.Extensions.DependencyInjection;
namespace OpenTelemetry.Trace;
internal static class TracerProviderBuilderServiceCollectionHelper
{
internal static IServiceCollection RegisterConfigureBuilderCallback(
IServiceCollection services,
Action<IServiceProvider, TracerProviderBuilder> configure)
{
Debug.Assert(configure != null, "configure was null");
return RegisterConfigureStateCallback(
services,
(sp, state) => configure!(sp, state.Builder));
}
internal static IServiceCollection RegisterConfigureStateCallback(
IServiceCollection services,
Action<IServiceProvider, TracerProviderBuilderState> configure)
{
Debug.Assert(services != null, "services was null");
Debug.Assert(configure != null, "configure was null");
return services.AddSingleton(new ConfigureTracerProviderBuilderStateCallbackRegistration(configure!));
}
internal static void InvokeRegisteredConfigureStateCallbacks(
IServiceProvider serviceProvider,
TracerProviderBuilderState state)
{
Debug.Assert(serviceProvider != null, "serviceProvider was null");
Debug.Assert(state != null, "state was null");
var callbackRegistrations = serviceProvider.GetServices<ConfigureTracerProviderBuilderStateCallbackRegistration>();
foreach (var callbackRegistration in callbackRegistrations)
{
callbackRegistration.Configure(serviceProvider!, state!);
}
}
private sealed class ConfigureTracerProviderBuilderStateCallbackRegistration
{
private readonly Action<IServiceProvider, TracerProviderBuilderState> configure;
public ConfigureTracerProviderBuilderStateCallbackRegistration(
Action<IServiceProvider, TracerProviderBuilderState> configure)
{
this.configure = configure;
}
public void Configure(IServiceProvider serviceProvider, TracerProviderBuilderState state)
{
Debug.Assert(serviceProvider != null, "serviceProvider was null");
Debug.Assert(state != null, "state was null");
this.configure(serviceProvider!, state!);
}
}
}

View File

@ -0,0 +1,145 @@
// <copyright file="TracerProviderBuilderState.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
#nullable enable
using System;
using System.Collections.Generic;
using System.Diagnostics;
using OpenTelemetry.Internal;
using OpenTelemetry.Resources;
namespace OpenTelemetry.Trace
{
/// <summary>
/// Stores state used to build a <see cref="TracerProvider"/>.
/// </summary>
internal sealed class TracerProviderBuilderState
{
internal readonly IServiceProvider ServiceProvider;
internal readonly List<InstrumentationRegistration> Instrumentation = new();
internal readonly List<BaseProcessor<Activity>> Processors = new();
internal readonly List<string> Sources = new();
internal readonly HashSet<string> LegacyActivityOperationNames = new(StringComparer.OrdinalIgnoreCase);
internal ResourceBuilder? ResourceBuilder;
internal Sampler? Sampler;
internal bool SetErrorStatusOnException;
private TracerProviderBuilderSdk? builder;
public TracerProviderBuilderState(IServiceProvider serviceProvider)
{
Debug.Assert(serviceProvider != null, "serviceProvider was null");
this.ServiceProvider = serviceProvider!;
}
public TracerProviderBuilderSdk Builder => this.builder ??= new TracerProviderBuilderSdk(this);
public void AddInstrumentation(
string instrumentationName,
string instrumentationVersion,
object instrumentation)
{
Debug.Assert(!string.IsNullOrWhiteSpace(instrumentationName), "instrumentationName was null or whitespace");
Debug.Assert(!string.IsNullOrWhiteSpace(instrumentationVersion), "instrumentationVersion was null or whitespace");
Debug.Assert(instrumentation != null, "instrumentation was null");
this.Instrumentation.Add(
new InstrumentationRegistration(
instrumentationName,
instrumentationVersion,
instrumentation!));
}
public void AddLegacySource(string operationName)
{
Debug.Assert(!string.IsNullOrWhiteSpace(operationName), "operationName was null or whitespace");
this.LegacyActivityOperationNames.Add(operationName);
}
public void AddProcessor(BaseProcessor<Activity> processor)
{
Debug.Assert(processor != null, "processor was null");
this.Processors.Add(processor!);
}
public void AddSource(params string[] names)
{
Debug.Assert(names != null, "names was null");
foreach (var name in names!)
{
Guard.ThrowIfNullOrWhitespace(name);
// TODO: We need to fix the listening model.
// Today it ignores version.
this.Sources.Add(name);
}
}
public void ConfigureResource(Action<ResourceBuilder> configure)
{
Debug.Assert(configure != null, "configure was null");
var resourceBuilder = this.ResourceBuilder ??= ResourceBuilder.CreateDefault();
configure!(resourceBuilder);
}
public void SetResourceBuilder(ResourceBuilder resourceBuilder)
{
Debug.Assert(resourceBuilder != null, "resourceBuilder was null");
this.ResourceBuilder = resourceBuilder;
}
public void SetSampler(Sampler sampler)
{
Debug.Assert(sampler != null, "sampler was null");
this.Sampler = sampler;
}
internal void EnableErrorStatusOnException()
{
try
{
this.Processors.Insert(0, new ExceptionProcessor());
}
catch (Exception ex)
{
throw new NotSupportedException($"'{nameof(TracerProviderBuilderExtensions.SetErrorStatusOnException)}' is not supported on this platform", ex);
}
}
internal readonly struct InstrumentationRegistration
{
public readonly string Name;
public readonly string Version;
public readonly object Instance;
internal InstrumentationRegistration(string name, string version, object instance)
{
this.Name = name;
this.Version = version;
this.Instance = instance;
}
}
}
}

View File

@ -0,0 +1,45 @@
// <copyright file="ExportActivityProcessorOptions.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
#nullable enable
using OpenTelemetry.Internal;
namespace OpenTelemetry.Trace;
public class ExportActivityProcessorOptions
{
private BatchExportActivityProcessorOptions? batchExportProcessorOptions;
/// <summary>
/// Gets or sets the export processor type to be used. The default value is <see cref="ExportProcessorType.Batch"/>.
/// </summary>
public ExportProcessorType ExportProcessorType { get; set; }
/// <summary>
/// Gets or sets the batch export options. Ignored unless <see cref="ExportProcessorType"/> is <see cref="ExportProcessorType.Batch"/>.
/// </summary>
public BatchExportActivityProcessorOptions BatchExportProcessorOptions
{
get => this.batchExportProcessorOptions ??= new();
set
{
Guard.ThrowIfNull(value);
this.batchExportProcessorOptions = value;
}
}
}

View File

@ -1,213 +0,0 @@
// <copyright file="TracerProviderBuilderBase.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
using System;
using System.Collections.Generic;
using System.Diagnostics;
using OpenTelemetry.Internal;
using OpenTelemetry.Resources;
namespace OpenTelemetry.Trace
{
/// <summary>
/// Build TracerProvider with Resource, Sampler, Processors and Instrumentation.
/// </summary>
public abstract class TracerProviderBuilderBase : TracerProviderBuilder
{
private readonly List<InstrumentationFactory> instrumentationFactories = new();
private readonly List<BaseProcessor<Activity>> processors = new();
private readonly List<string> sources = new();
private readonly HashSet<string> legacyActivityOperationNames = new(StringComparer.OrdinalIgnoreCase);
private ResourceBuilder resourceBuilder = ResourceBuilder.CreateDefault();
private Sampler sampler = new ParentBasedSampler(new AlwaysOnSampler());
protected TracerProviderBuilderBase()
{
}
/// <summary>
/// Gets or sets the <see cref="ResourceBuilder"/> from which the Resource associated with
/// this provider is built from. Setting this overwrites currently set ResourceBuilder.
/// </summary>
internal ResourceBuilder ResourceBuilder
{
get => this.resourceBuilder;
set
{
Guard.ThrowIfNull(value);
this.resourceBuilder = value;
}
}
/// <inheritdoc />
public override TracerProviderBuilder AddInstrumentation<TInstrumentation>(
Func<TInstrumentation> instrumentationFactory)
where TInstrumentation : class
{
Guard.ThrowIfNull(instrumentationFactory);
this.instrumentationFactories.Add(
new InstrumentationFactory(
typeof(TInstrumentation).Name,
"semver:" + typeof(TInstrumentation).Assembly.GetName().Version,
instrumentationFactory));
return this;
}
/// <inheritdoc />
public override TracerProviderBuilder AddSource(params string[] names)
{
Guard.ThrowIfNull(names);
foreach (var name in names)
{
Guard.ThrowIfNullOrWhitespace(name);
// TODO: We need to fix the listening model.
// Today it ignores version.
this.sources.Add(name);
}
return this;
}
/// <inheritdoc />
public override TracerProviderBuilder AddLegacySource(string operationName)
{
Guard.ThrowIfNullOrWhitespace(operationName);
this.legacyActivityOperationNames.Add(operationName);
return this;
}
/// <summary>
/// Sets whether the status of <see cref="Activity"/>
/// should be set to <c>Status.Error</c> when it ended abnormally due to an unhandled exception.
/// </summary>
/// <param name="enabled">Enabled or not.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
internal TracerProviderBuilder SetErrorStatusOnException(bool enabled)
{
ExceptionProcessor existingExceptionProcessor = null;
if (this.processors.Count > 0)
{
existingExceptionProcessor = this.processors[0] as ExceptionProcessor;
}
if (enabled)
{
if (existingExceptionProcessor == null)
{
try
{
this.processors.Insert(0, new ExceptionProcessor());
}
catch (Exception ex)
{
throw new NotSupportedException($"'{nameof(this.SetErrorStatusOnException)}' is not supported on this platform", ex);
}
}
}
else
{
if (existingExceptionProcessor != null)
{
this.processors.RemoveAt(0);
existingExceptionProcessor.Dispose();
}
}
return this;
}
/// <summary>
/// Sets sampler.
/// </summary>
/// <param name="sampler">Sampler instance.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
internal TracerProviderBuilder SetSampler(Sampler sampler)
{
Guard.ThrowIfNull(sampler);
this.sampler = sampler;
return this;
}
/// <summary>
/// Adds processor to the provider.
/// </summary>
/// <param name="processor">Activity processor to add.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
internal TracerProviderBuilder AddProcessor(BaseProcessor<Activity> processor)
{
Guard.ThrowIfNull(processor);
this.processors.Add(processor);
return this;
}
/// <summary>
/// Adds instrumentation to the provider.
/// </summary>
/// <param name="instrumentationName">Instrumentation name.</param>
/// <param name="instrumentationVersion">Instrumentation version.</param>
/// <param name="instrumentationFactory">Function that builds instrumentation.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
protected TracerProviderBuilder AddInstrumentation(
string instrumentationName,
string instrumentationVersion,
Func<object> instrumentationFactory)
{
this.instrumentationFactories.Add(
new InstrumentationFactory(instrumentationName, instrumentationVersion, instrumentationFactory));
return this;
}
/// <summary>
/// Run the configured actions to initialize the <see cref="TracerProvider"/>.
/// </summary>
/// <returns><see cref="TracerProvider"/>.</returns>
protected TracerProvider Build()
{
return new TracerProviderSdk(
this.resourceBuilder.Build(),
this.sources,
this.instrumentationFactories,
this.sampler,
this.processors,
this.legacyActivityOperationNames);
}
internal readonly struct InstrumentationFactory
{
public readonly string Name;
public readonly string Version;
public readonly Func<object> Factory;
internal InstrumentationFactory(string name, string version, Func<object> factory)
{
this.Name = name;
this.Version = version;
this.Factory = factory;
}
}
}
}

View File

@ -1,137 +0,0 @@
// <copyright file="TracerProviderBuilderExtensions.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>
using System;
using System.Diagnostics;
using OpenTelemetry.Internal;
using OpenTelemetry.Resources;
namespace OpenTelemetry.Trace
{
/// <summary>
/// Contains extension methods for the <see cref="TracerProviderBuilder"/> class.
/// </summary>
public static class TracerProviderBuilderExtensions
{
/// <summary>
/// Sets whether the status of <see cref="Activity"/>
/// should be set to <c>Status.Error</c> when it ended abnormally due to an unhandled exception.
/// </summary>
/// <param name="tracerProviderBuilder">TracerProviderBuilder instance.</param>
/// <param name="enabled">Enabled or not. Default value is <c>true</c>.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder SetErrorStatusOnException(this TracerProviderBuilder tracerProviderBuilder, bool enabled = true)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.SetErrorStatusOnException(enabled);
}
return tracerProviderBuilder;
}
/// <summary>
/// Sets sampler.
/// </summary>
/// <param name="tracerProviderBuilder">TracerProviderBuilder instance.</param>
/// <param name="sampler">Sampler instance.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder SetSampler(this TracerProviderBuilder tracerProviderBuilder, Sampler sampler)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.SetSampler(sampler);
}
return tracerProviderBuilder;
}
/// <summary>
/// Sets the <see cref="ResourceBuilder"/> from which the Resource associated with
/// this provider is built from. Overwrites currently set ResourceBuilder.
/// You should usually use <see cref="ConfigureResource(TracerProviderBuilder, Action{ResourceBuilder})"/> instead
/// (call <see cref="ResourceBuilder.Clear"/> if desired).
/// </summary>
/// <param name="tracerProviderBuilder">TracerProviderBuilder instance.</param>
/// <param name="resourceBuilder"><see cref="ResourceBuilder"/> from which Resource will be built.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder SetResourceBuilder(this TracerProviderBuilder tracerProviderBuilder, ResourceBuilder resourceBuilder)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.ResourceBuilder = resourceBuilder;
}
return tracerProviderBuilder;
}
/// <summary>
/// Modify the <see cref="ResourceBuilder"/> from which the Resource associated with
/// this provider is built from in-place.
/// </summary>
/// <param name="tracerProviderBuilder">TracerProviderBuilder instance.</param>
/// <param name="configure">An action which modifies the provided <see cref="ResourceBuilder"/> in-place.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder ConfigureResource(this TracerProviderBuilder tracerProviderBuilder, Action<ResourceBuilder> configure)
{
Guard.ThrowIfNull(tracerProviderBuilder, nameof(tracerProviderBuilder));
Guard.ThrowIfNull(configure, nameof(configure));
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
configure(tracerProviderBuilderBase.ResourceBuilder);
}
return tracerProviderBuilder;
}
/// <summary>
/// Adds processor to the provider.
/// </summary>
/// <param name="tracerProviderBuilder">TracerProviderBuilder instance.</param>
/// <param name="processor">Activity processor to add.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder AddProcessor(this TracerProviderBuilder tracerProviderBuilder, BaseProcessor<Activity> processor)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.AddProcessor(processor);
}
return tracerProviderBuilder;
}
/// <summary>
/// Run the given actions to initialize the <see cref="TracerProvider"/>.
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <returns><see cref="TracerProvider"/>.</returns>
public static TracerProvider Build(this TracerProviderBuilder tracerProviderBuilder)
{
if (tracerProviderBuilder is IDeferredTracerProviderBuilder)
{
throw new NotSupportedException($"'{nameof(TracerProviderBuilder)}' requires a '{nameof(IServiceProvider)}' to build");
}
if (tracerProviderBuilder is TracerProviderBuilderSdk tracerProviderBuilderSdk)
{
return tracerProviderBuilderSdk.BuildSdk();
}
return null;
}
}
}

View File

@ -14,6 +14,8 @@
// limitations under the License.
// </copyright>
#nullable enable
using System;
using System.Diagnostics;
using System.Threading;

View File

@ -14,6 +14,8 @@
// limitations under the License.
// </copyright>
#nullable enable
using System;
using System.Collections.Generic;
using System.Diagnostics;
@ -26,65 +28,76 @@ namespace OpenTelemetry.Trace
{
internal sealed class TracerProviderSdk : TracerProvider
{
internal readonly IDisposable? OwnedServiceProvider;
internal int ShutdownCount;
internal bool Disposed;
private readonly List<object> instrumentations = new();
private readonly ActivityListener listener;
private readonly Sampler sampler;
private readonly Action<Activity> getRequestedDataAction;
private readonly bool supportLegacyActivity;
private BaseProcessor<Activity> processor;
private bool disposed;
private BaseProcessor<Activity>? processor;
internal TracerProviderSdk(
Resource resource,
IEnumerable<string> sources,
IEnumerable<TracerProviderBuilderBase.InstrumentationFactory> instrumentationFactories,
Sampler sampler,
List<BaseProcessor<Activity>> processors,
HashSet<string> legacyActivityOperationNames)
IServiceProvider serviceProvider,
bool ownsServiceProvider)
{
this.Resource = resource;
this.sampler = sampler;
this.supportLegacyActivity = legacyActivityOperationNames.Count > 0;
if (ownsServiceProvider)
{
this.OwnedServiceProvider = serviceProvider as IDisposable;
Debug.Assert(this.OwnedServiceProvider != null, "serviceProvider was not IDisposable");
}
var state = new TracerProviderBuilderState(serviceProvider);
TracerProviderBuilderServiceCollectionHelper.InvokeRegisteredConfigureStateCallbacks(
serviceProvider,
state);
if (state.SetErrorStatusOnException)
{
state.EnableErrorStatusOnException();
}
this.Resource = (state.ResourceBuilder ?? ResourceBuilder.CreateDefault()).Build();
this.sampler = state.Sampler ?? new ParentBasedSampler(new AlwaysOnSampler());
this.supportLegacyActivity = state.LegacyActivityOperationNames.Count > 0;
bool legacyActivityWildcardMode = false;
var legacyActivityWildcardModeRegex = WildcardHelper.GetWildcardRegex();
foreach (var legacyName in legacyActivityOperationNames)
foreach (var legacyName in state.LegacyActivityOperationNames)
{
if (WildcardHelper.ContainsWildcard(legacyName))
{
legacyActivityWildcardMode = true;
legacyActivityWildcardModeRegex = WildcardHelper.GetWildcardRegex(legacyActivityOperationNames);
legacyActivityWildcardModeRegex = WildcardHelper.GetWildcardRegex(state.LegacyActivityOperationNames);
break;
}
}
foreach (var processor in processors)
foreach (var processor in state.Processors)
{
this.AddProcessor(processor);
}
if (instrumentationFactories.Any())
foreach (var instrumentation in state.Instrumentation)
{
foreach (var instrumentationFactory in instrumentationFactories)
{
this.instrumentations.Add(instrumentationFactory.Factory());
}
this.instrumentations.Add(instrumentation.Instance);
}
var listener = new ActivityListener();
if (this.supportLegacyActivity)
{
Func<Activity, bool> legacyActivityPredicate = null;
Func<Activity, bool>? legacyActivityPredicate = null;
if (legacyActivityWildcardMode)
{
legacyActivityPredicate = activity => legacyActivityWildcardModeRegex.IsMatch(activity.OperationName);
}
else
{
legacyActivityPredicate = activity => legacyActivityOperationNames.Contains(activity.OperationName);
legacyActivityPredicate = activity => state.LegacyActivityOperationNames.Contains(activity.OperationName);
}
listener.ActivityStarted = activity =>
@ -100,7 +113,7 @@ namespace OpenTelemetry.Trace
// unless suppressed.
if (!Sdk.SuppressInstrumentation)
{
this.getRequestedDataAction(activity);
this.getRequestedDataAction!(activity);
}
else
{
@ -190,13 +203,13 @@ namespace OpenTelemetry.Trace
};
}
if (sampler is AlwaysOnSampler)
if (this.sampler is AlwaysOnSampler)
{
listener.Sample = (ref ActivityCreationOptions<ActivityContext> options) =>
!Sdk.SuppressInstrumentation ? ActivitySamplingResult.AllDataAndRecorded : ActivitySamplingResult.None;
this.getRequestedDataAction = this.RunGetRequestedDataAlwaysOnSampler;
}
else if (sampler is AlwaysOffSampler)
else if (this.sampler is AlwaysOffSampler)
{
listener.Sample = (ref ActivityCreationOptions<ActivityContext> options) =>
!Sdk.SuppressInstrumentation ? PropagateOrIgnoreData(options.Parent) : ActivitySamplingResult.None;
@ -206,19 +219,19 @@ namespace OpenTelemetry.Trace
{
// This delegate informs ActivitySource about sampling decision when the parent context is an ActivityContext.
listener.Sample = (ref ActivityCreationOptions<ActivityContext> options) =>
!Sdk.SuppressInstrumentation ? ComputeActivitySamplingResult(options, sampler) : ActivitySamplingResult.None;
!Sdk.SuppressInstrumentation ? ComputeActivitySamplingResult(options, this.sampler) : ActivitySamplingResult.None;
this.getRequestedDataAction = this.RunGetRequestedDataOtherSampler;
}
// Sources can be null. This happens when user
// is only interested in InstrumentationLibraries
// which do not depend on ActivitySources.
if (sources.Any())
if (state.Sources.Any())
{
// Validation of source name is already done in builder.
if (sources.Any(s => WildcardHelper.ContainsWildcard(s)))
if (state.Sources.Any(s => WildcardHelper.ContainsWildcard(s)))
{
var regex = WildcardHelper.GetWildcardRegex(sources);
var regex = WildcardHelper.GetWildcardRegex(state.Sources);
// Function which takes ActivitySource and returns true/false to indicate if it should be subscribed to
// or not.
@ -229,7 +242,7 @@ namespace OpenTelemetry.Trace
}
else
{
var activitySources = new HashSet<string>(sources, StringComparer.OrdinalIgnoreCase);
var activitySources = new HashSet<string>(state.Sources, StringComparer.OrdinalIgnoreCase);
if (this.supportLegacyActivity)
{
@ -257,7 +270,7 @@ namespace OpenTelemetry.Trace
internal List<object> Instrumentations => this.instrumentations;
internal BaseProcessor<Activity> Processor => this.processor;
internal BaseProcessor<Activity>? Processor => this.processor;
internal Sampler Sampler => this.sampler;
@ -331,7 +344,7 @@ namespace OpenTelemetry.Trace
protected override void Dispose(bool disposing)
{
if (!this.disposed)
if (!this.Disposed)
{
if (disposing)
{
@ -355,9 +368,11 @@ namespace OpenTelemetry.Trace
// Redis instrumentation, for example, flushes during dispose which creates Activity objects for any profiling
// sessions that were open.
this.listener?.Dispose();
this.OwnedServiceProvider?.Dispose();
}
this.disposed = true;
this.Disposed = true;
OpenTelemetrySdkEventSource.Log.ProviderDisposed(nameof(TracerProvider));
}

View File

@ -91,7 +91,7 @@ namespace OpenTelemetry.Extensions.Hosting.Tests
services.AddSingleton(testInstrumentation);
services.AddOpenTelemetryTracing(builder =>
{
builder.Configure(
builder.ConfigureBuilder(
(sp, b) => b.AddInstrumentation(() => sp.GetRequiredService<TestInstrumentation>()));
});
@ -115,7 +115,7 @@ namespace OpenTelemetry.Extensions.Hosting.Tests
Assert.Throws<ArgumentNullException>(() =>
services.AddOpenTelemetryTracing(builder =>
{
builder.Configure(
builder.ConfigureBuilder(
(sp, b) => b.AddInstrumentation(() => sp.GetRequiredService<TestInstrumentation>()));
}));
}
@ -139,10 +139,10 @@ namespace OpenTelemetry.Extensions.Hosting.Tests
int configureCalls = 0;
var services = new ServiceCollection();
services.AddOpenTelemetryTracing(builder => builder
.Configure((sp1, builder1) =>
.ConfigureBuilder((sp1, builder1) =>
{
configureCalls++;
builder1.Configure((sp2, builder2) =>
builder1.ConfigureBuilder((sp2, builder2) =>
{
configureCalls++;
});
@ -165,7 +165,7 @@ namespace OpenTelemetry.Extensions.Hosting.Tests
services.AddSingleton<TestSampler>();
services.AddOpenTelemetryTracing(builder => builder
.Configure((sp1, builder1) =>
.ConfigureBuilder((sp1, builder1) =>
{
builder1
.AddInstrumentation<TestInstrumentation>()
@ -182,40 +182,25 @@ namespace OpenTelemetry.Extensions.Hosting.Tests
Assert.True(tracerProvider.Sampler is TestSampler);
}
[Fact(Skip = "Known limitation. See issue 1215.")]
public void AddOpenTelemetryTracerProvider_Idempotent()
[Fact]
public void AddOpenTelemetryTracing_MultipleCallsConfigureSingleProvider()
{
var testInstrumentation1 = new TestInstrumentation();
var testInstrumentation2 = new TestInstrumentation();
var services = new ServiceCollection();
services.AddSingleton(testInstrumentation1);
services.AddOpenTelemetryTracing(builder =>
{
builder.AddInstrumentation(() => testInstrumentation1);
});
services.AddOpenTelemetryTracing(builder =>
{
builder.AddInstrumentation(() => testInstrumentation2);
});
services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSourceBuilder1"));
services.AddOpenTelemetryTracing();
services.AddOpenTelemetryTracing(builder => builder.AddSource("TestSourceBuilder2"));
var serviceProvider = services.BuildServiceProvider();
using var serviceProvider = services.BuildServiceProvider();
var tracerFactory = serviceProvider.GetRequiredService<TracerProvider>();
Assert.NotNull(tracerFactory);
var providers = serviceProvider.GetServices<TracerProvider>();
Assert.False(testInstrumentation1.Disposed);
Assert.False(testInstrumentation2.Disposed);
serviceProvider.Dispose();
Assert.True(testInstrumentation1.Disposed);
Assert.True(testInstrumentation2.Disposed);
Assert.Single(providers);
}
private static TracerProviderBuilder AddMyFeature(TracerProviderBuilder tracerProviderBuilder)
{
(tracerProviderBuilder.GetServices() ?? throw new NotSupportedException("MyFeature requires a hosting TracerProviderBuilder instance."))
.AddSingleton<TestSampler>();
tracerProviderBuilder.ConfigureServices(services => services.AddSingleton<TestSampler>());
return tracerProviderBuilder.SetSampler<TestSampler>();
}

View File

@ -15,7 +15,12 @@
// </copyright>
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using OpenTelemetry.Resources;
using Xunit;
namespace OpenTelemetry.Trace.Tests
@ -106,5 +111,365 @@ namespace OpenTelemetry.Trace.Tests
Assert.Equal(StatusCode.Unset, activity.GetStatus().StatusCode);
}
[Fact]
public void ServiceLifecycleAvailableToSDKBuilderTest()
{
var builder = Sdk.CreateTracerProviderBuilder();
builder.ConfigureServices(services => services.AddSingleton<MyInstrumentation>());
MyInstrumentation myInstrumentation = null;
RunBuilderServiceLifecycleTest(
builder,
() =>
{
var provider = builder.Build() as TracerProviderSdk;
// Note: Build can only be called once
Assert.Throws<NotSupportedException>(() => builder.Build());
Assert.NotNull(provider);
Assert.NotNull(provider.OwnedServiceProvider);
myInstrumentation = ((IServiceProvider)provider.OwnedServiceProvider).GetRequiredService<MyInstrumentation>();
return provider;
},
provider =>
{
provider.Dispose();
});
Assert.NotNull(myInstrumentation);
Assert.True(myInstrumentation.Disposed);
}
[Fact]
public void ServiceLifecycleAvailableToServicesBuilderTest()
{
var services = new ServiceCollection();
bool testRun = false;
ServiceProvider serviceProvider = null;
TracerProviderSdk provider = null;
services.ConfigureOpenTelemetryTracing(builder =>
{
testRun = true;
RunBuilderServiceLifecycleTest(
builder,
() =>
{
// Note: Build can't be called directly on builder tied to external services
Assert.Throws<NotSupportedException>(() => builder.Build());
serviceProvider = services.BuildServiceProvider();
provider = serviceProvider.GetRequiredService<TracerProvider>() as TracerProviderSdk;
Assert.NotNull(provider);
Assert.Null(provider.OwnedServiceProvider);
return provider;
},
(provider) => { });
});
Assert.True(testRun);
Assert.NotNull(serviceProvider);
Assert.NotNull(provider);
Assert.False(provider.Disposed);
serviceProvider.Dispose();
Assert.True(provider.Disposed);
}
[Fact]
public void SingleProviderForServiceCollectionTest()
{
var services = new ServiceCollection();
services.ConfigureOpenTelemetryTracing(builder =>
{
builder.AddInstrumentation<MyInstrumentation>(() => new());
});
services.ConfigureOpenTelemetryTracing(builder =>
{
builder.AddInstrumentation<MyInstrumentation>(() => new());
});
using var serviceProvider = services.BuildServiceProvider();
Assert.NotNull(serviceProvider);
var tracerProviders = serviceProvider.GetServices<TracerProvider>();
Assert.Single(tracerProviders);
var provider = tracerProviders.First() as TracerProviderSdk;
Assert.NotNull(provider);
Assert.Equal(2, provider.Instrumentations.Count);
}
[Fact]
public void AddProcessorUsingDependencyInjectionTest()
{
var builder = Sdk.CreateTracerProviderBuilder();
builder.AddProcessor<MyProcessor>();
builder.AddProcessor<MyProcessor>();
using var provider = builder.Build() as TracerProviderSdk;
Assert.NotNull(provider);
var processors = ((IServiceProvider)provider.OwnedServiceProvider).GetServices<MyProcessor>();
// Note: Two "Add" calls but it is a singleton so only a single registration is produced
Assert.Single(processors);
var processor = provider.Processor as CompositeProcessor<Activity>;
Assert.NotNull(processor);
// Note: Two "Add" calls due yield two processors added to provider, even though they are the same
Assert.True(processor.Head.Value is MyProcessor);
Assert.True(processor.Head.Next?.Value is MyProcessor);
}
[Fact]
public void SetAndConfigureResourceTest()
{
var builder = Sdk.CreateTracerProviderBuilder();
int configureInvocations = 0;
builder.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddService("Test"));
builder.ConfigureResource(builder =>
{
configureInvocations++;
Assert.Single(builder.Resources);
builder.AddAttributes(new Dictionary<string, object>() { ["key1"] = "value1" });
Assert.Equal(2, builder.Resources.Count);
});
builder.SetResourceBuilder(ResourceBuilder.CreateEmpty());
builder.ConfigureResource(builder =>
{
configureInvocations++;
Assert.Empty(builder.Resources);
builder.AddAttributes(new Dictionary<string, object>() { ["key2"] = "value2" });
Assert.Single(builder.Resources);
});
using var provider = builder.Build() as TracerProviderSdk;
Assert.Equal(2, configureInvocations);
Assert.Single(provider.Resource.Attributes);
Assert.Contains(provider.Resource.Attributes, kvp => kvp.Key == "key2" && (string)kvp.Value == "value2");
}
[Fact]
public void AddExporterTest()
{
var builder = Sdk.CreateTracerProviderBuilder();
builder.AddExporter(ExportProcessorType.Simple, new MyExporter());
builder.AddExporter<MyExporter>(ExportProcessorType.Batch);
using var provider = builder.Build() as TracerProviderSdk;
Assert.NotNull(provider);
var processor = provider.Processor as CompositeProcessor<Activity>;
Assert.NotNull(processor);
var firstProcessor = processor.Head.Value;
var secondProcessor = processor.Head.Next?.Value;
Assert.True(firstProcessor is SimpleActivityExportProcessor simpleProcessor && simpleProcessor.Exporter is MyExporter);
Assert.True(secondProcessor is BatchActivityExportProcessor batchProcessor && batchProcessor.Exporter is MyExporter);
}
[Fact]
public void AddExporterWithOptionsTest()
{
int optionsInvocations = 0;
var builder = Sdk.CreateTracerProviderBuilder();
builder.ConfigureServices(services =>
{
services.Configure<BatchExportActivityProcessorOptions>(options =>
{
// Note: This is testing options integration
optionsInvocations++;
options.MaxExportBatchSize = 18;
});
});
builder.AddExporter(
ExportProcessorType.Simple,
new MyExporter(),
options =>
{
// Note: Options delegate isn't invoked for simple processor type
Assert.True(false);
});
builder.AddExporter<MyExporter>(
ExportProcessorType.Batch,
options =>
{
optionsInvocations++;
Assert.Equal(18, options.BatchExportProcessorOptions.MaxExportBatchSize);
options.BatchExportProcessorOptions.MaxExportBatchSize = 100;
});
using var provider = builder.Build() as TracerProviderSdk;
Assert.NotNull(provider);
Assert.Equal(2, optionsInvocations);
var processor = provider.Processor as CompositeProcessor<Activity>;
Assert.NotNull(processor);
var firstProcessor = processor.Head.Value;
var secondProcessor = processor.Head.Next?.Value;
Assert.True(firstProcessor is SimpleActivityExportProcessor simpleProcessor && simpleProcessor.Exporter is MyExporter);
Assert.True(secondProcessor is BatchActivityExportProcessor batchProcessor
&& batchProcessor.Exporter is MyExporter
&& batchProcessor.MaxExportBatchSize == 100);
}
private static void RunBuilderServiceLifecycleTest(
TracerProviderBuilder builder,
Func<TracerProviderSdk> buildFunc,
Action<TracerProviderSdk> postAction)
{
var baseBuilder = builder as TracerProviderBuilderBase;
Assert.Null(baseBuilder.State);
builder
.AddSource("TestSource")
.AddLegacySource("TestLegacySource")
.SetSampler<MySampler>();
bool configureServicesCalled = false;
builder.ConfigureServices(services =>
{
configureServicesCalled = true;
Assert.NotNull(services);
services.TryAddSingleton<MyProcessor>();
services.ConfigureOpenTelemetryTracing(b =>
{
// Note: This is strange to call ConfigureOpenTelemetryTracing here, but supported
b.AddInstrumentation<MyInstrumentation>();
});
});
int configureBuilderInvocations = 0;
builder.ConfigureBuilder((sp, builder) =>
{
configureBuilderInvocations++;
var baseBuilder = builder as TracerProviderBuilderBase;
Assert.NotNull(baseBuilder?.State);
builder
.AddSource("TestSource2")
.AddLegacySource("TestLegacySource2");
Assert.Contains(baseBuilder.State.Sources, s => s == "TestSource");
Assert.Contains(baseBuilder.State.Sources, s => s == "TestSource2");
Assert.Contains(baseBuilder.State.LegacyActivityOperationNames, s => s == "TestLegacySource");
Assert.Contains(baseBuilder.State.LegacyActivityOperationNames, s => s == "TestLegacySource2");
// Note: Services can't be configured at this stage
Assert.Throws<NotSupportedException>(
() => builder.ConfigureServices(services => services.TryAddSingleton<TracerProviderBuilderExtensionsTest>()));
builder.AddProcessor(sp.GetRequiredService<MyProcessor>());
builder.ConfigureBuilder((_, b) =>
{
// Note: ConfigureBuilder calls can be nested, this is supported
configureBuilderInvocations++;
b.ConfigureBuilder((_, _) =>
{
configureBuilderInvocations++;
});
});
});
var provider = buildFunc();
Assert.True(configureServicesCalled);
Assert.Equal(3, configureBuilderInvocations);
Assert.True(provider.Sampler is MySampler);
Assert.Single(provider.Instrumentations);
Assert.True(provider.Instrumentations[0] is MyInstrumentation);
Assert.True(provider.Processor is MyProcessor);
postAction(provider);
}
private sealed class MySampler : Sampler
{
public override SamplingResult ShouldSample(in SamplingParameters samplingParameters)
{
return new SamplingResult(SamplingDecision.RecordAndSample);
}
}
private sealed class MyInstrumentation : IDisposable
{
internal bool Disposed;
public void Dispose()
{
this.Disposed = true;
}
}
private sealed class MyProcessor : BaseProcessor<Activity>
{
}
private sealed class MyExporter : BaseExporter<Activity>
{
public override ExportResult Export(in Batch<Activity> batch)
{
return ExportResult.Success;
}
}
}
}

View File

@ -16,12 +16,11 @@
using System;
using System.Diagnostics;
using OpenTelemetry.Trace;
using OpenTelemetry.Tests;
using Xunit;
namespace OpenTelemetry.Tests.Trace
namespace OpenTelemetry.Trace.Tests
{
public class TracerProviderExtensionsTest
{