Skip to content

Commit 47ce504

Browse files
_setup_cloud_tracer still overrides TracerProviders due to checking the wrong base class (#4584)
1 parent b5e0596 commit 47ce504

1 file changed

Lines changed: 21 additions & 12 deletions

File tree

  • livekit-agents/livekit/agents/telemetry

livekit-agents/livekit/agents/telemetry/traces.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
import aiohttp
1212
import requests
1313
from google.protobuf.json_format import MessageToDict
14-
from opentelemetry import context as otel_context, trace
14+
from opentelemetry import context as otel_context, trace, trace as trace_api
1515
from opentelemetry._logs import get_logger_provider, set_logger_provider
1616
from opentelemetry._logs.severity import SeverityNumber
1717
from opentelemetry.exporter.otlp.proto.http import Compression
1818
from opentelemetry.exporter.otlp.proto.http._log_exporter import OTLPLogExporter
1919
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
20+
from opentelemetry.sdk import trace as trace_sdk
2021
from opentelemetry.sdk._logs import (
2122
LoggerProvider,
2223
LoggingHandler,
@@ -25,7 +26,7 @@
2526
)
2627
from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
2728
from opentelemetry.sdk.resources import SERVICE_NAME, Resource
28-
from opentelemetry.sdk.trace import SpanProcessor, TracerProvider
29+
from opentelemetry.sdk.trace import SpanProcessor
2930
from opentelemetry.sdk.trace.export import BatchSpanProcessor
3031
from opentelemetry.trace import Span, Tracer
3132
from opentelemetry.util._decorator import _agnosticcontextmanager
@@ -45,10 +46,10 @@
4546
class _DynamicTracer(Tracer):
4647
def __init__(self, instrumenting_module_name: str) -> None:
4748
self._instrumenting_module_name = instrumenting_module_name
48-
self._tracer_provider = trace.get_tracer_provider()
49+
self._tracer_provider: trace_api.TracerProvider = trace.get_tracer_provider()
4950
self._tracer = trace.get_tracer(instrumenting_module_name)
5051

51-
def set_provider(self, tracer_provider: TracerProvider) -> None:
52+
def set_provider(self, tracer_provider: trace_api.TracerProvider) -> None:
5253
self._tracer_provider = tracer_provider
5354
self._tracer = trace.get_tracer(
5455
self._instrumenting_module_name,
@@ -98,15 +99,15 @@ def force_flush(self, timeout_millis: int = 30000) -> bool:
9899

99100

100101
def set_tracer_provider(
101-
tracer_provider: TracerProvider, *, metadata: dict[str, AttributeValue] | None = None
102+
tracer_provider: trace_api.TracerProvider, *, metadata: dict[str, AttributeValue] | None = None
102103
) -> None:
103104
"""Set the tracer provider for the livekit-agents.
104105
105106
Args:
106107
tracer_provider (TracerProvider): The tracer provider to set.
107108
metadata (dict[str, AttributeValue] | None, optional): Metadata to set on all spans. Defaults to None.
108109
"""
109-
if metadata:
110+
if metadata and isinstance(tracer_provider, trace_sdk.TracerProvider):
110111
tracer_provider.add_span_processor(_MetadataSpanProcessor(metadata))
111112

112113
tracer.set_provider(tracer_provider)
@@ -162,22 +163,30 @@ def __call__(self) -> dict[str, str]:
162163
}
163164
)
164165

165-
if not isinstance(tracer._tracer_provider, TracerProvider):
166-
tracer_provider = TracerProvider(resource=resource)
166+
# Check if a tracer provider is not set and set one up
167+
# below shows how the ProxyTracerProvider is returned when none have been setup
168+
# https://github.com/open-telemetry/opentelemetry-python/blob/0018c0030bac9bdce4487fe5fcb3ec6a542ec904/opentelemetry-api/src/opentelemetry/trace/__init__.py#L555
169+
tracer_provider: trace_api.TracerProvider
170+
if isinstance(
171+
tracer._tracer_provider, (trace_api.ProxyTracerProvider, trace_api.NoOpTracerProvider)
172+
):
173+
tracer_provider = trace_sdk.TracerProvider(resource=resource)
167174
set_tracer_provider(tracer_provider)
168175
else:
169176
# attach the processor to the existing tracer provider
170177
tracer_provider = tracer._tracer_provider
171-
tracer_provider.resource.merge(resource)
178+
if isinstance(tracer_provider, trace_sdk.TracerProvider):
179+
tracer_provider.resource.merge(resource)
172180

173181
span_exporter = OTLPSpanExporter(
174182
endpoint=f"https://{cloud_hostname}/observability/traces/otlp/v0",
175183
compression=otlp_compression,
176184
session=session,
177185
)
178186

179-
tracer_provider.add_span_processor(_MetadataSpanProcessor(metadata))
180-
tracer_provider.add_span_processor(BatchSpanProcessor(span_exporter))
187+
if isinstance(tracer_provider, trace_sdk.TracerProvider):
188+
tracer_provider.add_span_processor(_MetadataSpanProcessor(metadata))
189+
tracer_provider.add_span_processor(BatchSpanProcessor(span_exporter))
181190

182191
logger_provider = get_logger_provider()
183192
if not isinstance(logger_provider, LoggerProvider):
@@ -428,7 +437,7 @@ def _log(
428437

429438

430439
def _shutdown_telemetry() -> None:
431-
if isinstance(tracer_provider := tracer._tracer_provider, TracerProvider):
440+
if isinstance(tracer_provider := tracer._tracer_provider, trace_sdk.TracerProvider):
432441
logger.debug("shutting down telemetry tracer provider")
433442
tracer_provider.force_flush()
434443
tracer_provider.shutdown()

0 commit comments

Comments
 (0)