Plain is headed towards 1.0! Subscribe for development updates →

 1from opentelemetry import trace
 2from opentelemetry.sdk.trace import TracerProvider
 3
 4from plain.packages import PackageConfig, register_config
 5
 6from .otel import ObserverSampler, ObserverSpanProcessor
 7
 8
 9@register_config
10class Config(PackageConfig):
11    package_label = "plainobserver"
12
13    def ready(self):
14        if self.has_existing_trace_provider():
15            return
16
17        self.setup_observer()
18
19    @staticmethod
20    def has_existing_trace_provider() -> bool:
21        """Check if there is an existing trace provider."""
22        current_provider = trace.get_tracer_provider()
23        return current_provider and not isinstance(
24            current_provider, trace.ProxyTracerProvider
25        )
26
27    @staticmethod
28    def setup_observer() -> None:
29        sampler = ObserverSampler()
30        provider = TracerProvider(sampler=sampler)
31
32        # Add our combined processor that handles both memory storage and export
33        observer_processor = ObserverSpanProcessor()
34        provider.add_span_processor(observer_processor)
35
36        trace.set_tracer_provider(provider)