diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/net462/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/net462/PublicAPI.Unshipped.txt index 07a63e57297..d64c20118ee 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/net462/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/net462/PublicAPI.Unshipped.txt @@ -1,3 +1,4 @@ OpenTelemetry.Logs.OtlpLogExporterHelperExtensions static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions +static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action configureExporterAndProcessor) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/net6.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/net6.0/PublicAPI.Unshipped.txt index 07a63e57297..d64c20118ee 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/net6.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/net6.0/PublicAPI.Unshipped.txt @@ -1,3 +1,4 @@ OpenTelemetry.Logs.OtlpLogExporterHelperExtensions static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions +static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action configureExporterAndProcessor) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt index 07a63e57297..d64c20118ee 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt @@ -1,3 +1,4 @@ OpenTelemetry.Logs.OtlpLogExporterHelperExtensions static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions +static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action configureExporterAndProcessor) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt index 07a63e57297..d64c20118ee 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt @@ -1,3 +1,4 @@ OpenTelemetry.Logs.OtlpLogExporterHelperExtensions static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions +static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action configureExporterAndProcessor) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md index 44de41e6946..86a3c04ef39 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +* Added extension method for configuring export processor options for otlp log +exporter. +([#4733](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4733)) + * Added support for configuring the metric exporter's temporality using the environment variable `OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE` as defined in the diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptions.cs index cdefc449bd9..f8669fc1dd1 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptions.cs @@ -150,11 +150,13 @@ public Uri Endpoint /// /// Gets or sets the export processor type to be used with the OpenTelemetry Protocol Exporter. The default value is . /// + /// Note: This only applies when exporting traces. public ExportProcessorType ExportProcessorType { get; set; } = ExportProcessorType.Batch; /// /// Gets or sets the BatchExportProcessor options. Ignored unless ExportProcessorType is Batch. /// + /// Note: This only applies when exporting traces. public BatchExportProcessorOptions BatchExportProcessorOptions { get; set; } /// diff --git a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporterHelperExtensions.cs b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporterHelperExtensions.cs index d8b7b98e259..e5a9b69b3a0 100644 --- a/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporterHelperExtensions.cs +++ b/src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporterHelperExtensions.cs @@ -14,7 +14,7 @@ // limitations under the License. // -using System.Diagnostics; +using Microsoft.Extensions.Logging; using OpenTelemetry.Exporter; namespace OpenTelemetry.Logs; @@ -25,7 +25,7 @@ namespace OpenTelemetry.Logs; public static class OtlpLogExporterHelperExtensions { /// - /// Adds OTLP Exporter as a configuration to the OpenTelemetry ILoggingBuilder. + /// Adds an OTLP Exporter to the OpenTelemetry . /// /// /// options to use. @@ -34,7 +34,7 @@ public static OpenTelemetryLoggerOptions AddOtlpExporter(this OpenTelemetryLogge => AddOtlpExporterInternal(loggerOptions, configure: null); /// - /// Adds OTLP Exporter as a configuration to the OpenTelemetry ILoggingBuilder. + /// Adds an OTLP Exporter to the OpenTelemetry . /// /// options to use. /// Callback action for configuring . @@ -44,29 +44,55 @@ public static OpenTelemetryLoggerOptions AddOtlpExporter( Action configure) => AddOtlpExporterInternal(loggerOptions, configure); + /// + /// Adds an OTLP Exporter to the OpenTelemetry . + /// + /// options to use. + /// Callback action for configuring and . + /// The instance of to chain the calls. + public static OpenTelemetryLoggerOptions AddOtlpExporter( + this OpenTelemetryLoggerOptions loggerOptions, + Action configureExporterAndProcessor) + { + var exporterOptions = new OtlpExporterOptions(); + var processorOptions = new LogRecordExportProcessorOptions(); + + configureExporterAndProcessor?.Invoke(exporterOptions, processorOptions); + + return AddOtlpLogExporterInternal( + loggerOptions, + exporterOptions: exporterOptions, + processorOptions: processorOptions); + } + private static OpenTelemetryLoggerOptions AddOtlpExporterInternal( OpenTelemetryLoggerOptions loggerOptions, Action configure) { var exporterOptions = new OtlpExporterOptions(); - // TODO: We are using span/activity batch environment variable keys - // here when we should be using the ones for logs. - var defaultBatchOptions = exporterOptions.BatchExportProcessorOptions; - - Debug.Assert(defaultBatchOptions != null, "defaultBatchOptions was null"); - configure?.Invoke(exporterOptions); + return AddOtlpLogExporterInternal( + loggerOptions, + exporterOptions: exporterOptions, + processorOptions: new()); + } + + private static OpenTelemetryLoggerOptions AddOtlpLogExporterInternal( + OpenTelemetryLoggerOptions loggerOptions, + OtlpExporterOptions exporterOptions, + LogRecordExportProcessorOptions processorOptions) + { var otlpExporter = new OtlpLogExporter(exporterOptions); - if (exporterOptions.ExportProcessorType == ExportProcessorType.Simple) + if (processorOptions.ExportProcessorType == ExportProcessorType.Simple) { loggerOptions.AddProcessor(new SimpleLogRecordExportProcessor(otlpExporter)); } else { - var batchOptions = exporterOptions.BatchExportProcessorOptions ?? defaultBatchOptions; + var batchOptions = processorOptions.BatchExportProcessorOptions; loggerOptions.AddProcessor(new BatchLogRecordExportProcessor( otlpExporter, diff --git a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs index 96be67796e7..72f63ac96c9 100644 --- a/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs +++ b/src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs @@ -38,9 +38,15 @@ public static class OpenTelemetryLoggingExtensions /// Adds an OpenTelemetry logger named 'OpenTelemetry' to the . /// /// - /// Note: This is safe to be called multiple times and by library - /// authors. Only a single - /// will be created for a given . + /// Notes: + /// + /// This is safe to be called multiple times and by library authors. + /// Only a single will be created + /// for a given . + /// / + /// features (DI, Options, IConfiguration, etc.) are not available when + /// using . + /// /// /// The to use. /// The supplied for call chaining. diff --git a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs index 7e5d1fb7a78..5125094074f 100644 --- a/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs +++ b/test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs @@ -14,8 +14,10 @@ // limitations under the License. // +using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; +using System.Reflection; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; @@ -1128,6 +1130,61 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_AndScopeIsUsedInLogMethod_C Assert.Contains(scopeValue2, allScopeValues); } + [Fact] + public void AddOtlpLogExporterDefaultOptionsTest() + { + var options = new OpenTelemetryLoggerOptions(); + + options.AddOtlpExporter(); + + var processors = (List>)typeof(OpenTelemetryLoggerOptions).GetField("Processors", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(options); + + Assert.Single(processors); + + var batchProcesor = processors[0] as BatchLogRecordExportProcessor; + + Assert.NotNull(batchProcesor); + + var batchProcessorType = typeof(BatchExportProcessor); + + Assert.Equal(5000, batchProcessorType.GetField("scheduledDelayMilliseconds", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(batchProcesor)); + } + + [Theory] + [InlineData(ExportProcessorType.Simple)] + [InlineData(ExportProcessorType.Batch)] + public void AddOtlpLogExporterLogRecordProcessorOptionsTest(ExportProcessorType processorType) + { + var options = new OpenTelemetryLoggerOptions(); + + options.AddOtlpExporter((o, l) => + { + l.ExportProcessorType = processorType; + l.BatchExportProcessorOptions = new BatchExportLogRecordProcessorOptions() { ScheduledDelayMilliseconds = 1000 }; + }); + + var processors = (List>)typeof(OpenTelemetryLoggerOptions).GetField("Processors", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(options); + + Assert.Single(processors); + + if (processorType == ExportProcessorType.Batch) + { + var batchProcesor = processors[0] as BatchLogRecordExportProcessor; + + Assert.NotNull(batchProcesor); + + var batchProcessorType = typeof(BatchExportProcessor); + + Assert.Equal(1000, batchProcessorType.GetField("scheduledDelayMilliseconds", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(batchProcesor)); + } + else + { + var simpleProcesor = processors[0] as SimpleLogRecordExportProcessor; + + Assert.NotNull(simpleProcesor); + } + } + private static OtlpCommon.KeyValue TryGetAttribute(OtlpLogs.LogRecord record, string key) { return record.Attributes.FirstOrDefault(att => att.Key == key);