Skip to content

Commit 57e307a

Browse files
feat(tracing): reconstruct tracing module (#93)
* feat(tracing): reconstruct tracing module * update attributions * fix exporter bugs * realize invocation and agent run attributes * fix: fix the bugs in tracing so that it can pass the tests. * update tracing * fix function response * update attributes * fix bugs * update attributes * fix: fix apmplus metrics * fix: remove do hooks of tracer * fix: add license header * fix: fix function_name of metrics * fix: rewrite init meter uploader * update attributes * refine meter uploader * fix attr * add attributes * remove useless class --------- Co-authored-by: hanzhi.421 <hanzhi.421@bytedance.com>
1 parent 31a2c41 commit 57e307a

24 files changed

+1119
-623
lines changed

tests/test_agent.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,3 @@ def test_agent():
4848

4949
assert agent.long_term_memory.backend == "local"
5050
assert load_memory in agent.tools
51-
52-
assert tracer.tracer_hook_before_model in agent.before_model_callback
53-
assert tracer.tracer_hook_after_model in agent.after_model_callback
54-
assert tracer.tracer_hook_after_tool in agent.after_tool_callback

tests/test_tracing.py

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

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

8787
# TODO: Ensure the tracing provider is set correctly after loading SDK
8888

@@ -98,7 +98,7 @@ async def test_tracing_with_global_provider():
9898
#
9999
tracer = OpentelemetryTracer(exporters=exporters)
100100

101-
assert len(tracer.exporters) == 4 # with extra 1 built-in exporters
101+
assert len(tracer.exporters) == 3 # with extra 1 built-in exporters
102102

103103

104104
@pytest.mark.asyncio
@@ -113,4 +113,4 @@ async def test_tracing_with_apmplus_global_provider():
113113
tracer = OpentelemetryTracer(exporters=exporters)
114114

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

veadk/agent.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,6 @@ def model_post_init(self, __context: Any) -> None:
112112

113113
self.tools.append(load_memory)
114114

115-
if self.tracers:
116-
for tracer in self.tracers:
117-
tracer.do_hooks(self)
118-
119115
logger.info(f"{self.__class__.__name__} `{self.name}` init done.")
120116
logger.debug(
121117
f"Agent: {self.model_dump(include={'name', 'model_name', 'model_api_base', 'tools', 'serve_url'})}"
@@ -215,9 +211,6 @@ async def run(
215211
session_service=session_service,
216212
memory_service=self.long_term_memory,
217213
)
218-
if getattr(self, "tracers", None):
219-
for tracer in self.tracers:
220-
tracer.set_app_name(app_name)
221214

222215
logger.info(f"Begin to process prompt {prompt}")
223216
# run

veadk/agents/loop_agent.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
from pydantic import ConfigDict, Field
2020
from typing_extensions import Any
2121

22-
from veadk.agent import Agent
2322
from veadk.prompts.agent_default_prompt import DEFAULT_DESCRIPTION, DEFAULT_INSTRUCTION
2423
from veadk.tracing.base_tracer import BaseTracer
2524
from veadk.utils.logger import get_logger
@@ -50,21 +49,7 @@ class LoopAgent(GoogleADKLoopAgent):
5049
tracers: list[BaseTracer] = []
5150
"""The tracers provided to agent."""
5251

53-
def set_sub_agents_tracer(self, tracer) -> None:
54-
from veadk.agents.parallel_agent import ParallelAgent
55-
from veadk.agents.sequential_agent import SequentialAgent
56-
57-
for sub_agent in self.sub_agents:
58-
if isinstance(sub_agent, Agent):
59-
tracer.do_hooks(sub_agent)
60-
elif isinstance(sub_agent, (SequentialAgent, LoopAgent, ParallelAgent)):
61-
sub_agent.set_sub_agents_tracer(tracer)
62-
6352
def model_post_init(self, __context: Any) -> None:
6453
super().model_post_init(None) # for sub_agents init
6554

66-
if self.tracers:
67-
for tracer in self.tracers:
68-
self.set_sub_agents_tracer(tracer)
69-
7055
logger.info(f"{self.__class__.__name__} `{self.name}` init done.")

veadk/agents/parallel_agent.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
from pydantic import ConfigDict, Field
2020
from typing_extensions import Any
2121

22-
from veadk.agent import Agent
2322
from veadk.prompts.agent_default_prompt import DEFAULT_DESCRIPTION, DEFAULT_INSTRUCTION
2423
from veadk.tracing.base_tracer import BaseTracer
2524
from veadk.utils.logger import get_logger
@@ -50,24 +49,12 @@ class ParallelAgent(GoogleADKParallelAgent):
5049
tracers: list[BaseTracer] = []
5150
"""The tracers provided to agent."""
5251

53-
def set_sub_agents_tracer(self, tracer) -> None:
54-
from veadk.agents.loop_agent import LoopAgent
55-
from veadk.agents.sequential_agent import SequentialAgent
56-
57-
for sub_agent in self.sub_agents:
58-
if isinstance(sub_agent, Agent):
59-
tracer.do_hooks(sub_agent)
60-
elif isinstance(sub_agent, (SequentialAgent, LoopAgent, ParallelAgent)):
61-
sub_agent.set_sub_agents_tracer(tracer)
62-
6352
def model_post_init(self, __context: Any) -> None:
6453
super().model_post_init(None) # for sub_agents init
6554

6655
if self.tracers:
6756
logger.warning(
6857
"Enable tracing in ParallelAgent may cause OpenTelemetry context error. Issue see https://github.com/google/adk-python/issues/1670"
6958
)
70-
for tracer in self.tracers:
71-
self.set_sub_agents_tracer(tracer)
7259

7360
logger.info(f"{self.__class__.__name__} `{self.name}` init done.")

veadk/agents/sequential_agent.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
from pydantic import ConfigDict, Field
2020
from typing_extensions import Any
2121

22-
from veadk.agent import Agent
2322
from veadk.prompts.agent_default_prompt import DEFAULT_DESCRIPTION, DEFAULT_INSTRUCTION
2423
from veadk.tracing.base_tracer import BaseTracer
2524
from veadk.utils.logger import get_logger
@@ -50,21 +49,7 @@ class SequentialAgent(GoogleADKSequentialAgent):
5049
tracers: list[BaseTracer] = []
5150
"""The tracers provided to agent."""
5251

53-
def set_sub_agents_tracer(self, tracer) -> None:
54-
from veadk.agents.loop_agent import LoopAgent
55-
from veadk.agents.parallel_agent import ParallelAgent
56-
57-
for sub_agent in self.sub_agents:
58-
if isinstance(sub_agent, Agent):
59-
tracer.do_hooks(sub_agent)
60-
elif isinstance(sub_agent, (SequentialAgent, LoopAgent, ParallelAgent)):
61-
sub_agent.set_sub_agents_tracer(tracer)
62-
6352
def model_post_init(self, __context: Any) -> None:
6453
super().model_post_init(None) # for sub_agents init
6554

66-
if self.tracers:
67-
for tracer in self.tracers:
68-
self.set_sub_agents_tracer(tracer)
69-
7055
logger.info(f"{self.__class__.__name__} `{self.name}` init done.")

veadk/integrations/ve_faas/template/{{cookiecutter.local_dir_name}}/src/app.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,8 @@ def load_tracer() -> None:
7070
else:
7171
exporters.append(exporter_cls())
7272

73-
tracer = OpentelemetryTracer(
74-
name="veadk_tracer", app_name=agent_run_config.app_name, exporters=exporters
75-
)
73+
tracer = OpentelemetryTracer(name="veadk_tracer", exporters=exporters)
7674
agent_run_config.agent.tracers.extend([tracer])
77-
tracer.do_hooks(agent=agent_run_config.agent)
7875

7976

8077
def build_mcp_run_agent_func() -> Callable:

veadk/runner.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
from veadk.agents.sequential_agent import SequentialAgent
2828
from veadk.evaluation import EvalSetRecorder
2929
from veadk.memory.short_term_memory import ShortTermMemory
30-
from veadk.tracing.base_tracer import UserMessagePlugin
3130
from veadk.types import MediaMessage
3231
from veadk.utils.logger import get_logger
3332
from veadk.utils.misc import read_png_to_bytes
@@ -68,22 +67,9 @@ def __init__(
6867
# prevent VeRemoteAgent has no long-term memory attr
6968
if isinstance(self.agent, Agent):
7069
self.long_term_memory = self.agent.long_term_memory
71-
for tracer in self.agent.tracers:
72-
tracer.set_app_name(self.app_name)
7370
else:
7471
self.long_term_memory = None
7572

76-
# process plugins
77-
try:
78-
# try to detect tracer
79-
_ = self.agent.tracers[0]
80-
if not plugins:
81-
plugins = [UserMessagePlugin(name="user_message_plugin")]
82-
else:
83-
plugins.append(UserMessagePlugin(name="user_message_plugin"))
84-
except Exception:
85-
logger.debug("Agent has no tracers, telemetry plugin not added.")
86-
8773
self.runner = ADKRunner(
8874
app_name=self.app_name,
8975
agent=self.agent,
@@ -187,7 +173,27 @@ async def run(
187173

188174
return final_output
189175

190-
def _print_trace_id(self):
176+
def get_trace_id(self) -> str:
177+
if not isinstance(self.agent, Agent):
178+
logger.warning(
179+
("The agent is not an instance of VeADK Agent, no trace id provided.")
180+
)
181+
return "<unknown_trace_id>"
182+
183+
if not self.agent.tracers:
184+
logger.warning(
185+
"No tracer is configured in the agent, no trace id provided."
186+
)
187+
return "<unknown_trace_id>"
188+
189+
try:
190+
trace_id = self.agent.tracers[0].trace_id # type: ignore
191+
return trace_id
192+
except Exception as e:
193+
logger.warning(f"Get tracer id failed as {e}")
194+
return "<unknown_trace_id>"
195+
196+
def _print_trace_id(self) -> None:
191197
if not isinstance(self.agent, Agent):
192198
logger.warning(
193199
("The agent is not an instance of VeADK Agent, no trace id provided.")
@@ -201,7 +207,7 @@ def _print_trace_id(self):
201207
return
202208

203209
try:
204-
trace_id = self.agent.tracers[0].get_trace_id() # type: ignore
210+
trace_id = self.agent.tracers[0].trace_id # type: ignore
205211
logger.info(f"Trace id: {trace_id}")
206212
except Exception as e:
207213
logger.warning(f"Get tracer id failed as {e}")

0 commit comments

Comments
 (0)