Skip to content

Commit 4376564

Browse files
authored
[di-tracing] Fix the TracerProviderBuilder.AddInstrumentation factory pattern extension (#4468)
1 parent b9908d1 commit 4376564

File tree

4 files changed

+75
-1
lines changed

4 files changed

+75
-1
lines changed

src/OpenTelemetry.Api.ProviderBuilderExtensions/CHANGELOG.md

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

33
## Unreleased
44

5+
* Fixed a bug which prevented the
6+
`TracerProviderBuilder.AddInstrumentation(IServiceProvider, TracerProvider)`
7+
factory extension from being called during construction of the SDK
8+
`TracerProvider`.
9+
([#4468](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4468))
10+
511
## 1.5.0-alpha.2
612

713
Released 2023-Mar-31

src/OpenTelemetry.Api.ProviderBuilderExtensions/Trace/OpenTelemetryDependencyInjectionTracerProviderBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public static TracerProviderBuilder AddInstrumentation<T>(
106106

107107
tracerProviderBuilder.ConfigureBuilder((sp, builder) =>
108108
{
109-
if (tracerProviderBuilder is ITracerProviderBuilder iTracerProviderBuilder
109+
if (builder is ITracerProviderBuilder iTracerProviderBuilder
110110
&& iTracerProviderBuilder.Provider != null)
111111
{
112112
builder.AddInstrumentation(() => instrumentationFactory(sp, iTracerProviderBuilder.Provider));

test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,39 @@ public void AddReaderUsingDependencyInjectionTest()
8282
Assert.True(reader.Head.Next?.Value is MyReader);
8383
}
8484

85+
[Fact]
86+
public void AddInstrumentationTest()
87+
{
88+
List<object> instrumentation = null;
89+
90+
using (var provider = Sdk.CreateMeterProviderBuilder()
91+
.AddInstrumentation<MyInstrumentation>()
92+
.AddInstrumentation((sp, provider) => new MyInstrumentation() { Provider = provider })
93+
.AddInstrumentation(new MyInstrumentation())
94+
.Build() as MeterProviderSdk)
95+
{
96+
Assert.NotNull(provider);
97+
98+
Assert.Equal(3, provider.Instrumentations.Count);
99+
100+
Assert.Null(((MyInstrumentation)provider.Instrumentations[0]).Provider);
101+
Assert.False(((MyInstrumentation)provider.Instrumentations[0]).Disposed);
102+
103+
Assert.NotNull(((MyInstrumentation)provider.Instrumentations[1]).Provider);
104+
Assert.False(((MyInstrumentation)provider.Instrumentations[1]).Disposed);
105+
106+
Assert.Null(((MyInstrumentation)provider.Instrumentations[2]).Provider);
107+
Assert.False(((MyInstrumentation)provider.Instrumentations[2]).Disposed);
108+
109+
instrumentation = new List<object>(provider.Instrumentations);
110+
}
111+
112+
Assert.NotNull(instrumentation);
113+
Assert.True(((MyInstrumentation)instrumentation[0]).Disposed);
114+
Assert.True(((MyInstrumentation)instrumentation[1]).Disposed);
115+
Assert.True(((MyInstrumentation)instrumentation[2]).Disposed);
116+
}
117+
85118
[Fact]
86119
public void SetAndConfigureResourceTest()
87120
{
@@ -303,6 +336,7 @@ private static void RunBuilderServiceLifecycleTest(
303336

304337
private sealed class MyInstrumentation : IDisposable
305338
{
339+
internal MeterProvider Provider;
306340
internal bool Disposed;
307341

308342
public void Dispose()

test/OpenTelemetry.Tests/Trace/TracerProviderBuilderExtensionsTest.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,39 @@ public void AddProcessorUsingDependencyInjectionTest()
172172
Assert.True(processor.Head.Next?.Value is MyProcessor);
173173
}
174174

175+
[Fact]
176+
public void AddInstrumentationTest()
177+
{
178+
List<object> instrumentation = null;
179+
180+
using (var provider = Sdk.CreateTracerProviderBuilder()
181+
.AddInstrumentation<MyInstrumentation>()
182+
.AddInstrumentation((sp, provider) => new MyInstrumentation() { Provider = provider })
183+
.AddInstrumentation(new MyInstrumentation())
184+
.Build() as TracerProviderSdk)
185+
{
186+
Assert.NotNull(provider);
187+
188+
Assert.Equal(3, provider.Instrumentations.Count);
189+
190+
Assert.Null(((MyInstrumentation)provider.Instrumentations[0]).Provider);
191+
Assert.False(((MyInstrumentation)provider.Instrumentations[0]).Disposed);
192+
193+
Assert.NotNull(((MyInstrumentation)provider.Instrumentations[1]).Provider);
194+
Assert.False(((MyInstrumentation)provider.Instrumentations[1]).Disposed);
195+
196+
Assert.Null(((MyInstrumentation)provider.Instrumentations[2]).Provider);
197+
Assert.False(((MyInstrumentation)provider.Instrumentations[2]).Disposed);
198+
199+
instrumentation = new List<object>(provider.Instrumentations);
200+
}
201+
202+
Assert.NotNull(instrumentation);
203+
Assert.True(((MyInstrumentation)instrumentation[0]).Disposed);
204+
Assert.True(((MyInstrumentation)instrumentation[1]).Disposed);
205+
Assert.True(((MyInstrumentation)instrumentation[2]).Disposed);
206+
}
207+
175208
[Fact]
176209
public void SetAndConfigureResourceTest()
177210
{
@@ -431,6 +464,7 @@ public override SamplingResult ShouldSample(in SamplingParameters samplingParame
431464

432465
private sealed class MyInstrumentation : IDisposable
433466
{
467+
internal TracerProvider Provider;
434468
internal bool Disposed;
435469

436470
public void Dispose()

0 commit comments

Comments
 (0)