Skip to content

Commit 7bfacfb

Browse files
Azure Monitor Exporter - Expand extension methods for OpenTelemetry dependency injection support (Azure#33803)
* Expand extension methods for OpenTelemetry dependency injection support. * PR feedback
1 parent d759c41 commit 7bfacfb

File tree

4 files changed

+76
-16
lines changed

4 files changed

+76
-16
lines changed

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/api/Azure.Monitor.OpenTelemetry.Exporter.netstandard2.0.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,11 @@ public static partial class AzureMonitorExporterLoggingExtensions
66
}
77
public static partial class AzureMonitorExporterMetricExtensions
88
{
9-
public static OpenTelemetry.Metrics.MeterProviderBuilder AddAzureMonitorMetricExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, System.Action<Azure.Monitor.OpenTelemetry.Exporter.AzureMonitorExporterOptions> configure = null, Azure.Core.TokenCredential credential = null) { throw null; }
9+
public static OpenTelemetry.Metrics.MeterProviderBuilder AddAzureMonitorMetricExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, System.Action<Azure.Monitor.OpenTelemetry.Exporter.AzureMonitorExporterOptions> configure = null, Azure.Core.TokenCredential credential = null, string name = null) { throw null; }
1010
}
1111
public partial class AzureMonitorExporterOptions : Azure.Core.ClientOptions
1212
{
13+
public AzureMonitorExporterOptions() { }
1314
public AzureMonitorExporterOptions(Azure.Monitor.OpenTelemetry.Exporter.AzureMonitorExporterOptions.ServiceVersion version = Azure.Monitor.OpenTelemetry.Exporter.AzureMonitorExporterOptions.ServiceVersion.V2020_09_15_Preview) { }
1415
public string ConnectionString { get { throw null; } set { } }
1516
public bool DisableOfflineStorage { get { throw null; } set { } }
@@ -22,6 +23,6 @@ public enum ServiceVersion
2223
}
2324
public static partial class AzureMonitorExporterTraceExtensions
2425
{
25-
public static OpenTelemetry.Trace.TracerProviderBuilder AddAzureMonitorTraceExporter(this OpenTelemetry.Trace.TracerProviderBuilder builder, System.Action<Azure.Monitor.OpenTelemetry.Exporter.AzureMonitorExporterOptions> configure = null, Azure.Core.TokenCredential credential = null) { throw null; }
26+
public static OpenTelemetry.Trace.TracerProviderBuilder AddAzureMonitorTraceExporter(this OpenTelemetry.Trace.TracerProviderBuilder builder, System.Action<Azure.Monitor.OpenTelemetry.Exporter.AzureMonitorExporterOptions> configure = null, Azure.Core.TokenCredential credential = null, string name = null) { throw null; }
2627
}
2728
}

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterMetricExtensions.cs

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
using System;
77
using Azure.Core;
8+
using Microsoft.Extensions.DependencyInjection;
9+
using Microsoft.Extensions.Options;
810
using OpenTelemetry.Metrics;
911

1012
namespace Azure.Monitor.OpenTelemetry.Exporter
@@ -20,19 +22,45 @@ public static class AzureMonitorExporterMetricExtensions
2022
/// <param name="builder"><see cref="MeterProviderBuilder"/> builder to use.</param>
2123
/// <param name="configure">Exporter configuration options.</param>
2224
/// <param name="credential"><see cref="TokenCredential" /></param>
25+
/// <param name="name">Name which is used when retrieving options.</param>
2326
/// <returns>The instance of <see cref="MeterProviderBuilder"/> to chain the calls.</returns>
24-
public static MeterProviderBuilder AddAzureMonitorMetricExporter(this MeterProviderBuilder builder, Action<AzureMonitorExporterOptions> configure = null, TokenCredential credential = null)
27+
public static MeterProviderBuilder AddAzureMonitorMetricExporter(
28+
this MeterProviderBuilder builder,
29+
Action<AzureMonitorExporterOptions> configure = null,
30+
TokenCredential credential = null,
31+
string name = null)
2532
{
2633
if (builder == null)
2734
{
2835
throw new ArgumentNullException(nameof(builder));
2936
}
3037

31-
var options = new AzureMonitorExporterOptions();
32-
configure?.Invoke(options);
38+
var finalOptionsName = name ?? Options.DefaultName;
3339

34-
return builder.AddReader(new PeriodicExportingMetricReader(new AzureMonitorMetricExporter(options, credential))
35-
{ TemporalityPreference = MetricReaderTemporalityPreference.Delta });
40+
if (name != null && configure != null)
41+
{
42+
// If we are using named options we register the
43+
// configuration delegate into options pipeline.
44+
builder.ConfigureServices(services => services.Configure(finalOptionsName, configure));
45+
}
46+
47+
return builder.AddReader(sp =>
48+
{
49+
var exporterOptions = sp.GetRequiredService<IOptionsMonitor<AzureMonitorExporterOptions>>().Get(finalOptionsName);
50+
51+
if (name == null && configure != null)
52+
{
53+
// If we are NOT using named options, we execute the
54+
// configuration delegate inline. The reason for this is
55+
// AzureMonitorExporterOptions is shared by all signals. Without a
56+
// name, delegates for all signals will mix together. See:
57+
// https://github.com/open-telemetry/opentelemetry-dotnet/issues/4043
58+
configure(exporterOptions);
59+
}
60+
61+
return new PeriodicExportingMetricReader(new AzureMonitorMetricExporter(exporterOptions, credential))
62+
{ TemporalityPreference = MetricReaderTemporalityPreference.Delta };
63+
});
3664
}
3765
}
3866
}

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterOptions.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ public class AzureMonitorExporterOptions : ClientOptions
3232
/// </summary>
3333
public ServiceVersion Version { get; set; } = ServiceVersion.V2020_09_15_Preview;
3434

