Support named options in the tracer provider builder AddExporter API. (#3659)

This commit is contained in:
Mikel Blanchard 2022-09-14 09:35:49 -07:00 committed by GitHub
parent d99307da34
commit 3a8f139e8e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 95 additions and 18 deletions

View File

@ -38,6 +38,8 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddInstrumentation<T
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader<T>(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action<System.IServiceProvider!, OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action<Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter, string? name, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>? configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, string? name, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>? configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
~OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string traceStateString) -> void
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes, string traceStateString) -> void

View File

@ -38,6 +38,8 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddInstrumentation<T
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader<T>(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action<System.IServiceProvider!, OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action<Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter, string? name, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>? configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, string? name, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>? configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
~OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string traceStateString) -> void
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes, string traceStateString) -> void

View File

@ -38,6 +38,8 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddInstrumentation<T
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader<T>(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action<System.IServiceProvider!, OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action<Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter, string? name, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>? configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, string? name, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>? configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
~OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string traceStateString) -> void
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes, string traceStateString) -> void

View File

@ -38,6 +38,8 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddInstrumentation<T
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.AddReader<T>(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureBuilder(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action<System.IServiceProvider!, OpenTelemetry.Metrics.MeterProviderBuilder!>! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Metrics.MeterProviderBuilder! meterProviderBuilder, System.Action<Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configure) -> OpenTelemetry.Metrics.MeterProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, OpenTelemetry.BaseExporter<System.Diagnostics.Activity!>! exporter, string? name, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>? configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.AddExporter<T>(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.ExportProcessorType exportProcessorType, string? name, System.Action<OpenTelemetry.Trace.ExportActivityProcessorOptions!>? configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
~OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string traceStateString) -> void
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes, string traceStateString) -> void

View File

@ -115,27 +115,24 @@ namespace OpenTelemetry.Trace
return this;
}
internal TracerProviderBuilder AddExporter<T>(ExportProcessorType exportProcessorType, Action<ExportActivityProcessorOptions> configure)
internal TracerProviderBuilder AddExporter<T>(ExportProcessorType exportProcessorType, string? name, 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)));
BuildExportProcessor(state.ServiceProvider, exportProcessorType, sp.GetRequiredService<T>(), name, configure)));
return this;
}
internal TracerProviderBuilder AddExporter(ExportProcessorType exportProcessorType, BaseExporter<Activity> exporter, Action<ExportActivityProcessorOptions> configure)
internal TracerProviderBuilder AddExporter(ExportProcessorType exportProcessorType, BaseExporter<Activity> exporter, string? name, Action<ExportActivityProcessorOptions>? configure)
{
Guard.ThrowIfNull(exporter);
Guard.ThrowIfNull(configure);
this.ConfigureState((sp, state)
=> state.AddProcessor(
BuildExportProcessor(state.ServiceProvider, exportProcessorType, exporter, configure)));
BuildExportProcessor(state.ServiceProvider, exportProcessorType, exporter, name, configure)));
return this;
}
@ -271,8 +268,11 @@ namespace OpenTelemetry.Trace
IServiceProvider serviceProvider,
ExportProcessorType exportProcessorType,
BaseExporter<Activity> exporter,
Action<ExportActivityProcessorOptions> configure)
string? name,
Action<ExportActivityProcessorOptions>? configure)
{
name ??= Options.DefaultName;
switch (exportProcessorType)
{
case ExportProcessorType.Simple:
@ -281,10 +281,10 @@ namespace OpenTelemetry.Trace
var options = new ExportActivityProcessorOptions
{
ExportProcessorType = ExportProcessorType.Batch,
BatchExportProcessorOptions = serviceProvider.GetRequiredService<IOptions<BatchExportActivityProcessorOptions>>().Value,
BatchExportProcessorOptions = serviceProvider.GetRequiredService<IOptionsSnapshot<BatchExportActivityProcessorOptions>>().Get(name),
};
configure(options);
configure?.Invoke(options);
var batchOptions = options.BatchExportProcessorOptions;
@ -332,10 +332,7 @@ namespace OpenTelemetry.Trace
{
var services = this.services;
if (services != null)
{
services.TryAddSingleton<T>();
}
services?.TryAddSingleton<T>();
}
}
}

