11
11
from importlib .metadata import version
12
12
from typing import Any , Dict , Mapping , Optional
13
13
14
- from opentelemetry import trace
14
+ from opentelemetry import propagate , trace
15
+ from opentelemetry .baggage .propagation import W3CBaggagePropagator
15
16
from opentelemetry .exporter .otlp .proto .http .trace_exporter import OTLPSpanExporter
17
+ from opentelemetry .propagators .composite import CompositePropagator
16
18
from opentelemetry .sdk .resources import Resource
17
19
from opentelemetry .sdk .trace import TracerProvider
18
20
from opentelemetry .sdk .trace .export import BatchSpanProcessor , ConsoleSpanExporter , SimpleSpanProcessor
19
21
from opentelemetry .trace import StatusCode
22
+ from opentelemetry .trace .propagation .tracecontext import TraceContextTextMapPropagator
20
23
21
24
from ..agent .agent_result import AgentResult
22
25
from ..types .content import Message , Messages
@@ -94,6 +97,7 @@ def __init__(
94
97
otlp_endpoint : Optional [str ] = None ,
95
98
otlp_headers : Optional [Dict [str , str ]] = None ,
96
99
enable_console_export : Optional [bool ] = None ,
100
+ tracer_provider : Optional [TracerProvider ] = None ,
97
101
):
98
102
"""Initialize the tracer.
99
103
@@ -102,6 +106,7 @@ def __init__(
102
106
otlp_endpoint: OTLP endpoint URL for sending traces.
103
107
otlp_headers: Headers to include with OTLP requests.
104
108
enable_console_export: Whether to also export traces to console.
109
+ tracer_provider: Optional existing TracerProvider to use instead of creating a new one.
105
110
"""
106
111
# Check environment variables first
107
112
env_endpoint = os .environ .get ("OTEL_EXPORTER_OTLP_ENDPOINT" )
@@ -133,10 +138,22 @@ def __init__(
133
138
134
139
self .service_name = service_name
135
140
self .otlp_headers = otlp_headers or {}
136
- self .tracer_provider : Optional [ TracerProvider ] = None
141
+ self .tracer_provider = tracer_provider
137
142
self .tracer : Optional [trace .Tracer ] = None
138
143
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
140
157
self ._initialize_tracer ()
141
158
142
159
def _initialize_tracer (self ) -> None :
@@ -549,6 +566,7 @@ def get_tracer(
549
566
otlp_endpoint : Optional [str ] = None ,
550
567
otlp_headers : Optional [Dict [str , str ]] = None ,
551
568
enable_console_export : Optional [bool ] = None ,
569
+ tracer_provider : Optional [TracerProvider ] = None ,
552
570
) -> Tracer :
553
571
"""Get or create the global tracer.
554
572
@@ -557,18 +575,24 @@ def get_tracer(
557
575
otlp_endpoint: OTLP endpoint URL for sending traces.
558
576
otlp_headers: Headers to include with OTLP requests.
559
577
enable_console_export: Whether to also export traces to console.
578
+ tracer_provider: Optional existing TracerProvider to use instead of creating a new one.
560
579
561
580
Returns:
562
581
The global tracer instance.
563
582
"""
564
583
global _tracer_instance
565
584
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
587
+ or (otlp_endpoint and _tracer_instance .otlp_endpoint != otlp_endpoint )
588
+ or (tracer_provider is not None and _tracer_instance .tracer_provider != tracer_provider )
589
+ ):
567
590
_tracer_instance = Tracer (
568
591
service_name = service_name ,
569
592
otlp_endpoint = otlp_endpoint ,
570
593
otlp_headers = otlp_headers ,
571
594
enable_console_export = enable_console_export ,
595
+ tracer_provider = tracer_provider ,
572
596
)
573
597
574
598
return _tracer_instance
0 commit comments