Skip to content

Commit dcd313a

Browse files
authored
fix(sdk): sampling support (#3027)
1 parent ee79f70 commit dcd313a

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""Tests for OpenTelemetry sampler initialization functionality."""
2+
3+
from opentelemetry.sdk.trace.sampling import TraceIdRatioBased
4+
from opentelemetry.sdk.trace.export.in_memory_span_exporter import InMemorySpanExporter
5+
from traceloop.sdk import Traceloop
6+
from traceloop.sdk.tracing.tracing import TracerWrapper
7+
8+
9+
class TestSamplerInitialization:
10+
"""Test class for sampler initialization functionality."""
11+
12+
def test_init_with_rate_based_sampler(self):
13+
"""Test initialization with TraceIdRatioBased sampler."""
14+
if hasattr(TracerWrapper, "instance"):
15+
_trace_wrapper_instance = TracerWrapper.instance
16+
del TracerWrapper.instance
17+
18+
try:
19+
exporter = InMemorySpanExporter()
20+
sampler = TraceIdRatioBased(0.5) # 50% sampling rate
21+
22+
client = Traceloop.init(
23+
app_name="test-rate-based-sampler",
24+
sampler=sampler,
25+
exporter=exporter,
26+
disable_batch=True
27+
)
28+
29+
assert client is None
30+
assert hasattr(TracerWrapper, "instance")
31+
assert TracerWrapper.instance is not None
32+
33+
finally:
34+
if '_trace_wrapper_instance' in locals():
35+
TracerWrapper.instance = _trace_wrapper_instance

packages/traceloop-sdk/traceloop/sdk/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import Callable, Optional, Set
66
from colorama import Fore
77
from opentelemetry.sdk.trace import SpanProcessor, ReadableSpan
8+
from opentelemetry.sdk.trace.sampling import Sampler
89
from opentelemetry.sdk.trace.export import SpanExporter
910
from opentelemetry.sdk.metrics.export import MetricExporter
1011
from opentelemetry.sdk._logs.export import LogExporter
@@ -60,6 +61,7 @@ def init(
6061
logging_headers: Dict[str, str] = None,
6162
processor: Optional[SpanProcessor] = None,
6263
propagator: TextMapPropagator = None,
64+
sampler: Optional[Sampler] = None,
6365
traceloop_sync_enabled: bool = False,
6466
should_enrich_metrics: bool = True,
6567
resource_attributes: dict = {},
@@ -144,6 +146,7 @@ def init(
144146
processor=processor,
145147
propagator=propagator,
146148
exporter=exporter,
149+
sampler=sampler,
147150
should_enrich_metrics=should_enrich_metrics,
148151
image_uploader=image_uploader or ImageUploader(api_endpoint, api_key),
149152
instruments=instruments,

packages/traceloop-sdk/traceloop/sdk/tracing/tracing.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
)
1414
from opentelemetry.sdk.resources import Resource
1515
from opentelemetry.sdk.trace import TracerProvider, SpanProcessor, ReadableSpan
16+
from opentelemetry.sdk.trace.sampling import Sampler
1617
from opentelemetry.propagators.textmap import TextMapPropagator
1718
from opentelemetry.propagate import set_global_textmap
1819
from opentelemetry.sdk.trace.export import (
@@ -69,6 +70,7 @@ def __new__(
6970
processor: SpanProcessor = None,
7071
propagator: TextMapPropagator = None,
7172
exporter: SpanExporter = None,
73+
sampler: Optional[Sampler] = None,
7274
should_enrich_metrics: bool = True,
7375
instruments: Optional[Set[Instruments]] = None,
7476
block_instruments: Optional[Set[Instruments]] = None,
@@ -82,7 +84,7 @@ def __new__(
8284

8385
obj.__image_uploader = image_uploader
8486
obj.__resource = Resource(attributes=TracerWrapper.resource_attributes)
85-
obj.__tracer_provider = init_tracer_provider(resource=obj.__resource)
87+
obj.__tracer_provider = init_tracer_provider(resource=obj.__resource, sampler=sampler)
8688
if processor:
8789
Telemetry().capture("tracer:init", {"processor": "custom"})
8890
obj.__spans_processor: SpanProcessor = processor
@@ -339,12 +341,15 @@ def init_spans_exporter(api_endpoint: str, headers: Dict[str, str]) -> SpanExpor
339341
return GRPCExporter(endpoint=f"{api_endpoint}", headers=headers)
340342

341343

342-
def init_tracer_provider(resource: Resource) -> TracerProvider:
344+
def init_tracer_provider(resource: Resource, sampler: Optional[Sampler] = None) -> TracerProvider:
343345
provider: TracerProvider = None
344346
default_provider: TracerProvider = get_tracer_provider()
345347

346348
if isinstance(default_provider, ProxyTracerProvider):
347-
provider = TracerProvider(resource=resource)
349+
if sampler is not None:
350+
provider = TracerProvider(resource=resource, sampler=sampler)
351+
else:
352+
provider = TracerProvider(resource=resource)
348353
trace.set_tracer_provider(provider)
349354
elif not hasattr(default_provider, "add_span_processor"):
350355
logging.error(

0 commit comments

Comments
 (0)