Skip to content

Commit 189ced9

Browse files
refine: refine tracing check logic and remove API server exporter (#55)
* refine tracing check logic and remove API server exporter * fix hint in evaluator * update to 0.2.1 to fix tracer bug
1 parent 2584516 commit 189ced9

File tree

6 files changed

+40
-43
lines changed

6 files changed

+40
-43
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "veadk-python"
3-
version = "0.2.0"
3+
version = "0.2.1"
44
description = "Volcengine agent development kit, integrations with Volcengine cloud services."
55
readme = "README.md"
66
requires-python = ">=3.10"

tests/test_tracing.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,9 @@ async def test_tracing():
8282
exporters = init_exporters()
8383
tracer = OpentelemetryTracer(exporters=exporters)
8484

85-
assert len(tracer.exporters) == 5 # with extra 2 built-in exporters
85+
assert len(tracer.exporters) == 4 # with extra 1 built-in exporters
8686

8787
# TODO: Ensure the tracing provider is set correctly after loading SDK
88-
# TODO: Ensure the tracing provider is set correctly after loading SDK
89-
# TODO: Ensure the tracing provider is set correctly after loading SDK
9088

9189

9290
@pytest.mark.asyncio
@@ -100,7 +98,7 @@ async def test_tracing_with_global_provider():
10098
#
10199
tracer = OpentelemetryTracer(exporters=exporters)
102100

103-
assert len(tracer.exporters) == 5 # with extra 2 built-in exporters
101+
assert len(tracer.exporters) == 4 # with extra 1 built-in exporters
104102

105103

106104
@pytest.mark.asyncio
@@ -115,4 +113,4 @@ async def test_tracing_with_apmplus_global_provider():
115113
tracer = OpentelemetryTracer(exporters=exporters)
116114

117115
# apmplus exporter won't init again
118-
assert len(tracer.exporters) == 4 # with extra 2 built-in exporters
116+
assert len(tracer.exporters) == 3 # with extra 1 built-in exporters

veadk/evaluation/deepeval_evaluator/deepeval_evaluator.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def __init__(
5252
"https://ark.cn-beijing.volces.com/api/v3/",
5353
),
5454
name: str = "veadk_deepeval_evaluator",
55-
prometheus_config: PrometheusPushgatewayConfig = None,
55+
prometheus_config: PrometheusPushgatewayConfig | None = None,
5656
):
5757
super().__init__(agent=agent, name=name)
5858

@@ -73,11 +73,9 @@ async def eval(
7373
eval_id: str = f"test_{formatted_timestamp()}",
7474
):
7575
"""Target to Google ADK, we will use the same evaluation case format as Google ADK."""
76-
for metric in metrics:
77-
if not metric.model:
78-
metric.model = self.judge_model
7976
# Get evaluation data by parsing eval set file
8077
self.generate_eval_data(eval_set_file_path)
78+
8179
# Get actual data by running agent
8280
logger.info("Start to run agent for actual data.")
8381
await self._run_agent_for_actual_data()

veadk/tracing/telemetry/exporters/inmemory_exporter.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,3 @@ def get_processor(self):
8383
self._real_exporter = self._exporter
8484
processor = export.SimpleSpanProcessor(self._exporter)
8585
return processor, None
86-
87-
def get_meter_context(self) -> Any:
88-
return None

veadk/tracing/telemetry/opentelemetry_tracer.py

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

veadk/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,4 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

15-
VERSION = "0.2.0"
15+
VERSION = "0.2.1"

0 commit comments

Comments
 (0)