Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Metrics] Clean up repo exporters to use new DI patterns #3648

Merged
merged 8 commits into from
Sep 13, 2022
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

using System;
using System.Threading;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using OpenTelemetry.Exporter;
using OpenTelemetry.Internal;

Expand All @@ -36,7 +38,7 @@ public static class ConsoleExporterMetricsExtensions
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
public static MeterProviderBuilder AddConsoleExporter(this MeterProviderBuilder builder)
{
return AddConsoleExporter(builder, options => { });
return AddConsoleExporter(builder, configureExporter: null);
}

/// <summary>
Expand All @@ -49,15 +51,18 @@ public static MeterProviderBuilder AddConsoleExporter(this MeterProviderBuilder
{
Guard.ThrowIfNull(builder);

if (builder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder)
if (configureExporter != null)
{
return deferredMeterProviderBuilder.Configure((sp, builder) =>
{
AddConsoleExporter(builder, sp.GetOptions<ConsoleExporterOptions>(), sp.GetOptions<MetricReaderOptions>(), configureExporter, null);
});
builder.ConfigureServices(services => services.Configure(configureExporter));
}

return AddConsoleExporter(builder, new ConsoleExporterOptions(), new MetricReaderOptions(), configureExporter, null);
return builder.ConfigureBuilder((sp, builder) =>
{
AddConsoleExporter(
builder,
sp.GetRequiredService<IOptions<ConsoleExporterOptions>>().Value,
sp.GetRequiredService<IOptions<MetricReaderOptions>>().Value);
});
}

/// <summary>
Expand All @@ -70,35 +75,24 @@ public static MeterProviderBuilder AddConsoleExporter(
this MeterProviderBuilder builder,
Action<ConsoleExporterOptions, MetricReaderOptions> configureExporterAndMetricReader)
{
Guard.ThrowIfNull(builder, nameof(builder));
Guard.ThrowIfNull(builder);

if (builder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder)
return builder.ConfigureBuilder((sp, builder) =>
{
return deferredMeterProviderBuilder.Configure((sp, builder) =>
{
AddConsoleExporter(builder, sp.GetOptions<ConsoleExporterOptions>(), sp.GetOptions<MetricReaderOptions>(), null, configureExporterAndMetricReader);
});
}
var exporterOptions = sp.GetRequiredService<IOptions<ConsoleExporterOptions>>().Value;
var metricReaderOptions = sp.GetRequiredService<IOptions<MetricReaderOptions>>().Value;

return AddConsoleExporter(builder, new ConsoleExporterOptions(), new MetricReaderOptions(), null, configureExporterAndMetricReader);
configureExporterAndMetricReader?.Invoke(exporterOptions, metricReaderOptions);

AddConsoleExporter(builder, exporterOptions, metricReaderOptions);
});
}

private static MeterProviderBuilder AddConsoleExporter(
MeterProviderBuilder builder,
ConsoleExporterOptions exporterOptions,
MetricReaderOptions metricReaderOptions,
Action<ConsoleExporterOptions> configureExporter,
Action<ConsoleExporterOptions, MetricReaderOptions> configureExporterAndMetricReader)
MetricReaderOptions metricReaderOptions)
{
if (configureExporterAndMetricReader != null)
{
configureExporterAndMetricReader.Invoke(exporterOptions, metricReaderOptions);
}
else
{
configureExporter?.Invoke(exporterOptions);
}

var metricExporter = new ConsoleMetricExporter(exporterOptions);

var metricReader = PeriodicExportingMetricReaderHelper.CreatePeriodicExportingMetricReader(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\EnvironmentVariableHelper.cs" Link="Includes\EnvironmentVariableHelper.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\OpenTelemetrySdkEventSource.cs" Link="Includes\OpenTelemetrySdkEventSource.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PeriodicExportingMetricReaderHelper.cs" Link="Includes\PeriodicExportingMetricReaderHelper.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\ServiceProviderExtensions.cs" Link="Includes\ServiceProviderExtensions.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\TagTransformer.cs" Link="Includes\TagTransformer.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry.Api\Internal\ExceptionExtensions.cs" Link="Includes\ExceptionExtensions.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry.Api\Internal\Guard.cs" Link="Includes\Guard.cs" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
override OpenTelemetry.Exporter.InMemoryExporter<T>.Dispose(bool disposing) -> void
static OpenTelemetry.Metrics.InMemoryExporterMetricsExtensions.AddInMemoryExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, string name, System.Collections.Generic.ICollection<OpenTelemetry.Metrics.Metric> exportedItems, System.Action<OpenTelemetry.Metrics.MetricReaderOptions> configureMetricReader) -> OpenTelemetry.Metrics.MeterProviderBuilder
static OpenTelemetry.Metrics.InMemoryExporterMetricsExtensions.AddInMemoryExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, string name, System.Collections.Generic.ICollection<OpenTelemetry.Metrics.MetricSnapshot> exportedItems, System.Action<OpenTelemetry.Metrics.MetricReaderOptions> configureMetricReader) -> OpenTelemetry.Metrics.MeterProviderBuilder
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
override OpenTelemetry.Exporter.InMemoryExporter<T>.Dispose(bool disposing) -> void
static OpenTelemetry.Metrics.InMemoryExporterMetricsExtensions.AddInMemoryExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, string name, System.Collections.Generic.ICollection<OpenTelemetry.Metrics.Metric> exportedItems, System.Action<OpenTelemetry.Metrics.MetricReaderOptions> configureMetricReader) -> OpenTelemetry.Metrics.MeterProviderBuilder
static OpenTelemetry.Metrics.InMemoryExporterMetricsExtensions.AddInMemoryExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, string name, System.Collections.Generic.ICollection<OpenTelemetry.Metrics.MetricSnapshot> exportedItems, System.Action<OpenTelemetry.Metrics.MetricReaderOptions> configureMetricReader) -> OpenTelemetry.Metrics.MeterProviderBuilder
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
using System;
using System.Collections.Generic;
using System.Threading;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using OpenTelemetry.Exporter;
using OpenTelemetry.Internal;

