Skip to content

Commit a869e61

Browse files
Additional extension method for otlp log exporter to configure processor options (#4733)
1 parent 8b5d725 commit a869e61

File tree

9 files changed

+113
-14
lines changed

9 files changed

+113
-14
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
OpenTelemetry.Logs.OtlpLogExporterHelperExtensions
22
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions
3+
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action<OpenTelemetry.Exporter.OtlpExporterOptions, OpenTelemetry.Logs.LogRecordExportProcessorOptions> configureExporterAndProcessor) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions
34
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action<OpenTelemetry.Exporter.OtlpExporterOptions> configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
OpenTelemetry.Logs.OtlpLogExporterHelperExtensions
22
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions
3+
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action<OpenTelemetry.Exporter.OtlpExporterOptions, OpenTelemetry.Logs.LogRecordExportProcessorOptions> configureExporterAndProcessor) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions
34
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action<OpenTelemetry.Exporter.OtlpExporterOptions> configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
OpenTelemetry.Logs.OtlpLogExporterHelperExtensions
22
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions
3+
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action<OpenTelemetry.Exporter.OtlpExporterOptions, OpenTelemetry.Logs.LogRecordExportProcessorOptions> configureExporterAndProcessor) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions
34
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action<OpenTelemetry.Exporter.OtlpExporterOptions> configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
OpenTelemetry.Logs.OtlpLogExporterHelperExtensions
22
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions
3+
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action<OpenTelemetry.Exporter.OtlpExporterOptions, OpenTelemetry.Logs.LogRecordExportProcessorOptions> configureExporterAndProcessor) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions
34
static OpenTelemetry.Logs.OtlpLogExporterHelperExtensions.AddOtlpExporter(this OpenTelemetry.Logs.OpenTelemetryLoggerOptions loggerOptions, System.Action<OpenTelemetry.Exporter.OtlpExporterOptions> configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
* Added extension method for configuring export processor options for otlp log
6+
exporter.
7+
([#4733](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4733))
8+
59
* Added support for configuring the metric exporter's temporality using the
610
environment variable `OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE` as
711
defined in the

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpExporterOptions.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,13 @@ public Uri Endpoint
150150
/// <summary>
151151
/// Gets or sets the export processor type to be used with the OpenTelemetry Protocol Exporter. The default value is <see cref="ExportProcessorType.Batch"/>.
152152
/// </summary>
153+
/// <remarks>Note: This only applies when exporting traces.</remarks>
153154
public ExportProcessorType ExportProcessorType { get; set; } = ExportProcessorType.Batch;
154155

155156
/// <summary>
156157
/// Gets or sets the BatchExportProcessor options. Ignored unless ExportProcessorType is Batch.
157158
/// </summary>
159+
/// <remarks>Note: This only applies when exporting traces.</remarks>
158160
public BatchExportProcessorOptions<Activity> BatchExportProcessorOptions { get; set; }
159161

160162
/// <summary>

src/OpenTelemetry.Exporter.OpenTelemetryProtocol/OtlpLogExporterHelperExtensions.cs

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
// limitations under the License.
1515
// </copyright>
1616

17-
using System.Diagnostics;
17+
using Microsoft.Extensions.Logging;
1818
using OpenTelemetry.Exporter;
1919

2020
namespace OpenTelemetry.Logs;
@@ -25,7 +25,7 @@ namespace OpenTelemetry.Logs;
2525
public static class OtlpLogExporterHelperExtensions
2626
{
2727
/// <summary>
28-
/// Adds OTLP Exporter as a configuration to the OpenTelemetry ILoggingBuilder.
28+
/// Adds an OTLP Exporter to the OpenTelemetry <see cref="ILoggerProvider"/>.
2929
/// </summary>
3030
/// <remarks><inheritdoc cref="AddOtlpExporter(OpenTelemetryLoggerOptions, Action{OtlpExporterOptions})" path="/remarks"/></remarks>
3131
/// <param name="loggerOptions"><see cref="OpenTelemetryLoggerOptions"/> options to use.</param>
@@ -34,7 +34,7 @@ public static OpenTelemetryLoggerOptions AddOtlpExporter(this OpenTelemetryLogge
3434
=> AddOtlpExporterInternal(loggerOptions, configure: null);
3535

3636
/// <summary>
37-
/// Adds OTLP Exporter as a configuration to the OpenTelemetry ILoggingBuilder.
37+
/// Adds an OTLP Exporter to the OpenTelemetry <see cref="ILoggerProvider"/>.
3838
/// </summary>
3939
/// <param name="loggerOptions"><see cref="OpenTelemetryLoggerOptions"/> options to use.</param>
4040
/// <param name="configure">Callback action for configuring <see cref="OtlpExporterOptions"/>.</param>
@@ -44,29 +44,55 @@ public static OpenTelemetryLoggerOptions AddOtlpExporter(
4444
Action<OtlpExporterOptions> configure)
4545
=> AddOtlpExporterInternal(loggerOptions, configure);
4646

47+
/// <summary>
48+
/// Adds an OTLP Exporter to the OpenTelemetry <see cref="ILoggerProvider"/>.
49+
/// </summary>
50+
/// <param name="loggerOptions"><see cref="OpenTelemetryLoggerOptions"/> options to use.</param>
51+
/// <param name="configureExporterAndProcessor">Callback action for configuring <see cref="OtlpExporterOptions"/> and <see cref="LogRecordExportProcessorOptions"/>.</param>
52+
/// <returns>The instance of <see cref="OpenTelemetryLoggerOptions"/> to chain the calls.</returns>
53+
public static OpenTelemetryLoggerOptions AddOtlpExporter(
54+
this OpenTelemetryLoggerOptions loggerOptions,
55+
Action<OtlpExporterOptions, LogRecordExportProcessorOptions> configureExporterAndProcessor)
56+
{
57+
var exporterOptions = new OtlpExporterOptions();
58+
var processorOptions = new LogRecordExportProcessorOptions();
59+
60+
configureExporterAndProcessor?.Invoke(exporterOptions, processorOptions);
61+
62+
return AddOtlpLogExporterInternal(
63+
loggerOptions,
64+
exporterOptions: exporterOptions,
65+
processorOptions: processorOptions);
66+
}
67+
4768
private static OpenTelemetryLoggerOptions AddOtlpExporterInternal(
4869
OpenTelemetryLoggerOptions loggerOptions,
4970
Action<OtlpExporterOptions> configure)
5071
{
5172
var exporterOptions = new OtlpExporterOptions();
5273

53-
// TODO: We are using span/activity batch environment variable keys
54-
// here when we should be using the ones for logs.
55-
var defaultBatchOptions = exporterOptions.BatchExportProcessorOptions;
56-
57-
Debug.Assert(defaultBatchOptions != null, "defaultBatchOptions was null");
58-
5974
configure?.Invoke(exporterOptions);
6075

76+
return AddOtlpLogExporterInternal(
77+
loggerOptions,
78+
exporterOptions: exporterOptions,
79+
processorOptions: new());
80+
}
81+
82+
private static OpenTelemetryLoggerOptions AddOtlpLogExporterInternal(
83+
OpenTelemetryLoggerOptions loggerOptions,
84+
OtlpExporterOptions exporterOptions,
85+
LogRecordExportProcessorOptions processorOptions)
86+
{
6187
var otlpExporter = new OtlpLogExporter(exporterOptions);
6288

63-
if (exporterOptions.ExportProcessorType == ExportProcessorType.Simple)
89+
if (processorOptions.ExportProcessorType == ExportProcessorType.Simple)
6490
{
6591
loggerOptions.AddProcessor(new SimpleLogRecordExportProcessor(otlpExporter));
6692
}
6793
else
6894
{
69-
var batchOptions = exporterOptions.BatchExportProcessorOptions ?? defaultBatchOptions;
95+
var batchOptions = processorOptions.BatchExportProcessorOptions;
7096

7197
loggerOptions.AddProcessor(new BatchLogRecordExportProcessor(
7298
otlpExporter,

src/OpenTelemetry/Logs/ILogger/OpenTelemetryLoggingExtensions.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,15 @@ public static class OpenTelemetryLoggingExtensions
3838
/// Adds an OpenTelemetry logger named 'OpenTelemetry' to the <see cref="ILoggerFactory"/>.
3939
/// </summary>
4040
/// <remarks>
41-
/// Note: This is safe to be called multiple times and by library
42-
/// authors. Only a single <see cref="OpenTelemetryLoggerProvider"/>
43-
/// will be created for a given <see cref="IServiceCollection"/>.
41+
/// Notes:
42+
/// <list type="bullet">
43+
/// <item>This is safe to be called multiple times and by library authors.
44+
/// Only a single <see cref="OpenTelemetryLoggerProvider"/> will be created
45+
/// for a given <see cref="IServiceCollection"/>.</item>
46+
/// <item><see cref="IServiceCollection"/> / <see cref="IServiceProvider"/>
47+
/// features (DI, Options, IConfiguration, etc.) are not available when
48+
/// using <see cref="ILoggingBuilder"/>.</item>
49+
/// </list>
4450
/// </remarks>
4551
/// <param name="builder">The <see cref="ILoggingBuilder"/> to use.</param>
4652
/// <returns>The supplied <see cref="ILoggingBuilder"/> for call chaining.</returns>

test/OpenTelemetry.Exporter.OpenTelemetryProtocol.Tests/OtlpLogExporterTests.cs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@
1414
// limitations under the License.
1515
// </copyright>
1616

17+
using System.Collections.Generic;
1718
using System.Collections.ObjectModel;
1819
using System.Diagnostics;
20+
using System.Reflection;
1921
using Microsoft.Extensions.DependencyInjection;
2022
using Microsoft.Extensions.Hosting;
2123
using Microsoft.Extensions.Logging;
@@ -1128,6 +1130,61 @@ public void ToOtlpLog_WhenOptionsIncludeScopesIsTrue_AndScopeIsUsedInLogMethod_C
11281130
Assert.Contains(scopeValue2, allScopeValues);
11291131
}
11301132

1133+
[Fact]
1134+
public void AddOtlpLogExporterDefaultOptionsTest()
1135+
{
1136+
var options = new OpenTelemetryLoggerOptions();
1137+
1138+
options.AddOtlpExporter();
1139+
1140+
var processors = (List<BaseProcessor<LogRecord>>)typeof(OpenTelemetryLoggerOptions).GetField("Processors", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(options);
1141+
1142+
Assert.Single(processors);
1143+
1144+
var batchProcesor = processors[0] as BatchLogRecordExportProcessor;
1145+
1146+
Assert.NotNull(batchProcesor);
1147+
1148+
var batchProcessorType = typeof(BatchExportProcessor<LogRecord>);
1149+
1150+
Assert.Equal(5000, batchProcessorType.GetField("scheduledDelayMilliseconds", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(batchProcesor));
1151+
}
1152+
1153+
[Theory]
1154+
[InlineData(ExportProcessorType.Simple)]
1155+
[InlineData(ExportProcessorType.Batch)]
1156+
public void AddOtlpLogExporterLogRecordProcessorOptionsTest(ExportProcessorType processorType)
1157+
{
1158+
var options = new OpenTelemetryLoggerOptions();
1159+
1160+
options.AddOtlpExporter((o, l) =>
1161+
{
1162+
l.ExportProcessorType = processorType;
1163+
l.BatchExportProcessorOptions = new BatchExportLogRecordProcessorOptions() { ScheduledDelayMilliseconds = 1000 };
1164+
});
1165+
1166+
var processors = (List<BaseProcessor<LogRecord>>)typeof(OpenTelemetryLoggerOptions).GetField("Processors", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(options);
1167+
1168+
Assert.Single(processors);
1169+
1170+
if (processorType == ExportProcessorType.Batch)
1171+
{
1172+
var batchProcesor = processors[0] as BatchLogRecordExportProcessor;
1173+
1174+
Assert.NotNull(batchProcesor);
1175+
1176+
var batchProcessorType = typeof(BatchExportProcessor<LogRecord>);
1177+
1178+
Assert.Equal(1000, batchProcessorType.GetField("scheduledDelayMilliseconds", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(batchProcesor));
1179+
}
1180+
else
1181+
{
1182+
var simpleProcesor = processors[0] as SimpleLogRecordExportProcessor;
1183+
1184+
Assert.NotNull(simpleProcesor);
1185+
}
1186+
}
1187+
11311188
private static OtlpCommon.KeyValue TryGetAttribute(OtlpLogs.LogRecord record, string key)
11321189
{
11331190
return record.Attributes.FirstOrDefault(att => att.Key == key);

0 commit comments

Comments
 (0)