@@ -61,28 +61,19 @@ class OpentelemetryTracer(BaseModel, BaseTracer):
6161
6262 def model_post_init (self , context : Any , / ) -> None :
6363 self ._processors = []
64- self ._inmemory_exporter : InMemoryExporter = None
65- self ._apiserver_exporter : ApiServerExporter = None
66- # Inmemory & APIServer are the default exporters
67- have_inmemory_exporter = False
68- have_apiserver_exporter = False
64+ self ._inmemory_exporter : InMemoryExporter | None = None
65+
66+ # InMemoryExporter is a default exporter for exporting local tracing file
6967 for exporter in self .exporters :
7068 if isinstance (exporter , InMemoryExporter ):
71- have_inmemory_exporter = True
7269 self ._inmemory_exporter = exporter
73- elif isinstance (exporter , ApiServerExporter ):
74- have_apiserver_exporter = True
75- self ._apiserver_exporter = exporter
76-
77- if not have_inmemory_exporter :
78- inmemory_exporter = InMemoryExporter ()
79- self .exporters .append (inmemory_exporter )
80- self ._inmemory_exporter = inmemory_exporter
81- if not have_apiserver_exporter :
82- apiserver_exporter = ApiServerExporter ()
83- self .exporters .append (apiserver_exporter )
84- self ._apiserver_exporter = apiserver_exporter
8570
71+ if self ._inmemory_exporter is None :
72+ self ._inmemory_exporter = InMemoryExporter ()
73+ self .exporters .append (self ._inmemory_exporter )
74+ # ========================================================================
75+
76+ # Process meter-related attributes
8677 self ._meter_contexts = []
8778 self ._meter_uploaders = []
8879 for exporter in self .exporters :
@@ -93,19 +84,18 @@ def model_post_init(self, context: Any, /) -> None:
9384 for meter_context in self ._meter_contexts :
9485 meter_uploader = MeterUploader (meter_context )
9586 self ._meter_uploaders .append (meter_uploader )
87+ # ================================
9688
9789 # init tracer provider
90+ # VeADK operates on global OpenTelemetry provider, hence return nothing
9891 self ._init_tracer_provider ()
9992
10093 # just for debug
10194 self ._trace_file_path = ""
10295
103- # patch this before starting instrumentation
104- # enable_veadk_tracing(self.dump)
105-
10696 GoogleADKInstrumentor ().instrument ()
10797
108- def _init_tracer_provider (self ):
98+ def _init_tracer_provider (self ) -> None :
10999 # 1. get global trace provider
110100 global_tracer_provider = trace_api .get_tracer_provider ()
111101
@@ -122,17 +112,25 @@ def _init_tracer_provider(self):
122112 # 2. check if apmplus exporter is already exist
123113 for processor in global_tracer_provider ._active_span_processor ._span_processors :
124114 if isinstance (processor , (BatchSpanProcessor , SimpleSpanProcessor )):
125- # check exporter endpoint
126- if "apmplus" in processor .span_exporter ._endpoint :
127- have_apmplus_exporter = True
115+ # try to get endpoint, in case of exporter has no _endpoint attribute
116+ try :
117+ exporter_endpoint = processor .span_exporter ._endpoint
118+ if "apmplus" in exporter_endpoint :
119+ have_apmplus_exporter = True
120+ except AttributeError :
121+ # log a warning and pass this exporter
122+ logger .warning (
123+ f"Exporter { processor .span_exporter } has no endpoint."
124+ )
128125
129126 # 3. add exporters to global tracer_provider
130127 # range over a copy of exporters to avoid index issues
128+ if have_apmplus_exporter :
129+ self .exporters = [
130+ e for e in self .exporters if not isinstance (e , APMPlusExporter )
131+ ]
132+
131133 for exporter in self .exporters [:]:
132- if have_apmplus_exporter and isinstance (exporter , APMPlusExporter ):
133- # apmplus exporter has been int in global tracer provider, need to remove from exporters.
134- self .exporters .remove (exporter )
135- continue
136134 processor , resource_attributes = exporter .get_processor ()
137135 if resource_attributes is not None :
138136 update_resource_attributions (
@@ -150,6 +148,12 @@ def dump(
150148 session_id : str ,
151149 path : str = "/tmp" ,
152150 ) -> str :
151+ if not self ._inmemory_exporter :
152+ logger .warning (
153+ "InMemoryExporter is not initialized. Please check your tracer exporters."
154+ )
155+ return ""
156+
153157 prompt_tokens = self ._inmemory_exporter ._real_exporter .prompt_tokens
154158 completion_tokens = self ._inmemory_exporter ._real_exporter .completion_tokens
155159
0 commit comments