Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for SamplerDetectors and EnvVarSamplerDetector #3635

Closed
wants to merge 11 commits into from
Closed
25 changes: 25 additions & 0 deletions docs/trace/extending-the-sdk/MySamplerDetector.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// <copyright file="MySamplerDetector.cs" company="OpenTelemetry Authors">
// Copyright The OpenTelemetry Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// </copyright>

using OpenTelemetry.Trace;

internal class MySamplerDetector : ISamplerDetector
{
public Sampler Detect()
{
return new MySampler();
}
}
2 changes: 1 addition & 1 deletion docs/trace/extending-the-sdk/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class Program
public static void Main()
{
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.SetSampler(new MySampler())
.ConfigureSampler(x => x.Clear().RegisterDetector(new MySamplerDetector()))
.AddSource("OTel.Demo")
.SetResourceBuilder(ResourceBuilder.CreateEmpty().AddDetector(new MyResourceDetector()))
.AddProcessor(new MyProcessor("ProcessorA"))
Expand Down
24 changes: 20 additions & 4 deletions docs/trace/extending-the-sdk/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -295,10 +295,10 @@ cases, it is recommended to use that option as it offers higher performance.

OpenTelemetry .NET SDK has provided the following built-in samplers:

* [AlwaysOffSampler](../../../src/OpenTelemetry/Trace/AlwaysOffSampler.cs)
* [AlwaysOnSampler](../../../src/OpenTelemetry/Trace/AlwaysOnSampler.cs)
* [ParentBasedSampler](../../../src/OpenTelemetry/Trace/ParentBasedSampler.cs)
* [TraceIdRatioBasedSampler](../../../src/OpenTelemetry/Trace/TraceIdRatioBasedSampler.cs)
* [AlwaysOffSampler](../../../src/OpenTelemetry/Trace/Sampling/AlwaysOffSampler.cs)
* [AlwaysOnSampler](../../../src/OpenTelemetry/Trace/Sampling/AlwaysOnSampler.cs)
* [ParentBasedSampler](../../../src/OpenTelemetry/Trace/Sampling/ParentBasedSampler.cs)
* [TraceIdRatioBasedSampler](../../../src/OpenTelemetry/Trace/Sampling/TraceIdRatioBasedSampler.cs)

Custom samplers can be implemented to cover more scenarios:

Expand Down Expand Up @@ -335,6 +335,22 @@ Custom resource detectors can be implemented:

A demo ResourceDetector is shown [here](./MyResourceDetector.cs).

## Sampler Detector

OpenTelemetry .NET SDK provides a sampler detector for detecting sampler
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

mm.. I am not sure of the need of such a new api. Can we simply modify SDK to automatically pick Sampler from Env Variables?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see some benefits for having builder with detectors:

  • possibility to programmatically disable env. vars.
  • easily add more samplers supported by the env. vars. You can just implement externally support for other samplers without taking care about parsing values for common samplers. Please consider something like XRayOTelEnvVarSamplerDetector. With current design it could be chained with current CommonEnvVar Detector.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are issues with the existing environment variable stuff. Primarily, it doesn't work with IConfiguration/IOptions. This is something I am looking at, hoping to find a new pattern that smooths all of this out. Probably first to drive #3583. I would vote to wait on this sorry @Kielek I know that is probably frustrating!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we speaking about timeframe, it will be great to include it at least based env. var. support for 1.4.0 release. We would like to give AutoInstrumentation users some flexibility here.

I know that we will need more thing configurable in the future so I will observe issue you have mentioned.

from the `OTEL_TRACES_SAMPLER` and `OTEL_TRACES_SAMPLER_ARG`environment variables
Kielek marked this conversation as resolved.
Show resolved Hide resolved
for following samplers: `always_on`, `always_off`, `traceidratio`,
`parentbased_always_on`, `parentbased_always_off`, `parentbased_traceidratio`.

Custom sampler detectors can be implemented:

* SamplerDetectors should inherit from
`OpenTelemetry.Trace.ISamplerDetector`, (which belongs to the
[OpenTelemetry](../../../src/OpenTelemetry/README.md) package), and implement
the `Detect` method.

A demo SamplerDetector is shown [here](./MySamplerDetector.cs).

## References

* [Exporter
Expand Down
2 changes: 1 addition & 1 deletion docs/trace/reporting-exceptions/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public static void Main()
{
using var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("MyCompany.MyProduct.MyLibrary")
.SetSampler(new AlwaysOnSampler())
.ConfigureSampler(x => x.SetDefaultSampler(new AlwaysOnSampler()))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it should be

.ConfigureSampler(x => x.Clear().SetDefaultSampler(new AlwaysOnSampler()))

Can you elaborate on why you suggest using the "builder API" instead of SetSampler if the user would like to always use one explicit sampler?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in fb11564.

New API provide broader functionalities so it should be used in all examples in the repository.

.SetErrorStatusOnException()
.AddConsoleExporter()
.Build();
Expand Down
3 changes: 2 additions & 1 deletion examples/AspNetCore/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@
{
options
.ConfigureResource(configureResource)
.SetSampler(new AlwaysOnSampler())
.ConfigureSampler(x => x.Clear().SetDefaultSampler(new AlwaysOnSampler()))

.AddHttpClientInstrumentation()
.AddAspNetCoreInstrumentation();

Expand Down
13 changes: 13 additions & 0 deletions src/OpenTelemetry/.publicApi/net462/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,16 @@ OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.AddProcessor(OpenTelemetry.BaseProcessor<OpenTelemetry.Logs.LogRecord!>! processor) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider!
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMilliseconds = -1) -> bool
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void
OpenTelemetry.Trace.ISamplerDetector
OpenTelemetry.Trace.SamplerBuilder
OpenTelemetry.Trace.SamplerBuilderExtensions
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Trace.SamplerBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSamplerBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.SamplerBuilder! samplerBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
~OpenTelemetry.Trace.ISamplerDetector.Detect() -> OpenTelemetry.Trace.Sampler
~OpenTelemetry.Trace.SamplerBuilder.Build() -> OpenTelemetry.Trace.Sampler
~OpenTelemetry.Trace.SamplerBuilder.Clear() -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplerBuilder.RegisterDetector(OpenTelemetry.Trace.ISamplerDetector samplerDetector) -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplerBuilder.SetDefaultSampler(OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string traceStateString) -> void
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes, string traceStateString) -> void
Expand Down Expand Up @@ -50,3 +60,6 @@ static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceColl
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType
OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType
~static OpenTelemetry.Trace.SamplerBuilder.CreateDefault() -> OpenTelemetry.Trace.SamplerBuilder
~static OpenTelemetry.Trace.SamplerBuilder.CreateEmpty() -> OpenTelemetry.Trace.SamplerBuilder
~static OpenTelemetry.Trace.SamplerBuilderExtensions.RegisterEnvironmentVariableDetector(this OpenTelemetry.Trace.SamplerBuilder samplerBuilder) -> OpenTelemetry.Trace.SamplerBuilder
13 changes: 13 additions & 0 deletions src/OpenTelemetry/.publicApi/net6.0/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,16 @@ OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.AddProcessor(OpenTelemetry.BaseProcessor<OpenTelemetry.Logs.LogRecord!>! processor) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider!
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMilliseconds = -1) -> bool
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void
OpenTelemetry.Trace.ISamplerDetector
OpenTelemetry.Trace.SamplerBuilder
OpenTelemetry.Trace.SamplerBuilderExtensions
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Trace.SamplerBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSamplerBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.SamplerBuilder! samplerBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
~OpenTelemetry.Trace.ISamplerDetector.Detect() -> OpenTelemetry.Trace.Sampler
~OpenTelemetry.Trace.SamplerBuilder.Build() -> OpenTelemetry.Trace.Sampler
~OpenTelemetry.Trace.SamplerBuilder.Clear() -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplerBuilder.RegisterDetector(OpenTelemetry.Trace.ISamplerDetector samplerDetector) -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplerBuilder.SetDefaultSampler(OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string traceStateString) -> void
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes, string traceStateString) -> void
Expand Down Expand Up @@ -50,3 +60,6 @@ static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceColl
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType
OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType
~static OpenTelemetry.Trace.SamplerBuilder.CreateDefault() -> OpenTelemetry.Trace.SamplerBuilder
~static OpenTelemetry.Trace.SamplerBuilder.CreateEmpty() -> OpenTelemetry.Trace.SamplerBuilder
~static OpenTelemetry.Trace.SamplerBuilderExtensions.RegisterEnvironmentVariableDetector(this OpenTelemetry.Trace.SamplerBuilder samplerBuilder) -> OpenTelemetry.Trace.SamplerBuilder
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,16 @@ OpenTelemetry.Logs.OpenTelemetryLoggerProvider.AddProcessor(OpenTelemetry.BasePr
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMilliseconds = -1) -> bool
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void
OpenTelemetry.Logs.OpenTelemetryLoggerOptions.ConfigureResource(System.Action<OpenTelemetry.Resources.ResourceBuilder!>! configure) -> OpenTelemetry.Logs.OpenTelemetryLoggerOptions!
OpenTelemetry.Trace.ISamplerDetector
OpenTelemetry.Trace.SamplerBuilder
OpenTelemetry.Trace.SamplerBuilderExtensions
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Trace.SamplerBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSamplerBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.SamplerBuilder! samplerBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
~OpenTelemetry.Trace.ISamplerDetector.Detect() -> OpenTelemetry.Trace.Sampler
~OpenTelemetry.Trace.SamplerBuilder.Build() -> OpenTelemetry.Trace.Sampler
~OpenTelemetry.Trace.SamplerBuilder.Clear() -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplerBuilder.RegisterDetector(OpenTelemetry.Trace.ISamplerDetector samplerDetector) -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplerBuilder.SetDefaultSampler(OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string traceStateString) -> void
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes, string traceStateString) -> void
Expand Down Expand Up @@ -50,3 +60,6 @@ static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceColl
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType
OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType
~static OpenTelemetry.Trace.SamplerBuilder.CreateDefault() -> OpenTelemetry.Trace.SamplerBuilder
~static OpenTelemetry.Trace.SamplerBuilder.CreateEmpty() -> OpenTelemetry.Trace.SamplerBuilder
~static OpenTelemetry.Trace.SamplerBuilderExtensions.RegisterEnvironmentVariableDetector(this OpenTelemetry.Trace.SamplerBuilder samplerBuilder) -> OpenTelemetry.Trace.SamplerBuilder
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,16 @@ OpenTelemetry.Logs.OpenTelemetryLoggerOptionsExtensions
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.AddProcessor(OpenTelemetry.BaseProcessor<OpenTelemetry.Logs.LogRecord!>! processor) -> OpenTelemetry.Logs.OpenTelemetryLoggerProvider!
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.ForceFlush(int timeoutMilliseconds = -1) -> bool
OpenTelemetry.Logs.OpenTelemetryLoggerProvider.OpenTelemetryLoggerProvider() -> void
OpenTelemetry.Trace.ISamplerDetector
OpenTelemetry.Trace.SamplerBuilder
OpenTelemetry.Trace.SamplerBuilderExtensions
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureSampler(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Trace.SamplerBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.SetSamplerBuilder(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, OpenTelemetry.Trace.SamplerBuilder! samplerBuilder) -> OpenTelemetry.Trace.TracerProviderBuilder!
~OpenTelemetry.Trace.ISamplerDetector.Detect() -> OpenTelemetry.Trace.Sampler
~OpenTelemetry.Trace.SamplerBuilder.Build() -> OpenTelemetry.Trace.Sampler
~OpenTelemetry.Trace.SamplerBuilder.Clear() -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplerBuilder.RegisterDetector(OpenTelemetry.Trace.ISamplerDetector samplerDetector) -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplerBuilder.SetDefaultSampler(OpenTelemetry.Trace.Sampler sampler) -> OpenTelemetry.Trace.SamplerBuilder
~OpenTelemetry.Trace.SamplingResult.TraceStateString.get -> string
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, string traceStateString) -> void
~OpenTelemetry.Trace.SamplingResult.SamplingResult(OpenTelemetry.Trace.SamplingDecision decision, System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string, object>> attributes, string traceStateString) -> void
Expand Down Expand Up @@ -50,3 +60,6 @@ static Microsoft.Extensions.DependencyInjection.TracerProviderBuilderServiceColl
static OpenTelemetry.Trace.TracerProviderBuilderExtensions.ConfigureResource(this OpenTelemetry.Trace.TracerProviderBuilder! tracerProviderBuilder, System.Action<OpenTelemetry.Resources.ResourceBuilder!>! configure) -> OpenTelemetry.Trace.TracerProviderBuilder!
OpenTelemetry.Metrics.MetricType.LongSumNonMonotonic = 138 -> OpenTelemetry.Metrics.MetricType
OpenTelemetry.Metrics.MetricType.DoubleSumNonMonotonic = 141 -> OpenTelemetry.Metrics.MetricType
~static OpenTelemetry.Trace.SamplerBuilder.CreateDefault() -> OpenTelemetry.Trace.SamplerBuilder
~static OpenTelemetry.Trace.SamplerBuilder.CreateEmpty() -> OpenTelemetry.Trace.SamplerBuilder
~static OpenTelemetry.Trace.SamplerBuilderExtensions.RegisterEnvironmentVariableDetector(this OpenTelemetry.Trace.SamplerBuilder samplerBuilder) -> OpenTelemetry.Trace.SamplerBuilder
12 changes: 12 additions & 0 deletions src/OpenTelemetry/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,18 @@
* Added support for `UpDownCounter` and `ObservableUpDownCounter` instruments.
([#3606](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3606))

* Added support for `UpDownCounter` and `ObservableUpDownCounter` instruments.
([#3606](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3606))

* Added support for detecting, by default, sampler from the `OTEL_TRACES_SAMPLER`
and `OTEL_TRACES_SAMPLER_ARG`environment variables for following samplers:
`always_on`, `always_off`, `traceidratio`, `parentbased_always_on`,
`parentbased_always_off`, `parentbased_traceidratio`.
([#3635](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3635/))

* Added support for implementing custom `SamplerDetector`.
([#3635](https://github.com/open-telemetry/opentelemetry-dotnet/pull/3635/))

## 1.4.0-alpha.2

Released 2022-Aug-18
Expand Down
18 changes: 16 additions & 2 deletions src/OpenTelemetry/Trace/Builder/TracerProviderBuilderBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -203,11 +203,25 @@ internal TracerProviderBuilder SetResourceBuilder(ResourceBuilder resourceBuilde
return this.ConfigureState((sp, state) => state.SetResourceBuilder(resourceBuilder));
}

internal TracerProviderBuilder ConfigureSampler(Action<SamplerBuilder> configure)
{
Guard.ThrowIfNull(configure);

return this.ConfigureState((sp, state) => state.ConfigureSampler(configure));
}

internal TracerProviderBuilder SetSamplerBuilder(SamplerBuilder samplerBuilder)
{
Guard.ThrowIfNull(samplerBuilder);

return this.ConfigureState((sp, state) => state.SetSamplerBuilder(samplerBuilder));
}

internal TracerProviderBuilder SetSampler<T>()
where T : Sampler
{
this.TryAddSingleton<T>();
this.ConfigureState((sp, state) => state.SetSampler(sp.GetRequiredService<T>()));
this.ConfigureState((sp, state) => state.ConfigureSampler(x => x.SetDefaultSampler(sp.GetRequiredService<T>())));

return this;
}
Expand All @@ -216,7 +230,7 @@ internal TracerProviderBuilder SetSampler(Sampler sampler)
{
Guard.ThrowIfNull(sampler);

return this.ConfigureState((sp, state) => state.SetSampler(sampler));
return this.ConfigureState((sp, state) => state.ConfigureSampler(x => x.SetDefaultSampler(sampler)));
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,42 @@ public static TracerProviderBuilder SetSampler<T>(this TracerProviderBuilder tra
return tracerProviderBuilder;
}

/// <summary>
/// Modify the <see cref="SamplerBuilder"/> from which the Sampler associated with
/// this provider is built from in-place.
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="configure">An action which modifies the provided <see cref="SamplerBuilder"/> in-place.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder ConfigureSampler(this TracerProviderBuilder tracerProviderBuilder, Action<SamplerBuilder> configure)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.ConfigureSampler(configure);
}

return tracerProviderBuilder;
}

/// <summary>
/// Sets the <see cref="SamplerBuilder"/> from which the Sampler associated with
/// this provider is built from. Overwrites currently set SamplerBuilder.
/// You should usually use <see cref="ConfigureSampler(TracerProviderBuilder, Action{SamplerBuilder})"/> instead
/// (call <see cref="SamplerBuilder.Clear"/> if desired).
/// </summary>
/// <param name="tracerProviderBuilder"><see cref="TracerProviderBuilder"/>.</param>
/// <param name="samplerBuilder"><see cref="SamplerBuilder"/> from which Resource will be built.</param>
/// <returns>Returns <see cref="TracerProviderBuilder"/> for chaining.</returns>
public static TracerProviderBuilder SetSamplerBuilder(this TracerProviderBuilder tracerProviderBuilder, SamplerBuilder samplerBuilder)
{
if (tracerProviderBuilder is TracerProviderBuilderBase tracerProviderBuilderBase)
{
tracerProviderBuilderBase.SetSamplerBuilder(samplerBuilder);
}

return tracerProviderBuilder;
}

/// <summary>
/// Sets the <see cref="ResourceBuilder"/> from which the Resource associated with
/// this provider is built from. Overwrites currently set ResourceBuilder.
Expand Down
Loading