35+
/// <summary>
36+
/// Initializes a new instance of the <see cref="AzureMonitorExporterOptions"/>.
37+
/// </summary>
38+
public AzureMonitorExporterOptions() : this(LatestVersion)
39+
{
40+
}
41+
3542
/// <summary>
3643
/// Initializes a new instance of the <see cref="AzureMonitorExporterOptions"/>.
3744
/// </summary>

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterTraceExtensions.cs

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
using System;
77
using Azure.Core;
8+
using Microsoft.Extensions.DependencyInjection;
9+
using Microsoft.Extensions.Options;
810
using OpenTelemetry;
911
using OpenTelemetry.Trace;
1012

@@ -16,27 +18,49 @@ namespace Azure.Monitor.OpenTelemetry.Exporter
1618
public static class AzureMonitorExporterTraceExtensions
1719
{
1820
/// <summary>
19-
/// Registers an Azure Monitor trace exporter that will receive <see cref="System.Diagnostics.Activity"/> instances.
21+
/// Adds Azure Monitor Trace exporter to the TracerProvider.
2022
/// </summary>
2123
/// <param name="builder"><see cref="TracerProviderBuilder"/> builder to use.</param>
22-
/// <param name="configure">Exporter configuration options.</param>
24+
/// <param name="configure">Callback action for configuring <see cref="AzureMonitorExporterOptions"/>.</param>
2325
/// <param name="credential"><see cref="TokenCredential" /></param>
26+
/// <param name="name">Name which is used when retrieving options.</param>
2427
/// <returns>The instance of <see cref="TracerProviderBuilder"/> to chain the calls.</returns>
25-
public static TracerProviderBuilder AddAzureMonitorTraceExporter(this TracerProviderBuilder builder, Action<AzureMonitorExporterOptions> configure = null, TokenCredential credential = null)
28+
public static TracerProviderBuilder AddAzureMonitorTraceExporter(
29+
this TracerProviderBuilder builder,
30+
Action<AzureMonitorExporterOptions> configure = null,
31+
TokenCredential credential = null,
32+
string name = null)
2633
{
2734
if (builder == null)
2835
{
2936
throw new ArgumentNullException(nameof(builder));
3037
}
3138

32-
var options = new AzureMonitorExporterOptions();
33-
configure?.Invoke(options);
39+
var finalOptionsName = name ?? Options.DefaultName;
3440

35-
// TODO: provide a way to turn off statsbeat
36-
// Statsbeat.InitializeAttachStatsbeat(options.ConnectionString);
41+
if (name != null && configure != null)
42+
{
43+
// If we are using named options we register the
44+
// configuration delegate into options pipeline.
45+
builder.ConfigureServices(services => services.Configure(finalOptionsName, configure));
46+
}
47+
48+
return builder.AddProcessor(sp =>
49+
{
50+
var exporterOptions = sp.GetRequiredService<IOptionsMonitor<AzureMonitorExporterOptions>>().Get(finalOptionsName);
51+
52+
if (name == null && configure != null)
53+
{
54+
// If we are NOT using named options, we execute the
55+
// configuration delegate inline. The reason for this is
56+
// AzureMonitorExporterOptions is shared by all signals. Without a
57+
// name, delegates for all signals will mix together. See:
58+
// https://github.com/open-telemetry/opentelemetry-dotnet/issues/4043
59+
configure(exporterOptions);
60+
}
3761

38-
// TODO: Pick Simple vs Batching based on AzureMonitorExporterOptions
39-
return builder.AddProcessor(new BatchActivityExportProcessor(new AzureMonitorTraceExporter(options, credential)));
62+
return new BatchActivityExportProcessor(new AzureMonitorTraceExporter(exporterOptions, credential));
63+
});
4064
}
4165
}
4266
}

0 commit comments

Comments
 (0)