1111from importlib .metadata import version
1212from typing import Any , Dict , Mapping , Optional
1313
14- from opentelemetry import trace
14+ from opentelemetry import propagate , trace
15+ from opentelemetry .baggage .propagation import W3CBaggagePropagator
1516from opentelemetry .exporter .otlp .proto .http .trace_exporter import OTLPSpanExporter
17+ from opentelemetry .propagators .composite import CompositePropagator
1618from opentelemetry .sdk .resources import Resource
1719from opentelemetry .sdk .trace import TracerProvider
1820from opentelemetry .sdk .trace .export import BatchSpanProcessor , ConsoleSpanExporter , SimpleSpanProcessor
1921from opentelemetry .trace import StatusCode
22+ from opentelemetry .trace .propagation .tracecontext import TraceContextTextMapPropagator
2023
2124from ..agent .agent_result import AgentResult
2225from ..types .content import Message , Messages
@@ -94,6 +97,7 @@ def __init__(
9497 otlp_endpoint : Optional [str ] = None ,
9598 otlp_headers : Optional [Dict [str , str ]] = None ,
9699 enable_console_export : Optional [bool ] = None ,
100+ tracer_provider : Optional [TracerProvider ] = None ,
97101 ):
98102 """Initialize the tracer.
99103
@@ -102,6 +106,7 @@ def __init__(
102106 otlp_endpoint: OTLP endpoint URL for sending traces.
103107 otlp_headers: Headers to include with OTLP requests.
104108 enable_console_export: Whether to also export traces to console.
109+ tracer_provider: Optional existing TracerProvider to use instead of creating a new one.
105110 """
106111 # Check environment variables first
107112 env_endpoint = os .environ .get ("OTEL_EXPORTER_OTLP_ENDPOINT" )
@@ -133,10 +138,22 @@ def __init__(
133138
134139 self .service_name = service_name
135140 self .otlp_headers = otlp_headers or {}
136- self .tracer_provider : Optional [ TracerProvider ] = None
141+ self .tracer_provider = tracer_provider
137142 self .tracer : Optional [trace .Tracer ] = None
138143
139- if self .otlp_endpoint or self .enable_console_export :
144+ propagate .set_global_textmap (
145+ CompositePropagator (
146+ [
147+ W3CBaggagePropagator (),
148+ TraceContextTextMapPropagator (),
149+ ]
150+ )
151+ )
152+ if self .tracer_provider :
153+ # Use the provided tracer provider directly
154+ self .tracer = self .tracer_provider .get_tracer (self .service_name )
155+ elif self .otlp_endpoint or self .enable_console_export :
156+ # Create our own tracer provider
140157 self ._initialize_tracer ()
141158
142159 def _initialize_tracer (self ) -> None :
@@ -549,6 +566,7 @@ def get_tracer(
549566 otlp_endpoint : Optional [str ] = None ,
550567 otlp_headers : Optional [Dict [str , str ]] = None ,
551568 enable_console_export : Optional [bool ] = None ,
569+ tracer_provider : Optional [TracerProvider ] = None ,
552570) -> Tracer :
553571 """Get or create the global tracer.
554572
@@ -557,18 +575,22 @@ def get_tracer(
557575 otlp_endpoint: OTLP endpoint URL for sending traces.
558576 otlp_headers: Headers to include with OTLP requests.
559577 enable_console_export: Whether to also export traces to console.
578+ tracer_provider: Optional existing TracerProvider to use instead of creating a new one.
560579
561580 Returns:
562581 The global tracer instance.
563582 """
564583 global _tracer_instance
565584
566- if _tracer_instance is None or (otlp_endpoint and _tracer_instance .otlp_endpoint != otlp_endpoint ): # type: ignore[unreachable]
585+ if (
586+ _tracer_instance is None or (otlp_endpoint and _tracer_instance .otlp_endpoint != otlp_endpoint ) # type: ignore[unreachable]
587+ ):
567588 _tracer_instance = Tracer (
568589 service_name = service_name ,
569590 otlp_endpoint = otlp_endpoint ,
570591 otlp_headers = otlp_headers ,
571592 enable_console_export = enable_console_export ,
593+ tracer_provider = tracer_provider ,
572594 )
573595
574596 return _tracer_instance
0 commit comments