Expand All @@ -40,9 +42,23 @@ public static class InMemoryExporterMetricsExtensions
/// <param name="exportedItems">Collection which will be populated with the exported <see cref="Metric"/>.</param>
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
public static MeterProviderBuilder AddInMemoryExporter(this MeterProviderBuilder builder, ICollection<Metric> exportedItems)
{
return builder.AddInMemoryExporter(exportedItems: exportedItems, configureMetricReader: null);
}
=> AddInMemoryExporter(builder, name: null, exportedItems, configureMetricReader: null);

/// <summary>
/// Adds InMemory metric exporter to the <see cref="MeterProviderBuilder"/>.
/// </summary>
/// <remarks>
/// Be aware that <see cref="Metric"/> may continue to be updated after export.
/// </remarks>
/// <param name="builder"><see cref="MeterProviderBuilder"/> builder to use.</param>
/// <param name="exportedItems">Collection which will be populated with the exported <see cref="Metric"/>.</param>
/// <param name="configureMetricReader">Callback action for configuring <see cref="MetricReaderOptions"/>.</param>
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
public static MeterProviderBuilder AddInMemoryExporter(
this MeterProviderBuilder builder,
ICollection<Metric> exportedItems,
Action<MetricReaderOptions> configureMetricReader)
=> AddInMemoryExporter(builder, name: null, exportedItems, configureMetricReader);

