diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.AspNetCore/src/AzureMonitorOptions.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.AspNetCore/src/AzureMonitorOptions.cs index 89938a80a322..00793c3d7b69 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.AspNetCore/src/AzureMonitorOptions.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.AspNetCore/src/AzureMonitorOptions.cs @@ -17,7 +17,7 @@ public class AzureMonitorOptions : ClientOptions /// The Connection String provides users with a single configuration setting to identify the Azure Monitor resource and endpoint. /// /// - /// (https://docs.microsoft.com/azure/azure-monitor/app/sdk-connection-string). + /// . /// public string ConnectionString { get; set; } @@ -27,7 +27,7 @@ public class AzureMonitorOptions : ClientOptions /// and Instrumentation Key from the Connection String will be used. /// /// - /// https://learn.microsoft.com/en-us/azure/azure-monitor/app/sdk-connection-string?tabs=net#is-the-connection-string-a-secret + /// . /// public TokenCredential Credential { get; set; } diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/CHANGELOG.md b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/CHANGELOG.md index 672144f93022..a1aa58dce493 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/CHANGELOG.md +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/CHANGELOG.md @@ -9,6 +9,11 @@ * Location ip on server spans will now be set using `client.address` tag key on activity instead of `http.client_ip`. ([#37707](https://github.com/Azure/azure-sdk-for-net/pull/37707)) +* Removing `ServiceVersion.V2020_09_15_Preview`. This is no longer in use and + the exporter has already defaulted to the latest `ServiceVersion.v2_1`. + ([#37996](https://github.com/Azure/azure-sdk-for-net/pull/37996)) +* Remove Nullable Annotations from the Exporter's public API. + ([#37996](https://github.com/Azure/azure-sdk-for-net/pull/37996)) ### Bugs Fixed diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/api/Azure.Monitor.OpenTelemetry.Exporter.netstandard2.0.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/api/Azure.Monitor.OpenTelemetry.Exporter.netstandard2.0.cs index 1881608d99df..df4fa7a16050 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/api/Azure.Monitor.OpenTelemetry.Exporter.netstandard2.0.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/api/Azure.Monitor.OpenTelemetry.Exporter.netstandard2.0.cs @@ -1,31 +1,24 @@ namespace Azure.Monitor.OpenTelemetry.Exporter { - public static partial class AzureMonitorExporterLoggingExtensions + public static partial class AzureMonitorExporterExtensions { - public static OpenTelemetry.Logs.OpenTelemetryLoggerOptions AddAzureMonitorLogExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action? configure = null, Azure.Core.TokenCredential? credential = null) { throw null; } - } - public static partial class AzureMonitorExporterMetricExtensions - { - public static OpenTelemetry.Metrics.MeterProviderBuilder AddAzureMonitorMetricExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, System.Action? configure = null, Azure.Core.TokenCredential? credential = null, string? name = null) { throw null; } + public static OpenTelemetry.Logs.OpenTelemetryLoggerOptions AddAzureMonitorLogExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action configure = null, Azure.Core.TokenCredential credential = null) { throw null; } + public static OpenTelemetry.Metrics.MeterProviderBuilder AddAzureMonitorMetricExporter(this OpenTelemetry.Metrics.MeterProviderBuilder builder, System.Action configure = null, Azure.Core.TokenCredential credential = null, string name = null) { throw null; } + public static OpenTelemetry.Trace.TracerProviderBuilder AddAzureMonitorTraceExporter(this OpenTelemetry.Trace.TracerProviderBuilder builder, System.Action configure = null, Azure.Core.TokenCredential credential = null, string name = null) { throw null; } } public partial class AzureMonitorExporterOptions : Azure.Core.ClientOptions { public AzureMonitorExporterOptions() { } public AzureMonitorExporterOptions(Azure.Monitor.OpenTelemetry.Exporter.AzureMonitorExporterOptions.ServiceVersion version = Azure.Monitor.OpenTelemetry.Exporter.AzureMonitorExporterOptions.ServiceVersion.v2_1) { } - public string? ConnectionString { get { throw null; } set { } } - public Azure.Core.TokenCredential? Credential { get { throw null; } set { } } + public string ConnectionString { get { throw null; } set { } } + public Azure.Core.TokenCredential Credential { get { throw null; } set { } } public bool DisableOfflineStorage { get { throw null; } set { } } public float SamplingRatio { get { throw null; } set { } } - public string? StorageDirectory { get { throw null; } set { } } + public string StorageDirectory { get { throw null; } set { } } public Azure.Monitor.OpenTelemetry.Exporter.AzureMonitorExporterOptions.ServiceVersion Version { get { throw null; } set { } } public enum ServiceVersion { - V2020_09_15_Preview = 1, - v2_1 = 2, + v2_1 = 1, } } - public static partial class AzureMonitorExporterTraceExtensions - { - public static OpenTelemetry.Trace.TracerProviderBuilder AddAzureMonitorTraceExporter(this OpenTelemetry.Trace.TracerProviderBuilder builder, System.Action? configure = null, Azure.Core.TokenCredential? credential = null, string? name = null) { throw null; } - } } diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterExtensions.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterExtensions.cs new file mode 100644 index 000000000000..11b9c2bc3936 --- /dev/null +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterExtensions.cs @@ -0,0 +1,184 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#nullable disable + +using System; +using System.Diagnostics; +using Azure.Core; +using Azure.Monitor.OpenTelemetry.Exporter.Internals; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using OpenTelemetry; +using OpenTelemetry.Logs; +using OpenTelemetry.Metrics; +using OpenTelemetry.Trace; + +namespace Azure.Monitor.OpenTelemetry.Exporter +{ + /// + /// Extension methods to simplify registering of Azure Monitor Exporter for all signals. + /// + public static class AzureMonitorExporterExtensions + { + /// + /// Adds Azure Monitor Trace exporter to the TracerProvider. + /// + /// builder to use. + /// Callback action for configuring . + /// + /// An Azure capable of providing an OAuth token. + /// Note: if a credential is provided to both and this parameter, + /// the Options will take precedence. + /// + /// Name which is used when retrieving options. + /// The instance of to chain the calls. + public static TracerProviderBuilder AddAzureMonitorTraceExporter( + this TracerProviderBuilder builder, + Action configure = null, + TokenCredential credential = null, + string name = null) + { + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + + var finalOptionsName = name ?? Options.DefaultName; + + if (name != null && configure != null) + { + // If we are using named options we register the + // configuration delegate into options pipeline. + builder.ConfigureServices(services => services.Configure(finalOptionsName, configure)); + } + + var deferredBuilder = builder as IDeferredTracerProviderBuilder; + if (deferredBuilder == null) + { + throw new InvalidOperationException("The provided TracerProviderBuilder does not implement IDeferredTracerProviderBuilder."); + } + + return deferredBuilder.Configure((sp, builder) => + { + var exporterOptions = sp.GetRequiredService>().Get(finalOptionsName); + if (name == null && configure != null) + { + // If we are NOT using named options, we execute the + // configuration delegate inline. The reason for this is + // AzureMonitorExporterOptions is shared by all signals. Without a + // name, delegates for all signals will mix together. See: + // https://github.com/open-telemetry/opentelemetry-dotnet/issues/4043 + configure(exporterOptions); + } + + builder.SetSampler(new ApplicationInsightsSampler(exporterOptions.SamplingRatio)); + + if (credential != null) + { + // Credential can be set by either AzureMonitorExporterOptions or Extension Method Parameter. + // Options should take precedence. + exporterOptions.Credential ??= credential; + } + + builder.AddProcessor(new CompositeProcessor(new BaseProcessor[] + { + new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(exporterOptions)), + new BatchActivityExportProcessor(new AzureMonitorTraceExporter(exporterOptions)) + })); + }); + } + + /// + /// Adds Azure Monitor Metric exporter. + /// + /// builder to use. + /// Exporter configuration options. + /// + /// An Azure capable of providing an OAuth token. + /// Note: if a credential is provided to both and this parameter, + /// the Options will take precedence. + /// + /// Name which is used when retrieving options. + /// The instance of to chain the calls. + public static MeterProviderBuilder AddAzureMonitorMetricExporter( + this MeterProviderBuilder builder, + Action configure = null, + TokenCredential credential = null, + string name = null) + { + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + + var finalOptionsName = name ?? Options.DefaultName; + + if (name != null && configure != null) + { + // If we are using named options we register the + // configuration delegate into options pipeline. + builder.ConfigureServices(services => services.Configure(finalOptionsName, configure)); + } + + return builder.AddReader(sp => + { + var exporterOptions = sp.GetRequiredService>().Get(finalOptionsName); + + if (name == null && configure != null) + { + // If we are NOT using named options, we execute the + // configuration delegate inline. The reason for this is + // AzureMonitorExporterOptions is shared by all signals. Without a + // name, delegates for all signals will mix together. See: + // https://github.com/open-telemetry/opentelemetry-dotnet/issues/4043 + configure(exporterOptions); + } + + if (credential != null) + { + // Credential can be set by either AzureMonitorExporterOptions or Extension Method Parameter. + // Options should take precedence. + exporterOptions.Credential ??= credential; + } + + return new PeriodicExportingMetricReader(new AzureMonitorMetricExporter(exporterOptions)) + { TemporalityPreference = MetricReaderTemporalityPreference.Delta }; + }); + } + + /// + /// Adds Azure Monitor Log Exporter with OpenTelemetryLoggerOptions. + /// + /// options to use. + /// Exporter configuration options. + /// + /// An Azure capable of providing an OAuth token. + /// Note: if a credential is provided to both and this parameter, + /// the Options will take precedence. + /// + /// The instance of to chain the calls. + public static OpenTelemetryLoggerOptions AddAzureMonitorLogExporter( + this OpenTelemetryLoggerOptions loggerOptions, + Action configure = null, + TokenCredential credential = null) + { + if (loggerOptions == null) + { + throw new ArgumentNullException(nameof(loggerOptions)); + } + + var options = new AzureMonitorExporterOptions(); + configure?.Invoke(options); + + if (credential != null) + { + // Credential can be set by either AzureMonitorExporterOptions or Extension Method Parameter. + // Options should take precedence. + options.Credential ??= credential; + } + + return loggerOptions.AddProcessor(new BatchLogRecordExportProcessor(new AzureMonitorLogExporter(options))); + } + } +} diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterLoggingExtensions.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterLoggingExtensions.cs deleted file mode 100644 index 7767c9e04d82..000000000000 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterLoggingExtensions.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using Azure.Core; -using OpenTelemetry; -using OpenTelemetry.Logs; - -namespace Azure.Monitor.OpenTelemetry.Exporter -{ - /// - /// Extension methods to simplify registering of Azure Monitor Log Exporter. - /// - public static class AzureMonitorExporterLoggingExtensions - { - /// - /// Adds Azure Monitor Log Exporter with OpenTelemetryLoggerOptions. - /// - /// options to use. - /// Exporter configuration options. - /// - /// An Azure capable of providing an OAuth token. - /// Note: if a credential is provided to both and this parameter, - /// the Options will take precedence. - /// - /// The instance of to chain the calls. - public static OpenTelemetryLoggerOptions AddAzureMonitorLogExporter(this OpenTelemetryLoggerOptions loggerOptions, Action? configure = null, TokenCredential? credential = null) - { - if (loggerOptions == null) - { - throw new ArgumentNullException(nameof(loggerOptions)); - } - - var options = new AzureMonitorExporterOptions(); - configure?.Invoke(options); - - if (credential != null) - { - // Credential can be set by either AzureMonitorExporterOptions or Extension Method Parameter. - // Options should take precedence. - options.Credential ??= credential; - } - - return loggerOptions.AddProcessor(new BatchLogRecordExportProcessor(new AzureMonitorLogExporter(options))); - } - } -} diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterMetricExtensions.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterMetricExtensions.cs deleted file mode 100644 index 91596b02d83b..000000000000 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterMetricExtensions.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using Azure.Core; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using OpenTelemetry.Metrics; - -namespace Azure.Monitor.OpenTelemetry.Exporter -{ - /// - /// Extension methods to simplify registering of Azure Monitor Metrics Exporter. - /// - public static class AzureMonitorExporterMetricExtensions - { - /// - /// Adds Azure Monitor Metric exporter. - /// - /// builder to use. - /// Exporter configuration options. - /// - /// An Azure capable of providing an OAuth token. - /// Note: if a credential is provided to both and this parameter, - /// the Options will take precedence. - /// - /// Name which is used when retrieving options. - /// The instance of to chain the calls. - public static MeterProviderBuilder AddAzureMonitorMetricExporter( - this MeterProviderBuilder builder, - Action? configure = null, - TokenCredential? credential = null, - string? name = null) - { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } - - var finalOptionsName = name ?? Options.DefaultName; - - if (name != null && configure != null) - { - // If we are using named options we register the - // configuration delegate into options pipeline. - builder.ConfigureServices(services => services.Configure(finalOptionsName, configure)); - } - - return builder.AddReader(sp => - { - var exporterOptions = sp.GetRequiredService>().Get(finalOptionsName); - - if (name == null && configure != null) - { - // If we are NOT using named options, we execute the - // configuration delegate inline. The reason for this is - // AzureMonitorExporterOptions is shared by all signals. Without a - // name, delegates for all signals will mix together. See: - // https://github.com/open-telemetry/opentelemetry-dotnet/issues/4043 - configure(exporterOptions); - } - - if (credential != null) - { - // Credential can be set by either AzureMonitorExporterOptions or Extension Method Parameter. - // Options should take precedence. - exporterOptions.Credential ??= credential; - } - - return new PeriodicExportingMetricReader(new AzureMonitorMetricExporter(exporterOptions)) - { TemporalityPreference = MetricReaderTemporalityPreference.Delta }; - }); - } - } -} diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterOptions.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterOptions.cs index 267c82d4fbff..10a17be3aeaf 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterOptions.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterOptions.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +#nullable disable + using System.Diagnostics.CodeAnalysis; using Azure.Core; @@ -21,14 +23,14 @@ public class AzureMonitorExporterOptions : ClientOptions /// The Connection String provides users with a single configuration setting to identify the Azure Monitor resource and endpoint. /// /// - /// (https://docs.microsoft.com/azure/azure-monitor/app/sdk-connection-string). + /// . /// - public string? ConnectionString { get; set; } + public string ConnectionString { get; set; } /// /// Get or sets the value of . /// - public TokenCredential? Credential { get; set; } + public TokenCredential Credential { get; set; } /// /// Gets or sets the ratio of telemetry items to be sampled. The value must be between 0.0F and 1.0F, inclusive. @@ -65,20 +67,15 @@ public AzureMonitorExporterOptions(ServiceVersion version = LatestVersion) public enum ServiceVersion { /// - /// (https://github.com/Azure/azure-rest-api-specs/blob/master/specification/applicationinsights/data-plane/Monitor.Exporters/preview/2020-09-15_Preview/swagger.json). - /// - V2020_09_15_Preview = 1, - - /// - /// (https://github.com/Azure/azure-rest-api-specs/blob/master/specification/applicationinsights/data-plane/Monitor.Exporters/preview/v2.1/swagger.json). + /// . /// - v2_1 = 2, + v2_1 = 1, } /// /// Override the default directory for offline storage. /// - public string? StorageDirectory { get; set; } + public string StorageDirectory { get; set; } /// /// Disable offline storage. diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterTraceExtensions.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterTraceExtensions.cs deleted file mode 100644 index 3e7a531d842f..000000000000 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorExporterTraceExtensions.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Diagnostics; -using Azure.Core; -using Azure.Monitor.OpenTelemetry.Exporter.Internals; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Options; -using OpenTelemetry; -using OpenTelemetry.Trace; - -namespace Azure.Monitor.OpenTelemetry.Exporter -{ - /// - /// Extension methods to simplify registering of Azure Monitor Trace Exporter. - /// - public static class AzureMonitorExporterTraceExtensions - { - /// - /// Adds Azure Monitor Trace exporter to the TracerProvider. - /// - /// builder to use. - /// Callback action for configuring . - /// - /// An Azure capable of providing an OAuth token. - /// Note: if a credential is provided to both and this parameter, - /// the Options will take precedence. - /// - /// Name which is used when retrieving options. - /// The instance of to chain the calls. - public static TracerProviderBuilder AddAzureMonitorTraceExporter( - this TracerProviderBuilder builder, - Action? configure = null, - TokenCredential? credential = null, - string? name = null) - { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } - - var finalOptionsName = name ?? Options.DefaultName; - - if (name != null && configure != null) - { - // If we are using named options we register the - // configuration delegate into options pipeline. - builder.ConfigureServices(services => services.Configure(finalOptionsName, configure)); - } - - var deferredBuilder = builder as IDeferredTracerProviderBuilder; - if (deferredBuilder == null) - { - throw new InvalidOperationException("The provided TracerProviderBuilder does not implement IDeferredTracerProviderBuilder."); - } - - return deferredBuilder.Configure((sp, builder) => - { - var exporterOptions = sp.GetRequiredService>().Get(finalOptionsName); - if (name == null && configure != null) - { - // If we are NOT using named options, we execute the - // configuration delegate inline. The reason for this is - // AzureMonitorExporterOptions is shared by all signals. Without a - // name, delegates for all signals will mix together. See: - // https://github.com/open-telemetry/opentelemetry-dotnet/issues/4043 - configure(exporterOptions); - } - - builder.SetSampler(new ApplicationInsightsSampler(exporterOptions.SamplingRatio)); - - if (credential != null) - { - // Credential can be set by either AzureMonitorExporterOptions or Extension Method Parameter. - // Options should take precedence. - exporterOptions.Credential ??= credential; - } - - builder.AddProcessor(new CompositeProcessor(new BaseProcessor[] - { - new StandardMetricsExtractionProcessor(new AzureMonitorMetricExporter(exporterOptions)), - new BatchActivityExportProcessor(new AzureMonitorTraceExporter(exporterOptions)) - })); - }); - } - } -}