View File

@ -166,7 +166,7 @@ namespace OpenTelemetry.Trace
this TracerProviderBuilder tracerProviderBuilder,
ExportProcessorType exportProcessorType,
BaseExporter<Activity> exporter)
=> AddExporter(tracerProviderBuilder, exportProcessorType, exporter, o => { });
=> AddExporter(tracerProviderBuilder, exportProcessorType, exporter, name: null, configure: null);
/// <summary>
/// Adds an exporter to the provider.
@ -184,10 +184,30 @@ namespace OpenTelemetry.Trace
ExportProcessorType exportProcessorType,
BaseExporter<Activity> exporter,
Action<ExportActivityProcessorOptions> configure)
=> AddExporter(tracerProviderBuilder, exportProcessorType, exporter, name: null, configure);
/// <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="name">Name which is used when retrieving options.</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,
string? name,
Action<ExportActivityProcessorOptions>? configure)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.AddExporter(exportProcessorType, exporter, configure);
tracerProviderBuilderBase.AddExporter(exportProcessorType, exporter, name, configure);
}
return tracerProviderBuilder;
@ -208,7 +228,7 @@ namespace OpenTelemetry.Trace
this TracerProviderBuilder tracerProviderBuilder,
ExportProcessorType exportProcessorType)
where T : BaseExporter<Activity>
=> AddExporter<T>(tracerProviderBuilder, exportProcessorType, o => { });
=> AddExporter<T>(tracerProviderBuilder, exportProcessorType, name: null, configure: null);
/// <summary>
/// Adds an exporter to the provider which will be retrieved using dependency injection.
@ -230,10 +250,34 @@ namespace OpenTelemetry.Trace
ExportProcessorType exportProcessorType,
Action<ExportActivityProcessorOptions> configure)
where T : BaseExporter<Activity>
=> AddExporter<T>(tracerProviderBuilder, exportProcessorType, name: null, configure);
/// <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="name">Name which is used when retrieving options.</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,
string? name,
Action<ExportActivityProcessorOptions>? configure)
where T : BaseExporter<Activity>
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.AddExporter<T>(exportProcessorType, configure);
tracerProviderBuilderBase.AddExporter<T>(exportProcessorType, name, configure);
}
return tracerProviderBuilder;

View File

@ -365,6 +365,34 @@ namespace OpenTelemetry.Trace.Tests
&& batchProcessor.MaxExportBatchSize == 100);
}
[Fact]
public void AddExporterNamedOptionsTest()
{
var builder = Sdk.CreateTracerProviderBuilder();
int defaultOptionsConfigureInvocations = 0;
int namedOptionsConfigureInvocations = 0;
builder.ConfigureServices(services =>
{
services.Configure<BatchExportActivityProcessorOptions>(o => defaultOptionsConfigureInvocations++);
services.Configure<BatchExportActivityProcessorOptions>("Exporter2", o => namedOptionsConfigureInvocations++);
});
builder.AddExporter(ExportProcessorType.Batch, new MyExporter());
builder.AddExporter(ExportProcessorType.Batch, new MyExporter(), name: "Exporter2", configure: null);
builder.AddExporter<MyExporter>(ExportProcessorType.Batch);
builder.AddExporter<MyExporter>(ExportProcessorType.Batch, name: "Exporter2", configure: null);
using var provider = builder.Build() as TracerProviderSdk;
Assert.NotNull(provider);
Assert.Equal(1, defaultOptionsConfigureInvocations);
Assert.Equal(1, namedOptionsConfigureInvocations);
}
private static void RunBuilderServiceLifecycleTest(
TracerProviderBuilder builder,
Func<TracerProviderSdk> buildFunc,