From 6fbbb3e78bcf87a1b21ea0f836dfb40420f7061b Mon Sep 17 00:00:00 2001 From: Eric Huang Date: Thu, 16 Oct 2025 11:33:23 -0700 Subject: [PATCH] fix(telemetry): remove dependency on old telemetry config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # What does this PR do? old telemetry config was removed in #3815 ## Test Plan ❯ OTEL_SERVICE_NAME=aloha OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 uv run llama stack run starter --- llama_stack/core/datatypes.py | 12 +++++ .../telemetry/meta_reference/telemetry.py | 49 +++++-------------- 2 files changed, 25 insertions(+), 36 deletions(-) diff --git a/llama_stack/core/datatypes.py b/llama_stack/core/datatypes.py index b376901fd..94222d49e 100644 --- a/llama_stack/core/datatypes.py +++ b/llama_stack/core/datatypes.py @@ -177,6 +177,18 @@ class DistributionSpec(BaseModel): class TelemetryConfig(BaseModel): + """ + Configuration for telemetry. + + Llama Stack uses OpenTelemetry for telemetry. Please refer to https://opentelemetry.io/docs/languages/sdk-configuration/ + for env variables to configure the OpenTelemetry SDK. + + Example: + ```bash + OTEL_SERVICE_NAME=llama-stack OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318 uv run llama stack run starter + ``` + """ + enabled: bool = Field(default=False, description="enable or disable telemetry") diff --git a/llama_stack/providers/inline/telemetry/meta_reference/telemetry.py b/llama_stack/providers/inline/telemetry/meta_reference/telemetry.py index f56609cab..7a993b891 100644 --- a/llama_stack/providers/inline/telemetry/meta_reference/telemetry.py +++ b/llama_stack/providers/inline/telemetry/meta_reference/telemetry.py @@ -12,10 +12,8 @@ from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExp from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader -from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.export import BatchSpanProcessor -from opentelemetry.semconv.resource import ResourceAttributes from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator from llama_stack.apis.telemetry import ( @@ -30,12 +28,9 @@ from llama_stack.apis.telemetry import ( ) from llama_stack.core.datatypes import Api from llama_stack.log import get_logger -from llama_stack.providers.inline.telemetry.meta_reference.console_span_processor import ( - ConsoleSpanProcessor, -) from llama_stack.providers.utils.telemetry.tracing import ROOT_SPAN_MARKERS -from .config import TelemetryConfig, TelemetrySink +from .config import TelemetryConfig _GLOBAL_STORAGE: dict[str, dict[str | int, Any]] = { "active_spans": {}, @@ -55,17 +50,10 @@ def is_tracing_enabled(tracer): class TelemetryAdapter(Telemetry): - def __init__(self, config: TelemetryConfig, deps: dict[Api, Any]) -> None: - self.config = config + def __init__(self, _config: TelemetryConfig, deps: dict[Api, Any]) -> None: self.datasetio_api = deps.get(Api.datasetio) self.meter = None - resource = Resource.create( - { - ResourceAttributes.SERVICE_NAME: self.config.service_name, - } - ) - 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. @@ -73,35 +61,24 @@ class TelemetryAdapter(Telemetry): # 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) + provider = TracerProvider() trace.set_tracer_provider(provider) _TRACER_PROVIDER = provider # Use single OTLP endpoint for all telemetry signals - if TelemetrySink.OTEL_TRACE in self.config.sinks or TelemetrySink.OTEL_METRIC in self.config.sinks: - if self.config.otel_exporter_otlp_endpoint is None: - raise ValueError( - "otel_exporter_otlp_endpoint is required when OTEL_TRACE or OTEL_METRIC is enabled" - ) - # Let OpenTelemetry SDK handle endpoint construction automatically - # The SDK will read OTEL_EXPORTER_OTLP_ENDPOINT and construct appropriate URLs - # https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter - if TelemetrySink.OTEL_TRACE in self.config.sinks: - span_exporter = OTLPSpanExporter() - span_processor = BatchSpanProcessor(span_exporter) - trace.get_tracer_provider().add_span_processor(span_processor) + # Let OpenTelemetry SDK handle endpoint construction automatically + # The SDK will read OTEL_EXPORTER_OTLP_ENDPOINT and construct appropriate URLs + # https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter + span_exporter = OTLPSpanExporter() + span_processor = BatchSpanProcessor(span_exporter) + trace.get_tracer_provider().add_span_processor(span_processor) - if TelemetrySink.OTEL_METRIC in self.config.sinks: - metric_reader = PeriodicExportingMetricReader(OTLPMetricExporter()) - metric_provider = MeterProvider(resource=resource, metric_readers=[metric_reader]) - metrics.set_meter_provider(metric_provider) + metric_reader = PeriodicExportingMetricReader(OTLPMetricExporter()) + metric_provider = MeterProvider(metric_readers=[metric_reader]) + metrics.set_meter_provider(metric_provider) - if TelemetrySink.CONSOLE in self.config.sinks: - trace.get_tracer_provider().add_span_processor(ConsoleSpanProcessor(print_attributes=True)) - - if TelemetrySink.OTEL_METRIC in self.config.sinks: - self.meter = metrics.get_meter(__name__) + self.meter = metrics.get_meter(__name__) self._lock = _global_lock