Skip to content

Commit 79d8714

Browse files
authored
[Metrics] Clean up repo exporters to use new DI patterns (#3648)
* Clean up metric exporters to use new DI patterns. * Support named options with in-memory exporter build-up. * Support named options in ConsoleExporter metrics extensions. * Support named options in OtlpExporter metrics extensions. * Support named options in PrometheusExporter AspNetCore metrics extensions. * Support named options in PrometheusExporter HttpListener metrics extensions. * CHANGELOG updates. * Unit tests.
1 parent 6ff512c commit 79d8714

File tree

31 files changed

+448
-170
lines changed

31 files changed

+448
-170
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
override OpenTelemetry.Exporter.ConsoleLogRecordExporter.Dispose(bool disposing) -> void
2+
static OpenTelemetry.Metrics.ConsoleExporterMetricsExtensions.AddConsoleExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, string name, System.Action<OpenTelemetry.Exporter.ConsoleExporterOptions, OpenTelemetry.Metrics.MetricReaderOptions> configureExporterAndMetricReader) -> OpenTelemetry.Metrics.MeterProviderBuilder
3+
static OpenTelemetry.Metrics.ConsoleExporterMetricsExtensions.AddConsoleExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, string name, System.Action<OpenTelemetry.Exporter.ConsoleExporterOptions> configureExporter) -> OpenTelemetry.Metrics.MeterProviderBuilder
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
override OpenTelemetry.Exporter.ConsoleLogRecordExporter.Dispose(bool disposing) -> void
2+
static OpenTelemetry.Metrics.ConsoleExporterMetricsExtensions.AddConsoleExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, string name, System.Action<OpenTelemetry.Exporter.ConsoleExporterOptions, OpenTelemetry.Metrics.MetricReaderOptions> configureExporterAndMetricReader) -> OpenTelemetry.Metrics.MeterProviderBuilder
3+
static OpenTelemetry.Metrics.ConsoleExporterMetricsExtensions.AddConsoleExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, string name, System.Action<OpenTelemetry.Exporter.ConsoleExporterOptions> configureExporter) -> OpenTelemetry.Metrics.MeterProviderBuilder

