Skip to content

Commit 858b6b7

Browse files
authored
feat: tracer callbacks update (#48)
1 parent d2dcc7e commit 858b6b7

File tree

6 files changed

+71
-13
lines changed

6 files changed

+71
-13
lines changed

tests/test_agent.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ def test_agent():
4949
assert agent.long_term_memory.backend == "local"
5050
assert load_memory in agent.tools
5151

52-
assert tracer.llm_metrics_hook in agent.before_model_callback
53-
assert tracer.token_metrics_hook in agent.after_model_callback
54-
assert tracer.token_metrics_hook in agent.after_model_callback
55-
assert tracer.token_metrics_hook in agent.after_model_callback
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

veadk/agent.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,11 @@ def model_post_init(self, __context: Any) -> None:
118118
if self.tracers:
119119
self.before_model_callback = []
120120
self.after_model_callback = []
121+
self.after_tool_callback = []
121122
for tracer in self.tracers:
122-
self.before_model_callback.append(tracer.llm_metrics_hook)
123-
self.after_model_callback.append(tracer.token_metrics_hook)
123+
self.before_model_callback.append(tracer.tracer_hook_before_model)
124+
self.after_model_callback.append(tracer.tracer_hook_after_model)
125+
self.after_tool_callback.append(tracer.tracer_hook_after_tool)
124126

125127
logger.info(f"Agent `{self.name}` init done.")
126128
logger.debug(
@@ -221,6 +223,9 @@ async def run(
221223
session_service=session_service,
222224
memory_service=self.long_term_memory,
223225
)
226+
if getattr(self, "tracers", None):
227+
for tracer in self.tracers:
228+
tracer.set_app_name(app_name)
224229

225230
logger.info(f"Begin to process prompt {prompt}")
226231
# run

veadk/cli/services/vefaas/template/src/app.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,15 @@
4949
agent.before_model_callback = []
5050
if not getattr(agent, "after_model_callback", None):
5151
agent.after_model_callback = []
52+
if not getattr(agent, "after_tool_callback", None):
53+
agent.after_tool_callback = []
5254
for tracer in TRACERS:
53-
if tracer.llm_metrics_hook not in agent.before_model_callback:
54-
agent.before_model_callback.append(tracer.llm_metrics_hook)
55-
if tracer.token_metrics_hook not in agent.after_model_callback:
56-
agent.after_model_callback.append(tracer.token_metrics_hook)
55+
if tracer.tracer_hook_before_model not in agent.before_model_callback:
56+
agent.before_model_callback.append(tracer.tracer_hook_before_model)
57+
if tracer.tracer_hook_after_model not in agent.after_model_callback:
58+
agent.after_model_callback.append(tracer.tracer_hook_after_model)
59+
if tracer.tracer_hook_after_tool not in agent.after_tool_callback:
60+
agent.after_tool_callback.append(tracer.tracer_hook_after_tool)
5761

5862
# Tracer Config ================================================================
5963
# ==============================================================================

veadk/runner.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ def __init__(
7070
memory_service=self.long_term_memory,
7171
)
7272

73+
if getattr(self.agent, "tracers", None):
74+
for tracers in self.agent.tracers:
75+
tracers.set_app_name(self.app_name)
76+
7377
def _convert_messages(self, messages) -> list:
7478
if isinstance(messages, str):
7579
messages = [types.Content(role="user", parts=[types.Part(text=messages)])]

veadk/tracing/base_tracer.py

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414

1515
import json
1616
from abc import ABC, abstractmethod
17-
from typing import Optional
17+
from typing import Optional, Any
1818

1919
from google.adk.agents.callback_context import CallbackContext
2020
from google.adk.models import LlmRequest, LlmResponse
21+
from google.adk.tools import BaseTool, ToolContext
2122
from opentelemetry import trace
2223

2324
from veadk.utils.logger import get_logger
@@ -27,20 +28,24 @@
2728

2829
class BaseTracer(ABC):
2930
def __init__(self, name: str):
31+
self.app_name = "veadk_app_name"
3032
pass
3133

3234
@abstractmethod
3335
def dump(self) -> str: ...
3436

35-
def llm_metrics_hook(
37+
def tracer_hook_before_model(
3638
self, callback_context: CallbackContext, llm_request: LlmRequest
3739
) -> Optional[LlmResponse]:
40+
"""agent run stage"""
3841
trace.get_tracer("gcp.vertex.agent")
3942
span = trace.get_current_span()
4043
# logger.debug(f"llm_request: {llm_request}")
4144

4245
req = llm_request.model_dump()
4346

47+
app_name = getattr(self, "app_name", "veadk_app")
48+
agent_name = callback_context.agent_name
4449
model_name = req.get("model", "unknown")
4550
max_tokens = (
4651
None
@@ -59,6 +64,8 @@ def llm_metrics_hook(
5964
)
6065

6166
attributes = {}
67+
attributes["agent.name"] = agent_name
68+
attributes["app.name"] = app_name
6269
attributes["gen_ai.system"] = "veadk"
6370
if model_name:
6471
attributes["gen_ai.request.model"] = model_name
@@ -84,9 +91,10 @@ def llm_metrics_hook(
8491
for k, v in attributes.items():
8592
span.set_attribute(k, v)
8693

87-
def token_metrics_hook(
94+
def tracer_hook_after_model(
8895
self, callback_context: CallbackContext, llm_response: LlmResponse
8996
) -> Optional[LlmResponse]:
97+
"""call llm stage"""
9098
trace.get_tracer("gcp.vertex.agent")
9199
span = trace.get_current_span()
92100
# logger.debug(f"llm_response: {llm_response}")
@@ -95,6 +103,10 @@ def token_metrics_hook(
95103
# Refined: collect all attributes, use set_attributes, print for debugging
96104
attributes = {}
97105

106+
app_name = getattr(self, "app_name", "veadk_app")
107+
agent_name = callback_context.agent_name
108+
attributes["agent.name"] = agent_name
109+
attributes["app.name"] = app_name
98110
# prompt
99111
user_content = callback_context.user_content
100112
if getattr(user_content, "role", None):
@@ -170,3 +182,32 @@ def token_metrics_hook(
170182
# Fallback for OpenTelemetry versions without set_attributes
171183
for k, v in attributes.items():
172184
span.set_attribute(k, v)
185+
186+
def tracer_hook_after_tool(
187+
self,
188+
tool: BaseTool,
189+
args: dict[str, Any],
190+
tool_context: ToolContext,
191+
tool_response: dict,
192+
):
193+
trace.get_tracer("gcp.vertex.agent")
194+
span = trace.get_current_span()
195+
agent_name = tool_context.agent_name
196+
tool_name = tool.name
197+
app_name = getattr(self, "app_name", "veadk_app")
198+
attributes = {
199+
"agent.name": agent_name,
200+
"app.name": app_name,
201+
"tool.name": tool_name,
202+
}
203+
204+
# Set all attributes at once if possible, else fallback to individual
205+
if hasattr(span, "set_attributes"):
206+
span.set_attributes(attributes)
207+
else:
208+
# Fallback for OpenTelemetry versions without set_attributes
209+
for k, v in attributes.items():
210+
span.set_attribute(k, v)
211+
212+
def set_app_name(self, app_name):
213+
self.app_name = app_name

veadk/tracing/telemetry/opentelemetry_tracer.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ class OpentelemetryTracer(BaseModel, BaseTracer):
5151
DEFAULT_VEADK_TRACER_NAME, description="The identifier of tracer."
5252
)
5353

54+
app_name: str = Field(
55+
"veadk_app",
56+
description="The identifier of app.",
57+
)
58+
5459
def model_post_init(self, context: Any, /) -> None:
5560
self._processors = []
5661
self._inmemory_exporter: InMemoryExporter = None

0 commit comments

Comments
 (0)