Skip to content

Commit 2710c42

Browse files
authored
Move LoggerProvider and friends (OTEL1000) to a stable API (#5648)
1 parent 248043a commit 2710c42

File tree

52 files changed

+508
-1011
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+508
-1011
lines changed

build/Common.nonprod.props

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,24 @@
4444

4545
<Message Importance="high" Text="Skipping test execution for '$(TargetPath)' because it does not contain the '$(TargetFramework)' target." Condition="'$(_SkipTests)' == 'true'" />
4646
</Target>
47+
48+
<Target Name="ResolveExposedExperimentalFeatures" BeforeTargets="CoreCompile">
49+
<!-- Note: What this does is look for $(ProjectReferenceName).BuildFlags.txt
50+
files for all the dependencies of the project being compiled. If
51+
ExposeExperimentalFeatures=true is found in those files we set compiler
52+
constants for each project where experimental features were exposed.
53+
Example:
54+
OPENTELEMETRY_EXPORTER_INMEMORY_EXPERIMENTAL_FEATURES_EXPOSED;OPENTELEMETRY_EXPERIMENTAL_FEATURES_EXPOSED;OPENTELEMETRY_API_EXPERIMENTAL_FEATURES_EXPOSED;OPENTELEMETRY_API_PROVIDERBUILDEREXTENSIONS_EXPERIMENTAL_FEATURES_EXPOSED
55+
-->
56+
<ItemGroup>
57+
<DependenciesWithExposedExperimentalFeatures
58+
Include="@(_ResolvedProjectReferencePaths->'%(Filename)')"
59+
Condition="$([System.IO.File]::Exists('%(RootDir)%(Directory)%(Filename).BuildFlags.txt')) AND $([System.IO.File]::ReadAllText('%(RootDir)%(Directory)%(Filename).BuildFlags.txt').Contains('ExposeExperimentalFeatures=true'))" />
60+
<CompilerConstantsForDependenciesWithExposedExperimentalFeatures Include="@(DependenciesWithExposedExperimentalFeatures->'$([System.String]::Copy('%(DependenciesWithExposedExperimentalFeatures.Identity)').ToUpper().Replace('.', '_'))_EXPERIMENTAL_FEATURES_EXPOSED')" />
61+
</ItemGroup>
62+
63+
<PropertyGroup Condition="'@(CompilerConstantsForDependenciesWithExposedExperimentalFeatures)' != ''">
64+
<DefineConstants>$(DefineConstants);@(CompilerConstantsForDependenciesWithExposedExperimentalFeatures)</DefineConstants>
65+
</PropertyGroup>
66+
</Target>
4767
</Project>

build/Common.prod.props

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939
<ItemGroup>
4040
<None Include="$(MSBuildThisFileDirectory)opentelemetry-icon-color.png" Pack="true" PackagePath="\" />
4141
<SourceRoot Condition="'$(Deterministic)'=='true'" Include="$(MSBuildThisFileDirectory)/" />
42+
<None Include="$(IntermediateOutputPath)$(ProjectName).BuildFlags.txt"
43+
Link="$(ProjectName).BuildFlags.txt"
44+
CopyToOutputDirectory="PreserveNewest"
45+
Visible="false" />
4246
<!-- Note: This includes all the PublicApiAnalyzers files in projects to make editing easier in the IDE -->
4347
<None Include=".publicApi\**\PublicAPI.*.txt" />
4448
</ItemGroup>
@@ -82,6 +86,15 @@
8286
<DefineConstants>$(DefineConstants);EXPOSE_EXPERIMENTAL_FEATURES</DefineConstants>
8387
</PropertyGroup>
8488

89+
<!-- Note: We write a file into the output dir which captures the state of
90+
ExposeExperimentalFeatures for the current compilation. This is used by
91+
consuming projects (tests, benchmarks, examples, etc) to add compiler
92+
constants which can be used to detect experimental APIs -->
93+
<WriteLinesToFile
94+
File="$(IntermediateOutputPath)$(ProjectName).BuildFlags.txt"
95+
Lines="ExposeExperimentalFeatures=$(ExposeExperimentalFeatures)"
96+
Overwrite="true"/>
97+
8598
<!-- Note: This selects the correct PublicApiAnalyzers files based on $(ExposeExperimentalFeatures) -->
8699
<ItemGroup>
87100
<AdditionalFiles Include=".publicApi\Stable\PublicAPI.*.txt" />

docs/diagnostics/experimental-apis/OTEL1000.md

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,17 @@
44

55
This is an Experimental API diagnostic covering the following APIs:
66

7+
* `ILoggingBuilder.UseOpenTelemetry`
8+
9+
Experimental APIs may be changed or removed in the future.
10+
11+
The following portions of `OTEL1000` were released stable in `1.9.0` and are no
12+
longer considered experimental:
13+
714
* `LoggerProviderBuilder`
815
* `LoggerProvider`
916
* `IDeferredLoggerProviderBuilder`
10-
11-
Experimental APIs may be changed or removed in the future.
17+
* `OpenTelemetryBuilder.WithLogging`
1218

1319
## Details
1420

docs/diagnostics/experimental-apis/OTEL1001.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ This is an Experimental API diagnostic covering the following APIs:
99
* `LogRecordAttributeList`
1010
* `LogRecordData`
1111
* `LogRecordSeverity`
12+
* `Sdk.CreateLoggerProviderBuilder`
1213

1314
Experimental APIs may be changed or removed in the future.
1415

docs/logs/dedicated-pipeline/DedicatedLogging/DedicatedLoggingServiceCollectionExtensions.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,25 @@ public static class DedicatedLoggingServiceCollectionExtensions
1111
public static IServiceCollection AddDedicatedLogging(
1212
this IServiceCollection services,
1313
IConfiguration configuration,
14-
Action<OpenTelemetryLoggerOptions> configureOpenTelemetry)
14+
Action<LoggerProviderBuilder> configureOpenTelemetry)
1515
{
1616
ArgumentNullException.ThrowIfNull(configureOpenTelemetry);
1717

18-
services.TryAddSingleton(sp =>
18+
services.TryAddSingleton(_ =>
1919
{
20-
var loggerFactory = LoggerFactory.Create(builder =>
20+
var services = new ServiceCollection();
21+
services.AddLogging(builder =>
2122
{
2223
builder.AddConfiguration(configuration);
2324

24-
builder.AddOpenTelemetry(configureOpenTelemetry);
25+
builder.AddOpenTelemetry();
2526
});
2627

27-
return new DedicatedLoggerFactory(loggerFactory);
28+
services.ConfigureOpenTelemetryLoggerProvider(configureOpenTelemetry);
29+
30+
var sp = services.BuildServiceProvider();
31+
32+
return new DedicatedLoggerFactory(sp);
2833
});
2934

3035
services.TryAdd(ServiceDescriptor.Singleton(typeof(IDedicatedLogger<>), typeof(DedicatedLogger<>)));
@@ -54,11 +59,13 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
5459

5560
private sealed class DedicatedLoggerFactory : ILoggerFactory
5661
{
62+
private readonly ServiceProvider serviceProvider;
5763
private readonly ILoggerFactory innerLoggerFactory;
5864

59-
public DedicatedLoggerFactory(ILoggerFactory loggerFactory)
65+
public DedicatedLoggerFactory(ServiceProvider serviceProvider)
6066
{
61-
this.innerLoggerFactory = loggerFactory;
67+
this.serviceProvider = serviceProvider;
68+
this.innerLoggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
6269
}
6370

6471
public void AddProvider(ILoggerProvider provider)
@@ -68,6 +75,6 @@ public ILogger CreateLogger(string categoryName)
6875
=> this.innerLoggerFactory.CreateLogger(categoryName);
6976

7077
public void Dispose()
71-
=> this.innerLoggerFactory.Dispose();
78+
=> this.serviceProvider.Dispose();
7279
}
7380
}

docs/logs/dedicated-pipeline/Program.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,19 @@
88

99
builder.Logging.ClearProviders();
1010

11-
builder.Logging.AddOpenTelemetry(options =>
12-
{
13-
// Set up primary pipeline for common app logs
14-
options.AddConsoleExporter();
15-
});
11+
builder.Services.AddOpenTelemetry()
12+
.WithLogging(logging =>
13+
{
14+
// Set up primary pipeline for common app logs
15+
logging.AddConsoleExporter();
16+
});
1617

1718
builder.Services.AddDedicatedLogging(
1819
builder.Configuration.GetSection("DedicatedLogging"), // Bind configuration for dedicated logging pipeline
19-
options =>
20+
logging =>
2021
{
2122
// Set up secondary pipeline for dedicated logs
22-
options.AddConsoleExporter();
23+
logging.AddConsoleExporter();
2324
});
2425

2526
var app = builder.Build();

docs/logs/getting-started-aspnetcore/Program.cs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,21 @@
66

77
var builder = WebApplication.CreateBuilder(args);
88

9-
// Remove default providers and add OpenTelemetry logging provider.
10-
// For instructional purposes only, disable the default .NET console logging provider to
11-
// use the verbose OpenTelemetry console exporter instead. For most development
12-
// and production scenarios the default console provider works well and there is no need to
9+
// For instructional purposes only, disable the default .NET logging providers.
10+
// We remove the console logging provider in this demo to use the verbose
11+
// OpenTelemetry console exporter instead. For most development and production
12+
// scenarios the default console provider works well and there is no need to
1313
// clear these providers.
1414
builder.Logging.ClearProviders();
1515

16-
builder.Logging.AddOpenTelemetry(logging =>
17-
{
18-
var resourceBuilder = ResourceBuilder
19-
.CreateDefault()
20-
.AddService(builder.Environment.ApplicationName);
21-
22-
logging.SetResourceBuilder(resourceBuilder)
23-
24-
// ConsoleExporter is used for demo purpose only.
25-
// In production environment, ConsoleExporter should be replaced with other exporters (e.g. OTLP Exporter).
26-
.AddConsoleExporter();
27-
});
16+
// Add OpenTelemetry logging provider by calling the WithLogging extension.
17+
builder.Services.AddOpenTelemetry()
18+
.ConfigureResource(r => r.AddService(builder.Environment.ApplicationName))
19+
.WithLogging(logging => logging
20+
/* Note: ConsoleExporter is used for demo purpose only. In production
21+
environment, ConsoleExporter should be replaced with other exporters
22+
(e.g. OTLP Exporter). */
23+
.AddConsoleExporter());
2824

2925
var app = builder.Build();
3026

examples/AspNetCore/Program.cs

Lines changed: 27 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,21 @@
2424
// Note: Switch between Explicit/Exponential by setting HistogramAggregation in appsettings.json
2525
var histogramAggregation = appBuilder.Configuration.GetValue("HistogramAggregation", defaultValue: "explicit")!.ToLowerInvariant();
2626

27-
// Build a resource configuration action to set service information.
28-
Action<ResourceBuilder> configureResource = r => r.AddService(
29-
serviceName: appBuilder.Configuration.GetValue("ServiceName", defaultValue: "otel-test")!,
30-
serviceVersion: typeof(Program).Assembly.GetName().Version?.ToString() ?? "unknown",
31-
serviceInstanceId: Environment.MachineName);
32-
3327
// Create a service to expose ActivitySource, and Metric Instruments
3428
// for manual instrumentation
3529
appBuilder.Services.AddSingleton<Instrumentation>();
3630

37-
// Configure OpenTelemetry tracing & metrics with auto-start using the
31+
// Clear default logging providers used by WebApplication host.
32+
appBuilder.Logging.ClearProviders();
33+
34+
// Configure OpenTelemetry logging, metrics, & tracing with auto-start using the
3835
// AddOpenTelemetry extension from OpenTelemetry.Extensions.Hosting.
3936
appBuilder.Services.AddOpenTelemetry()
40-
.ConfigureResource(configureResource)
37+
.ConfigureResource(r => r
38+
.AddService(
39+
serviceName: appBuilder.Configuration.GetValue("ServiceName", defaultValue: "otel-test")!,
40+
serviceVersion: typeof(Program).Assembly.GetName().Version?.ToString() ?? "unknown",
41+
serviceInstanceId: Environment.MachineName))
4142
.WithTracing(builder =>
4243
{
4344
// Tracing
@@ -121,34 +122,25 @@
121122
builder.AddConsoleExporter();
122123
break;
123124
}
124-
});
125-
126-
// Clear default logging providers used by WebApplication host.
127-
appBuilder.Logging.ClearProviders();
128-
129-
// Configure OpenTelemetry Logging.
130-
appBuilder.Logging.AddOpenTelemetry(options =>
131-
{
132-
// Note: See appsettings.json Logging:OpenTelemetry section for configuration.
133-
134-
var resourceBuilder = ResourceBuilder.CreateDefault();
135-
configureResource(resourceBuilder);
136-
options.SetResourceBuilder(resourceBuilder);
137-
138-
switch (logExporter)
125+
})
126+
.WithLogging(builder =>
139127
{
140-
case "otlp":
141-
options.AddOtlpExporter(otlpOptions =>
142-
{
143-
// Use IConfiguration directly for Otlp exporter endpoint option.
144-
otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint", defaultValue: "http://localhost:4317")!);
145-
});
146-
break;
147-
default:
148-
options.AddConsoleExporter();
149-
break;
150-
}
151-
});
128+
// Note: See appsettings.json Logging:OpenTelemetry section for configuration.
129+
130+
switch (logExporter)
131+
{
132+
case "otlp":
133+
builder.AddOtlpExporter(otlpOptions =>
134+
{
135+
// Use IConfiguration directly for Otlp exporter endpoint option.
136+
otlpOptions.Endpoint = new Uri(appBuilder.Configuration.GetValue("Otlp:Endpoint", defaultValue: "http://localhost:4317")!);
137+
});
138+
break;
139+
default:
140+
builder.AddConsoleExporter();
141+
break;
142+
}
143+
});
152144

