in src/Elastic.OpenTelemetry/Extensions/LoggingProviderBuilderExtensions.cs [102:172]
internal static LoggerProviderBuilder WithElasticDefaults(this LoggerProviderBuilder builder, ElasticOpenTelemetryComponents components, IServiceCollection? services) =>
WithElasticDefaultsCore(builder, components.Options, components, services);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static LoggerProviderBuilder WithElasticDefaultsCore(
this LoggerProviderBuilder builder,
CompositeElasticOpenTelemetryOptions? options,
ElasticOpenTelemetryComponents? components,
IServiceCollection? services)
{
var logger = SignalBuilder.GetLogger(builder, components, options, null);
var callCount = Interlocked.Increment(ref WithElasticDefaultsCallCount);
if (callCount > 1)
{
logger.LogMultipleWithElasticDefaultsCallsWarning(callCount, nameof(LoggerProviderBuilder));
}
else
{
logger.LogWithElasticDefaultsCallCount(callCount, nameof(LoggerProviderBuilder));
}
return SignalBuilder.WithElasticDefaults(builder, Signals.Traces, options, components, services, ConfigureBuilder);
static void ConfigureBuilder(LoggerProviderBuilder builder, BuilderState builderState, IServiceCollection? services)
{
const string loggingProviderName = nameof(LoggerProviderBuilder);
var components = builderState.Components;
var logger = components.Logger;
logger.LogConfiguringBuilder(loggingProviderName, builderState.InstanceIdentifier);
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<OtlpExporterOptions>(OtlpExporterDefaults.OtlpExporterOptions));
builder.ConfigureServices(sc => sc.Configure<OpenTelemetryLoggerOptions>(o => o.WithElasticDefaults(logger)));
if (builder is IDeferredLoggerProviderBuilder deferredBuilder)
{
var httpContextType = Type.GetType("Microsoft.AspNetCore.Http.HttpContext, Microsoft.AspNetCore.Http.Abstractions");
if (httpContextType is not null)
{
var options = deferredBuilder.Configure((sp, _) =>
{
var options = sp.GetService<IOptions<OpenTelemetryLoggerOptions>>();
if (options is not null && options.Value.IncludeScopes == true)
{
logger.LogDetectedIncludeScopesWarning();
}
});
}
}
if (components.Options.SkipOtlpExporter)
{
logger.LogSkippingOtlpExporter(nameof(Signals.Logs), loggingProviderName, builderState.InstanceIdentifier);
}
else
{
builder.AddOtlpExporter();
}
logger.LogConfiguredSignalProvider(nameof(Signals.Logs), loggingProviderName, builderState.InstanceIdentifier);
}
}