Skip to content

Commit b2a92c5

Browse files
committed
feat: update tracer init
1 parent 75c157c commit b2a92c5

File tree

1 file changed

+43
-13
lines changed

1 file changed

+43
-13
lines changed

veadk/tracing/telemetry/opentelemetry_tracer.py

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@
2020

2121
from openinference.instrumentation.google_adk import GoogleADKInstrumentor
2222
from opentelemetry.sdk import trace as trace_sdk
23+
from opentelemetry import trace as trace_api
2324
from opentelemetry.sdk.resources import Resource
2425
from opentelemetry.sdk.trace import TracerProvider
26+
from opentelemetry.sdk.trace.export import BatchSpanProcessor, SimpleSpanProcessor
27+
2528
from pydantic import BaseModel, ConfigDict, Field
2629
from typing_extensions import override
2730

2831
from veadk.tracing.base_tracer import BaseTracer
2932
from veadk.tracing.telemetry.exporters.apiserver_exporter import ApiServerExporter
33+
from veadk.tracing.telemetry.exporters.apmplus_exporter import APMPlusExporter
3034
from veadk.tracing.telemetry.exporters.base_exporter import BaseExporter
3135
from veadk.tracing.telemetry.exporters.inmemory_exporter import InMemoryExporter
3236
from veadk.tracing.telemetry.metrics.opentelemetry_metrics import MeterUploader
@@ -60,7 +64,6 @@ def model_post_init(self, context: Any, /) -> None:
6064
self._processors = []
6165
self._inmemory_exporter: InMemoryExporter = None
6266
self._apiserver_exporter: ApiServerExporter = None
63-
6467
# Inmemory & APIServer are the default exporters
6568
have_inmemory_exporter = False
6669
have_apiserver_exporter = False
@@ -81,17 +84,6 @@ def model_post_init(self, context: Any, /) -> None:
8184
self.exporters.append(apiserver_exporter)
8285
self._apiserver_exporter = apiserver_exporter
8386

84-
tracer_provider = trace_sdk.TracerProvider()
85-
for exporter in self.exporters:
86-
processor, resource_attributes = exporter.get_processor()
87-
if resource_attributes is not None:
88-
update_resource_attributions(tracer_provider, resource_attributes)
89-
tracer_provider.add_span_processor(processor)
90-
91-
logger.debug(f"Add exporter `{exporter.__class__.__name__}` to tracing.")
92-
self._processors.append(processor)
93-
logger.debug(f"Init OpentelemetryTracer with {len(self.exporters)} exporters.")
94-
9587
self._meter_contexts = []
9688
self._meter_uploaders = []
9789
for exporter in self.exporters:
@@ -103,13 +95,51 @@ def model_post_init(self, context: Any, /) -> None:
10395
meter_uploader = MeterUploader(meter_context)
10496
self._meter_uploaders.append(meter_uploader)
10597

98+
# init tracer provider
99+
self._init_tracer_provider()
100+
106101
# just for debug
107102
self._trace_file_path = ""
108103

109104
# patch this before starting instrumentation
110105
# enable_veadk_tracing(self.dump)
111106

112-
GoogleADKInstrumentor().instrument(tracer_provider=tracer_provider)
107+
GoogleADKInstrumentor().instrument()
108+
109+
def _init_tracer_provider(self):
110+
# 1. get global trace provider
111+
global_tracer_provider = trace_api.get_tracer_provider()
112+
113+
if not isinstance(global_tracer_provider, TracerProvider):
114+
logger.info(f"Global tracer provider has not been set. Create tracer provider and set it now.")
115+
# 1.1 init tracer provider
116+
tracer_provider = trace_sdk.TracerProvider()
117+
trace_api.set_tracer_provider(tracer_provider)
118+
global_tracer_provider = trace_api.get_tracer_provider()
119+
120+
have_apmplus_exporter = False
121+
# 2. check if apmplus exporter is already exist
122+
for processor in global_tracer_provider._active_span_processor._span_processors:
123+
if isinstance(processor, (BatchSpanProcessor, SimpleSpanProcessor)):
124+
# check exporter endpoint
125+
if "apmplus" in processor.span_exporter._endpoint:
126+
have_apmplus_exporter = True
127+
128+
# 3. add exporters to global tracer_provider
129+
# range over a copy of exporters to avoid index issues
130+
for exporter in self.exporters[:]:
131+
if have_apmplus_exporter and isinstance(exporter, APMPlusExporter):
132+
# apmplus exporter has been int in global tracer provider, need to remove from exporters.
133+
self.exporters.remove(exporter)
134+
continue
135+
processor, resource_attributes = exporter.get_processor()
136+
if resource_attributes is not None:
137+
update_resource_attributions(global_tracer_provider, resource_attributes)
138+
global_tracer_provider.add_span_processor(processor)
139+
logger.debug(f"Add exporter `{exporter.__class__.__name__}` to tracing.")
140+
self._processors.append(processor)
141+
logger.debug(f"Init OpentelemetryTracer with {len(self.exporters)} exporters.")
142+
113143

114144
@override
115145
def dump(

0 commit comments

Comments
 (0)