src/OpenTelemetry.Exporter.Console/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
the data if it is disposed.
77
([#3578](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3578))
88

9+
* Added overloads which accept a name to the `MeterProviderBuilder`
10+
`AddConsoleExporter` extension to allow for more fine-grained options
11+
management
12+
([#3648](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3648))
13+
914
## 1.4.0-alpha.2
1015

1116
Released 2022-Aug-18

src/OpenTelemetry.Exporter.Console/ConsoleExporterMetricsExtensions.cs

Lines changed: 57 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
using System;
1818
using System.Threading;
19+
using Microsoft.Extensions.DependencyInjection;
20+
using Microsoft.Extensions.Options;
1921
using OpenTelemetry.Exporter;
2022
using OpenTelemetry.Internal;
2123

@@ -35,70 +37,94 @@ public static class ConsoleExporterMetricsExtensions
3537
/// <param name="builder"><see cref="MeterProviderBuilder"/> builder to use.</param>
3638
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
3739
public static MeterProviderBuilder AddConsoleExporter(this MeterProviderBuilder builder)
38-
{
39-
return AddConsoleExporter(builder, options => { });
40-
}
40+
=> AddConsoleExporter(builder, name: null, configureExporter: null);
4141

4242
/// <summary>
4343
/// Adds <see cref="ConsoleMetricExporter"/> to the <see cref="MeterProviderBuilder"/>.
4444
/// </summary>
4545
/// <param name="builder"><see cref="MeterProviderBuilder"/> builder to use.</param>
46-
/// <param name="configureExporter">Exporter configuration options.</param>
46+
/// <param name="configureExporter">Callback action for configuring <see cref="ConsoleExporterOptions"/>.</param>
4747
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
4848
public static MeterProviderBuilder AddConsoleExporter(this MeterProviderBuilder builder, Action<ConsoleExporterOptions> configureExporter)
49+
=> AddConsoleExporter(builder, name: null, configureExporter);
50+
51+
/// <summary>
52+
/// Adds <see cref="ConsoleMetricExporter"/> to the <see cref="MeterProviderBuilder"/>.
53+
/// </summary>
54+
/// <param name="builder"><see cref="MeterProviderBuilder"/> builder to use.</param>
55+
/// <param name="name">Name which is used when retrieving options.</param>
56+
/// <param name="configureExporter">Callback action for configuring <see cref="ConsoleExporterOptions"/>.</param>
57+
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
58+
public static MeterProviderBuilder AddConsoleExporter(
59+
this MeterProviderBuilder builder,
60+
string name,
61+
Action<ConsoleExporterOptions> configureExporter)
4962
{
5063
Guard.ThrowIfNull(builder);
5164

52-
if (builder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder)
65+
name ??= Options.DefaultName;
66+
67+
if (configureExporter != null)
5368
{
54-
return deferredMeterProviderBuilder.Configure((sp, builder) =>
55-
{
56-
AddConsoleExporter(builder, sp.GetOptions<ConsoleExporterOptions>(), sp.GetOptions<MetricReaderOptions>(), configureExporter, null);
57-
});
69+
builder.ConfigureServices(services => services.Configure(name, configureExporter));
5870
}
5971

60-
return AddConsoleExporter(builder, new ConsoleExporterOptions(), new MetricReaderOptions(), configureExporter, null);
72+
return builder.ConfigureBuilder((sp, builder) =>
73+
{
74+
AddConsoleExporter(
75+
builder,
76+
sp.GetRequiredService<IOptionsSnapshot<ConsoleExporterOptions>>().Get(name),
77+
sp.GetRequiredService<IOptionsSnapshot<MetricReaderOptions>>().Get(name));
78+
});
6179
}
6280

6381
/// <summary>
6482
/// Adds <see cref="ConsoleMetricExporter"/> to the <see cref="MeterProviderBuilder"/>.
6583
/// </summary>
6684
/// <param name="builder"><see cref="MeterProviderBuilder"/> builder to use.</param>
67-
/// <param name="configureExporterAndMetricReader">Exporter and <see cref="MetricReader"/> configuration options.</param>
85+
/// <param name="configureExporterAndMetricReader">Callback action for
86+
/// configuring <see cref="ConsoleExporterOptions"/> and <see
87+
/// cref="MetricReaderOptions"/>.</param>
6888
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
6989
public static MeterProviderBuilder AddConsoleExporter(
7090
this MeterProviderBuilder builder,
7191
Action<ConsoleExporterOptions, MetricReaderOptions> configureExporterAndMetricReader)
92+
=> AddConsoleExporter(builder, name: null, configureExporterAndMetricReader);
93+
94+
/// <summary>
95+
/// Adds <see cref="ConsoleMetricExporter"/> to the <see cref="MeterProviderBuilder"/>.
96+
/// </summary>
97+
/// <param name="builder"><see cref="MeterProviderBuilder"/> builder to use.</param>
98+
/// <param name="name">Name which is used when retrieving options.</param>
99+
/// <param name="configureExporterAndMetricReader">Callback action for
100+
/// configuring <see cref="ConsoleExporterOptions"/> and <see
101+
/// cref="MetricReaderOptions"/>.</param>
102+
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
103+
public static MeterProviderBuilder AddConsoleExporter(
104+
this MeterProviderBuilder builder,
105+
string name,
106+
Action<ConsoleExporterOptions, MetricReaderOptions> configureExporterAndMetricReader)
72107
{
73-
Guard.ThrowIfNull(builder, nameof(builder));
108+
Guard.ThrowIfNull(builder);
74109

75-
if (builder is IDeferredMeterProviderBuilder deferredMeterProviderBuilder)
110+
name ??= Options.DefaultName;
111+
112+
return builder.ConfigureBuilder((sp, builder) =>
76113
{
77-
return deferredMeterProviderBuilder.Configure((sp, builder) =>
78-
{
79-
AddConsoleExporter(builder, sp.GetOptions<ConsoleExporterOptions>(), sp.GetOptions<MetricReaderOptions>(), null, configureExporterAndMetricReader);
80-
});
81-
}
114+
var exporterOptions = sp.GetRequiredService<IOptionsSnapshot<ConsoleExporterOptions>>().Get(name);
115+
var metricReaderOptions = sp.GetRequiredService<IOptionsSnapshot<MetricReaderOptions>>().Get(name);
82116

83-
return AddConsoleExporter(builder, new ConsoleExporterOptions(), new MetricReaderOptions(), null, configureExporterAndMetricReader);
117+
configureExporterAndMetricReader?.Invoke(exporterOptions, metricReaderOptions);
118+
119+
AddConsoleExporter(builder, exporterOptions, metricReaderOptions);
120+
});
84121
}
85122

86123
private static MeterProviderBuilder AddConsoleExporter(
87124
MeterProviderBuilder builder,
88125
ConsoleExporterOptions exporterOptions,
89-
MetricReaderOptions metricReaderOptions,
90-
Action<ConsoleExporterOptions> configureExporter,
91-
Action<ConsoleExporterOptions, MetricReaderOptions> configureExporterAndMetricReader)
126+
MetricReaderOptions metricReaderOptions)
92127
{
93-
if (configureExporterAndMetricReader != null)
94-
{
95-
configureExporterAndMetricReader.Invoke(exporterOptions, metricReaderOptions);
96-
}
97-
else
98-
{
99-
configureExporter?.Invoke(exporterOptions);
100-
}
101-
102128
var metricExporter = new ConsoleMetricExporter(exporterOptions);
103129

104130
var metricReader = PeriodicExportingMetricReaderHelper.CreatePeriodicExportingMetricReader(

src/OpenTelemetry.Exporter.Console/OpenTelemetry.Exporter.Console.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\EnvironmentVariableHelper.cs" Link="Includes\EnvironmentVariableHelper.cs" />
2525
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\OpenTelemetrySdkEventSource.cs" Link="Includes\OpenTelemetrySdkEventSource.cs" />
2626
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\PeriodicExportingMetricReaderHelper.cs" Link="Includes\PeriodicExportingMetricReaderHelper.cs" />
27-
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\ServiceProviderExtensions.cs" Link="Includes\ServiceProviderExtensions.cs" />
2827
<Compile Include="$(RepoRoot)\src\OpenTelemetry\Internal\TagTransformer.cs" Link="Includes\TagTransformer.cs" />
2928
<Compile Include="$(RepoRoot)\src\OpenTelemetry.Api\Internal\ExceptionExtensions.cs" Link="Includes\ExceptionExtensions.cs" />
3029
<Compile Include="$(RepoRoot)\src\OpenTelemetry.Api\Internal\Guard.cs" Link="Includes\Guard.cs" />
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
override OpenTelemetry.Exporter.InMemoryExporter<T>.Dispose(bool disposing) -> void
2+
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
3+
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
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
override OpenTelemetry.Exporter.InMemoryExporter<T>.Dispose(bool disposing) -> void
2+
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
3+
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

src/OpenTelemetry.Exporter.InMemory/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
disposed.
88
([#3607](https://github.com/open-telemetry/opentelemetry-dotnet/issues/3607))
99

10+
* Added overloads which accept a name to the `MeterProviderBuilder`
11+
`AddInMemoryExporter` extension to allow for more fine-grained options
12+
management
13+
([#3648](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3648))
14+
1015
## 1.4.0-alpha.2
1116

1217
Released 2022-Aug-18

0 commit comments

Comments
 (0)