diff --git a/llama_stack/providers/inline/telemetry/meta_reference/telemetry.py b/llama_stack/providers/inline/telemetry/meta_reference/telemetry.py index aeeed1ac0..569d02f50 100644 --- a/llama_stack/providers/inline/telemetry/meta_reference/telemetry.py +++ b/llama_stack/providers/inline/telemetry/meta_reference/telemetry.py @@ -81,6 +81,11 @@ class TelemetryAdapter(TelemetryDatasetMixin, Telemetry): ) global _TRACER_PROVIDER + # Initialize the correct span processor based on the provider state. + # This is needed since once the span processor is set, it cannot be unset. + # Recreating the telemetry adapter multiple times will result in duplicate span processors. + # Since the library client can be recreated multiple times in a notebook, + # the kernel will hold on to the span processor and cause duplicate spans to be written. if _TRACER_PROVIDER is None: provider = TracerProvider(resource=resource) trace.set_tracer_provider(provider) @@ -100,14 +105,18 @@ class TelemetryAdapter(TelemetryDatasetMixin, Telemetry): resource=resource, metric_readers=[metric_reader] ) metrics.set_meter_provider(metric_provider) - self.meter = metrics.get_meter(__name__) if TelemetrySink.SQLITE in self.config.sinks: trace.get_tracer_provider().add_span_processor( SQLiteSpanProcessor(self.config.sqlite_db_path) ) - self.trace_store = SQLiteTraceStore(self.config.sqlite_db_path) if TelemetrySink.CONSOLE in self.config.sinks: trace.get_tracer_provider().add_span_processor(ConsoleSpanProcessor()) + + if TelemetrySink.OTEL in self.config.sinks: + self.meter = metrics.get_meter(__name__) + if TelemetrySink.SQLITE in self.config.sinks: + self.trace_store = SQLiteTraceStore(self.config.sqlite_db_path) + self._lock = _global_lock async def initialize(self) -> None: