Skip to content

Commit a70e4a0

Browse files
matej-gsrikanthccv
andauthored
Fix use of built-in samplers in SDK configuration (open-telemetry#3176)
* Add built-in sampler classes Signed-off-by: Matej Gera <[email protected]> * Add entry points for built-in samplers Signed-off-by: Matej Gera <[email protected]> * Add CHANGELOG Signed-off-by: Matej Gera <[email protected]> * Handle rate arg properly Signed-off-by: Matej Gera <[email protected]> * Adjust class and entry points naming Signed-off-by: Matej Gera <[email protected]> --------- Signed-off-by: Matej Gera <[email protected]> Co-authored-by: Srikanth Chekuri <[email protected]>
1 parent 2d9858f commit a70e4a0

File tree

4 files changed

+46
-4
lines changed

4 files changed

+46
-4
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111
([#3100](https://github.com/open-telemetry/opentelemetry-python/pull/3100))
1212
- Fix formatting of ConsoleMetricExporter.
1313
([#3197](https://github.com/open-telemetry/opentelemetry-python/pull/3197))
14+
- Fix use of built-in samplers in SDK configuration
15+
([#3176](https://github.com/open-telemetry/opentelemetry-python/pull/3176))
1416
- Implement shutdown procedure forOTLP grpc exporters
1517
([#3138](https://github.com/open-telemetry/opentelemetry-python/pull/3138))
1618
- Add exponential histogram

opentelemetry-sdk/pyproject.toml

+8
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ sdk = "opentelemetry.sdk.environment_variables"
4141
[project.entry-points.opentelemetry_id_generator]
4242
random = "opentelemetry.sdk.trace.id_generator:RandomIdGenerator"
4343

44+
[project.entry-points.opentelemetry_traces_sampler]
45+
always_on = "opentelemetry.sdk.trace.sampling:_AlwaysOn"
46+
always_off = "opentelemetry.sdk.trace.sampling:_AlwaysOff"
47+
parentbased_always_on = "opentelemetry.sdk.trace.sampling:_ParentBasedAlwaysOn"
48+
parentbased_always_off = "opentelemetry.sdk.trace.sampling:_ParentBasedAlwaysOff"
49+
traceidratio = "opentelemetry.sdk.trace.sampling:TraceIdRatioBased"
50+
parentbased_traceidratio = "opentelemetry.sdk.trace.sampling:ParentBasedTraceIdRatio"
51+
4452
[project.entry-points.opentelemetry_logger_provider]
4553
sdk_logger_provider = "opentelemetry.sdk._logs:LoggerProvider"
4654

opentelemetry-sdk/src/opentelemetry/sdk/_configuration/__init__.py

+15-3
Original file line numberDiff line numberDiff line change
@@ -295,16 +295,28 @@ def _import_sampler(sampler_name: str) -> Optional[Sampler]:
295295
return None
296296
try:
297297
sampler_factory = _import_sampler_factory(sampler_name)
298-
sampler_arg = os.getenv(OTEL_TRACES_SAMPLER_ARG, "")
299-
sampler = sampler_factory(sampler_arg)
298+
arg = None
299+
if sampler_name in ("traceidratio", "parentbased_traceidratio"):
300+
try:
301+
rate = float(os.getenv(OTEL_TRACES_SAMPLER_ARG))
302+
except (ValueError, TypeError):
303+
_logger.warning(
304+
"Could not convert TRACES_SAMPLER_ARG to float. Using default value 1.0."
305+
)
306+
rate = 1.0
307+
arg = rate
308+
else:
309+
arg = os.getenv(OTEL_TRACES_SAMPLER_ARG)
310+
311+
sampler = sampler_factory(arg)
300312
if not isinstance(sampler, Sampler):
301313
message = f"Sampler factory, {sampler_factory}, produced output, {sampler}, which is not a Sampler."
302314
_logger.warning(message)
303315
raise ValueError(message)
304316
return sampler
305317
except Exception as exc: # pylint: disable=broad-except
306318
_logger.warning(
307-
"Using default sampler. Failed to initialize custom sampler, %s: %s",
319+
"Using default sampler. Failed to initialize sampler, %s: %s",
308320
sampler_name,
309321
exc,
310322
)

opentelemetry-sdk/src/opentelemetry/sdk/trace/sampling.py

+21-1
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,26 @@ def __init__(self, rate: float):
394394
super().__init__(root=root)
395395

396396

397+
class _AlwaysOff(StaticSampler):
398+
def __init__(self, _):
399+
super().__init__(Decision.DROP)
400+
401+
402+
class _AlwaysOn(StaticSampler):
403+
def __init__(self, _):
404+
super().__init__(Decision.RECORD_AND_SAMPLE)
405+
406+
407+
class _ParentBasedAlwaysOff(ParentBased):
408+
def __init__(self, _):
409+
super().__init__(ALWAYS_OFF)
410+
411+
412+
class _ParentBasedAlwaysOn(ParentBased):
413+
def __init__(self, _):
414+
super().__init__(ALWAYS_ON)
415+
416+
397417
_KNOWN_SAMPLERS = {
398418
"always_on": ALWAYS_ON,
399419
"always_off": ALWAYS_OFF,
@@ -415,7 +435,7 @@ def _get_from_env_or_default() -> Sampler:
415435
if trace_sampler in ("traceidratio", "parentbased_traceidratio"):
416436
try:
417437
rate = float(os.getenv(OTEL_TRACES_SAMPLER_ARG))
418-
except ValueError:
438+
except (ValueError, TypeError):
419439
_logger.warning("Could not convert TRACES_SAMPLER_ARG to float.")
420440
rate = 1.0
421441
return _KNOWN_SAMPLERS[trace_sampler](rate)

0 commit comments

Comments
 (0)