diff --git a/src/Elastic.OpenTelemetry.Core/Extensions/TracerProvderBuilderExtensions.cs b/src/Elastic.OpenTelemetry.Core/Extensions/TracerProviderBuilderExtensions.cs similarity index 100% rename from src/Elastic.OpenTelemetry.Core/Extensions/TracerProvderBuilderExtensions.cs rename to src/Elastic.OpenTelemetry.Core/Extensions/TracerProviderBuilderExtensions.cs diff --git a/src/Elastic.OpenTelemetry/Extensions/LoggingProviderBuilderExtensions.cs b/src/Elastic.OpenTelemetry/Extensions/LoggingProviderBuilderExtensions.cs index 54b9c0ec..6c562ed2 100644 --- a/src/Elastic.OpenTelemetry/Extensions/LoggingProviderBuilderExtensions.cs +++ b/src/Elastic.OpenTelemetry/Extensions/LoggingProviderBuilderExtensions.cs @@ -133,9 +133,12 @@ static void ConfigureBuilder(LoggerProviderBuilder builder, BuilderState builder builder.ConfigureResource(r => r.WithElasticDefaults(builderState, services)); + // When services is not null here, the options will have already been configured by the calling code. if (services is null) builder.ConfigureServices(sc => sc.Configure(OtlpExporterDefaults.OtlpExporterOptions)); + builder.ConfigureServices(sc => sc.Configure(o => o.WithElasticDefaults(logger))); + if (components.Options.SkipOtlpExporter) { logger.LogSkippingOtlpExporter(nameof(Signals.Logs), loggingProviderName, builderState.InstanceIdentifier); diff --git a/src/Elastic.OpenTelemetry/Extensions/TracerProviderBuilderExtensions.cs b/src/Elastic.OpenTelemetry/Extensions/TracerProviderBuilderExtensions.cs index 08cc6de7..10f3a957 100644 --- a/src/Elastic.OpenTelemetry/Extensions/TracerProviderBuilderExtensions.cs +++ b/src/Elastic.OpenTelemetry/Extensions/TracerProviderBuilderExtensions.cs @@ -171,6 +171,7 @@ private static void ConfigureBuilder(TracerProviderBuilder builder, BuilderState #endif AddWithLogging(builder, logger, "GrpcClient", b => b.AddGrpcClientInstrumentation(), builderState.InstanceIdentifier); + TracerProvderBuilderExtensions.AddActivitySourceWithLogging(builder, logger, "Elastic.Transport", builderState.InstanceIdentifier); // NOTE: Despite them having no dependencies. We cannot add the OpenTelemetry.Instrumentation.ElasticsearchClient or diff --git a/tests/Elastic.OpenTelemetry.Tests/Logging/ElasticLoggingDefaults.cs b/tests/Elastic.OpenTelemetry.Tests/Logging/ElasticLoggingDefaults.cs new file mode 100644 index 00000000..3785ca5f --- /dev/null +++ b/tests/Elastic.OpenTelemetry.Tests/Logging/ElasticLoggingDefaults.cs @@ -0,0 +1,68 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information + +using OpenTelemetry; +using OpenTelemetry.Logs; +using Xunit.Abstractions; + +namespace Elastic.OpenTelemetry.Tests.Logging; + +public class ElasticLoggingDefaults(ITestOutputHelper output) +{ + private readonly ITestOutputHelper _output = output; + + [Fact] + public async Task FormattedMessageAndScopesOptions_AreEnabled() + { + var exportedItems = new List(); + + var host = Host.CreateDefaultBuilder(); + host.ConfigureServices(s => + { + var options = new ElasticOpenTelemetryOptions() + { + SkipOtlpExporter = true, + AdditionalLogger = new TestLogger(_output) + }; + + s.AddElasticOpenTelemetry(options) + .WithLogging(lpb => lpb.AddInMemoryExporter(exportedItems)); + }); + + var ctx = new CancellationTokenRegistration(); + + using (var app = host.Build()) + { + _ = app.RunAsync(ctx.Token); + + var factory = app.Services.GetRequiredService(); + var logger = factory.CreateLogger("Test"); + + using (logger.BeginScope(new List> + { + new("customData", "aCustomValue"), + })) + { + logger.LogWarning("This is a {WhatAmI}", "warning"); + } + + await ctx.DisposeAsync(); + } + + var logRecord = exportedItems.Last(); + + Assert.Equal("This is a warning", logRecord.FormattedMessage); + + logRecord.ForEachScope((scope, _) => + { + var values = scope.Scope as IEnumerable>; + + Assert.NotNull(values); + var entry = Assert.Single(values); + + Assert.Equal("customData", entry.Key); + Assert.Equal("aCustomValue", entry.Value); + }, null); + } +}