153145
appBuilder.Services.AddControllers();
154146

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +0,0 @@
1-
OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions
2-
OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggingServiceCollectionExtensions
3-
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder) -> OpenTelemetry.Logs.LoggerProviderBuilder!
4-
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Func<System.IServiceProvider!, OpenTelemetry.Logs.LoggerProvider!, T!>! instrumentationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder!
5-
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Func<System.IServiceProvider!, T!>! instrumentationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder!
6-
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, T! instrumentation) -> OpenTelemetry.Logs.LoggerProviderBuilder!
7-
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Action<Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configure) -> OpenTelemetry.Logs.LoggerProviderBuilder!
8-
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggingServiceCollectionExtensions.ConfigureOpenTelemetryLoggerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Logs.LoggerProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
9-
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggingServiceCollectionExtensions.ConfigureOpenTelemetryLoggerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<System.IServiceProvider!, OpenTelemetry.Logs.LoggerProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions
2+
OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggingServiceCollectionExtensions
3+
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder) -> OpenTelemetry.Logs.LoggerProviderBuilder!
4+
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Func<System.IServiceProvider!, OpenTelemetry.Logs.LoggerProvider!, T!>! instrumentationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder!
5+
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Func<System.IServiceProvider!, T!>! instrumentationFactory) -> OpenTelemetry.Logs.LoggerProviderBuilder!
6+
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions.AddInstrumentation<T>(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, T! instrumentation) -> OpenTelemetry.Logs.LoggerProviderBuilder!
7+
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggerProviderBuilderExtensions.ConfigureServices(this OpenTelemetry.Logs.LoggerProviderBuilder! loggerProviderBuilder, System.Action<Microsoft.Extensions.DependencyInjection.IServiceCollection!>! configure) -> OpenTelemetry.Logs.LoggerProviderBuilder!
8+
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggingServiceCollectionExtensions.ConfigureOpenTelemetryLoggerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<OpenTelemetry.Logs.LoggerProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
9+
static OpenTelemetry.Logs.OpenTelemetryDependencyInjectionLoggingServiceCollectionExtensions.ConfigureOpenTelemetryLoggerProvider(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<System.IServiceProvider!, OpenTelemetry.Logs.LoggerProviderBuilder!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!

0 commit comments

Comments
 (0)