Skip to content

Commit a318130

Browse files
[sdk] Make ResourceBuilder.AddDetector factory pattern public (attempt 2) (#4261)
Co-authored-by: Cijo Thomas <[email protected]>
1 parent 1a30646 commit a318130

File tree

12 files changed

+64
-17
lines changed

12 files changed

+64
-17
lines changed

src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(th
2323
~override OpenTelemetry.Metrics.AlwaysOnExemplarFilter.ShouldSample(long value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
2424
~override OpenTelemetry.Metrics.TraceBasedExemplarFilter.ShouldSample(double value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
2525
~override OpenTelemetry.Metrics.TraceBasedExemplarFilter.ShouldSample(long value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
26+
OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func<System.IServiceProvider!, OpenTelemetry.Resources.IResourceDetector!>! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder!

src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(th
2323
~override OpenTelemetry.Metrics.AlwaysOnExemplarFilter.ShouldSample(long value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
2424
~override OpenTelemetry.Metrics.TraceBasedExemplarFilter.ShouldSample(double value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
2525
~override OpenTelemetry.Metrics.TraceBasedExemplarFilter.ShouldSample(long value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
26+
OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func<System.IServiceProvider!, OpenTelemetry.Resources.IResourceDetector!>! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder!

src/OpenTelemetry/.publicApi/netstandard2.0/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(th
2323
~override OpenTelemetry.Metrics.AlwaysOnExemplarFilter.ShouldSample(long value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
2424
~override OpenTelemetry.Metrics.TraceBasedExemplarFilter.ShouldSample(double value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
2525
~override OpenTelemetry.Metrics.TraceBasedExemplarFilter.ShouldSample(long value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
26+
OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func<System.IServiceProvider!, OpenTelemetry.Resources.IResourceDetector!>! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder!

src/OpenTelemetry/.publicApi/netstandard2.1/PublicAPI.Unshipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,4 @@ static OpenTelemetry.Metrics.MeterProviderBuilderExtensions.SetExemplarFilter(th
2323
~override OpenTelemetry.Metrics.AlwaysOnExemplarFilter.ShouldSample(long value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
2424
~override OpenTelemetry.Metrics.TraceBasedExemplarFilter.ShouldSample(double value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
2525
~override OpenTelemetry.Metrics.TraceBasedExemplarFilter.ShouldSample(long value, System.ReadOnlySpan<System.Collections.Generic.KeyValuePair<string, object>> tags) -> bool
26+
OpenTelemetry.Resources.ResourceBuilder.AddDetector(System.Func<System.IServiceProvider!, OpenTelemetry.Resources.IResourceDetector!>! resourceDetectorFactory) -> OpenTelemetry.Resources.ResourceBuilder!

src/OpenTelemetry/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
* Added Exemplar support.
66
([#4217](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4217))
77

8+
* Added `AddDetector` factory overload on `ResourceBuilder`.
9+
([#4261](https://github.com/open-telemetry/opentelemetry-dotnet/pull/4261))
10+
811
## 1.4.0
912

1013
Released 2023-Feb-24

src/OpenTelemetry/Logs/OpenTelemetryLoggerProvider.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ internal OpenTelemetryLoggerProvider(OpenTelemetryLoggerOptions options, IServic
8080

8181
Guard.ThrowIfNull(options);
8282

83+
this.ServiceProvider = serviceProvider;
84+
8385
this.IncludeScopes = options.IncludeScopes;
8486
this.IncludeFormattedMessage = options.IncludeFormattedMessage;
8587
this.ParseStateValues = options.ParseStateValues;
@@ -96,6 +98,8 @@ internal OpenTelemetryLoggerProvider(OpenTelemetryLoggerOptions options, IServic
9698
OpenTelemetrySdkEventSource.Log.OpenTelemetryLoggerProviderEvent("OpenTelemetryLoggerProvider built successfully.");
9799
}
98100

101+
internal IServiceProvider? ServiceProvider { get; }
102+
99103
internal IExternalScopeProvider? ScopeProvider { get; private set; }
100104

101105
internal ILogRecordPool LogRecordPool => this.threadStaticPool ?? LogRecordSharedPool.Current;

src/OpenTelemetry/ProviderExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,10 @@ public static Resource GetDefaultResource(this BaseProvider baseProvider)
7373
{
7474
return meterProviderSdk.ServiceProvider;
7575
}
76+
else if (baseProvider is OpenTelemetryLoggerProvider openTelemetryLoggerProvider)
77+
{
78+
return openTelemetryLoggerProvider.ServiceProvider;
79+
}
7680

7781
return null;
7882
}

src/OpenTelemetry/Resources/ResourceBuilder.cs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -132,18 +132,24 @@ public ResourceBuilder AddDetector(IResourceDetector resourceDetector)
132132
/// <summary>
133133
/// Add a <see cref="IResourceDetector"/> to the builder which will be resolved using the application <see cref="IServiceProvider"/>.
134134
/// </summary>
135-
/// <remarks>
136-
/// Note: The supplied <paramref name="resourceDetectorFactory"/> may be
137-
/// called with a <see langword="null"/> <see cref="IServiceProvider"/>
138-
/// for detached <see cref="ResourceBuilder"/> instances. Factories
139-
/// should either throw if a <see langword="null"/> cannot be handled,
140-
/// or return a default <see cref="IResourceDetector"/> when <see
141-
/// cref="IServiceProvider"/> is not available.
142-
/// </remarks>
143135
/// <param name="resourceDetectorFactory">Resource detector factory.</param>
144136
/// <returns>Supplied <see cref="ResourceBuilder"/> for call chaining.</returns>
145-
// Note: This API may be made public if there is a need for it.
146-
internal ResourceBuilder AddDetector(Func<IServiceProvider?, IResourceDetector> resourceDetectorFactory)
137+
public ResourceBuilder AddDetector(Func<IServiceProvider, IResourceDetector> resourceDetectorFactory)
138+
{
139+
Guard.ThrowIfNull(resourceDetectorFactory);
140+
141+
return this.AddDetectorInternal(sp =>
142+
{
143+
if (sp == null)
144+
{
145+
throw new NotSupportedException("IResourceDetector factory pattern is not supported when calling ResourceBuilder.Build() directly.");
146+
}
147+
148+
return resourceDetectorFactory(sp);
149+
});
150+
}
151+
152+
internal ResourceBuilder AddDetectorInternal(Func<IServiceProvider?, IResourceDetector> resourceDetectorFactory)
147153
{
148154
Guard.ThrowIfNull(resourceDetectorFactory);
149155

src/OpenTelemetry/Resources/ResourceBuilderExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,8 @@ public static ResourceBuilder AddEnvironmentVariableDetector(this ResourceBuilde
122122
Lazy<IConfiguration> configuration = new Lazy<IConfiguration>(() => new ConfigurationBuilder().AddEnvironmentVariables().Build());
123123

124124
return resourceBuilder
125-
.AddDetector(sp => new OtelEnvResourceDetector(sp?.GetService<IConfiguration>() ?? configuration.Value))
126-
.AddDetector(sp => new OtelServiceNameEnvVarDetector(sp?.GetService<IConfiguration>() ?? configuration.Value));
125+
.AddDetectorInternal(sp => new OtelEnvResourceDetector(sp?.GetService<IConfiguration>() ?? configuration.Value))
126+
.AddDetectorInternal(sp => new OtelServiceNameEnvVarDetector(sp?.GetService<IConfiguration>() ?? configuration.Value));
127127
}
128128

129129
private static string GetFileVersion()

test/OpenTelemetry.Tests/Metrics/MeterProviderBuilderExtensionsTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ public void SetAndConfigureResourceTest()
108108

109109
Assert.Empty(builder.ResourceDetectors);
110110

111-
builder.AddDetector(sp =>
111+
builder.AddDetectorInternal(sp =>
112112
{
113113
serviceProviderTestExecuted = true;
114114
Assert.NotNull(sp);

0 commit comments

Comments
 (0)