/// <summary>
/// Adds InMemory metric exporter to the <see cref="MeterProviderBuilder"/>.
Expand All @@ -51,23 +67,32 @@ public static MeterProviderBuilder AddInMemoryExporter(this MeterProviderBuilder
/// Be aware that <see cref="Metric"/> may continue to be updated after export.
/// </remarks>
/// <param name="builder"><see cref="MeterProviderBuilder"/> builder to use.</param>
/// <param name="name">Name which is used when retrieving options.</param>
/// <param name="exportedItems">Collection which will be populated with the exported <see cref="Metric"/>.</param>
/// <param name="configureMetricReader"><see cref="MetricReader"/> configuration options.</param>
/// <param name="configureMetricReader">Callback action for configuring <see cref="MetricReaderOptions"/>.</param>
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
public static MeterProviderBuilder AddInMemoryExporter(this MeterProviderBuilder builder, ICollection<Metric> exportedItems, Action<MetricReaderOptions> configureMetricReader)
public static MeterProviderBuilder AddInMemoryExporter(
this MeterProviderBuilder builder,
string name,
ICollection<Metric> exportedItems,
Action<MetricReaderOptions> configureMetricReader)
{
Guard.ThrowIfNull(builder);
Guard.ThrowIfNull(exportedItems);

if (builder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder)
name ??= Options.DefaultName;

if (configureMetricReader != null)
{
return deferredMeterProviderBuilder.Configure((sp, builder) =>
{
AddInMemoryExporter(builder, exportedItems, sp.GetOptions<MetricReaderOptions>(), configureMetricReader);
});
builder.ConfigureServices(services => services.Configure(name, configureMetricReader));
}

return AddInMemoryExporter(builder, exportedItems, new MetricReaderOptions(), configureMetricReader);
return builder.ConfigureBuilder((sp, builder) =>
{
var options = sp.GetRequiredService<IOptionsSnapshot<MetricReaderOptions>>().Get(name);

AddInMemoryExporter(builder, exportedItems, options);
});
}

/// <summary>
Expand All @@ -83,9 +108,7 @@ public static MeterProviderBuilder AddInMemoryExporter(this MeterProviderBuilder
public static MeterProviderBuilder AddInMemoryExporter(
this MeterProviderBuilder builder,
ICollection<MetricSnapshot> exportedItems)
{
return builder.AddInMemoryExporter(exportedItems: exportedItems, configureMetricReader: null);
}
=> AddInMemoryExporter(builder, name: null, exportedItems, configureMetricReader: null);

/// <summary>
/// Adds InMemory metric exporter to the <see cref="MeterProviderBuilder"/>.
Expand All @@ -96,35 +119,55 @@ public static MeterProviderBuilder AddInMemoryExporter(
/// </remarks>
/// <param name="builder"><see cref="MeterProviderBuilder"/> builder to use.</param>
/// <param name="exportedItems">Collection which will be populated with the exported <see cref="Metric"/> represented as <see cref="MetricSnapshot"/>.</param>
/// <param name="configureMetricReader"><see cref="MetricReader"/> configuration options.</param>
/// <param name="configureMetricReader">Callback action for configuring <see cref="MetricReaderOptions"/>.</param>
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
public static MeterProviderBuilder AddInMemoryExporter(
this MeterProviderBuilder builder,
ICollection<MetricSnapshot> exportedItems,
Action<MetricReaderOptions> configureMetricReader)
=> AddInMemoryExporter(builder, name: null, exportedItems, configureMetricReader);

/// <summary>
/// Adds InMemory metric exporter to the <see cref="MeterProviderBuilder"/>.
/// The exporter will be setup to export <see cref="MetricSnapshot"/>.
/// </summary>
/// <remarks>
/// Use this if you need a copy of <see cref="Metric"/> that will not be updated after export.
/// </remarks>
/// <param name="builder"><see cref="MeterProviderBuilder"/> builder to use.</param>
/// <param name="name">Name which is used when retrieving options.</param>
/// <param name="exportedItems">Collection which will be populated with the exported <see cref="Metric"/> represented as <see cref="MetricSnapshot"/>.</param>
/// <param name="configureMetricReader">Callback action for configuring <see cref="MetricReaderOptions"/>.</param>
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
public static MeterProviderBuilder AddInMemoryExporter(
this MeterProviderBuilder builder,
string name,
ICollection<MetricSnapshot> exportedItems,
Action<MetricReaderOptions> configureMetricReader)
{
Guard.ThrowIfNull(builder);
Guard.ThrowIfNull(exportedItems);

if (builder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder)
name ??= Options.DefaultName;

if (configureMetricReader != null)
{
return deferredMeterProviderBuilder.Configure((sp, builder) =>
{
AddInMemoryExporter(builder, exportedItems, sp.GetOptions<MetricReaderOptions>(), configureMetricReader);
});
builder.ConfigureServices(services => services.Configure(name, configureMetricReader));
}

return AddInMemoryExporter(builder, exportedItems, new MetricReaderOptions(), configureMetricReader);
return builder.ConfigureBuilder((sp, builder) =>
{
var options = sp.GetRequiredService<IOptionsSnapshot<MetricReaderOptions>>().Get(name);

AddInMemoryExporter(builder, exportedItems, options);
});
}

private static MeterProviderBuilder AddInMemoryExporter(
MeterProviderBuilder builder,
ICollection<Metric> exportedItems,
MetricReaderOptions metricReaderOptions,
Action<MetricReaderOptions> configureMetricReader)
MetricReaderOptions metricReaderOptions)
{
configureMetricReader?.Invoke(metricReaderOptions);

var metricExporter = new InMemoryExporter<Metric>(exportedItems);

var metricReader = PeriodicExportingMetricReaderHelper.CreatePeriodicExportingMetricReader(
Expand All @@ -139,11 +182,8 @@ private static MeterProviderBuilder AddInMemoryExporter(
private static MeterProviderBuilder AddInMemoryExporter(
MeterProviderBuilder builder,
ICollection<MetricSnapshot> exportedItems,
MetricReaderOptions metricReaderOptions,
Action<MetricReaderOptions> configureMetricReader)
MetricReaderOptions metricReaderOptions)
{
configureMetricReader?.Invoke(metricReaderOptions);

var metricExporter = new InMemoryExporter<Metric>(
exportFunc: (in Batch<Metric> metricBatch) => ExportMetricSnapshot(in metricBatch, exportedItems));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PeriodicExportingMetricReaderHelper.cs" Link="Includes\PeriodicExportingMetricReaderHelper.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PeerServiceResolver.cs" Link="Includes\PeerServiceResolver.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\ResourceSemanticConventions.cs" Link="Includes\ResourceSemanticConventions.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\ServiceProviderExtensions.cs" Link="Includes\ServiceProviderExtensions.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\TagTransformer.cs" Link="Includes\TagTransformer.cs" />
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\TagAndValueTransformer.cs" Link="Includes\TagAndValueTransformer.cs" />
</ItemGroup>
Expand Down
Loading