Skip to content

Commit d18a011

Browse files
committed
update attributes
1 parent 24c7f82 commit d18a011

7 files changed

Lines changed: 84 additions & 52 deletions

File tree

veadk/tools/builtin_tools/lark.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ def check_env():
4646
) from e
4747

4848

49-
# check_env()
49+
check_env()
5050

5151
lark_tools = MCPToolset(
5252
connection_params=StdioServerParameters(

veadk/tracing/telemetry/attributes/extractors/common_attributes_extractors.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,20 @@ def common_gen_ai_session_id(**kwargs) -> str:
3131
return session_id or "<unknown_session_id>"
3232

3333

34+
def common_cozeloop_report_source(**kwargs) -> str:
35+
return "veadk"
36+
37+
3438
COMMON_ATTRIBUTES = {
3539
"gen_ai.system": common_gen_ai_system,
3640
"gen_ai.system.version": common_gen_ai_system_version,
3741
"gen_ai.agent.name": common_gen_ai_agent_name,
3842
"gen_ai.app.name": common_gen_ai_app_name, # APMPlus required
3943
"gen_ai.user.id": common_gen_ai_user_id, # APMPlus required
4044
"gen_ai.session.id": common_gen_ai_session_id, # APMPlus required
41-
"app.name": common_gen_ai_app_name, # CozeLoop required
45+
"agent_name": common_gen_ai_agent_name, # CozeLoop required
46+
"app_name": common_gen_ai_app_name, # CozeLoop required
4247
"user.id": common_gen_ai_user_id, # CozeLoop required
4348
"session.id": common_gen_ai_session_id, # CozeLoop required
49+
"cozeloop.report.source": common_cozeloop_report_source, # CozeLoop required
4450
}

veadk/tracing/telemetry/attributes/extractors/llm_attributes_extractors.py

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,12 @@
66
)
77

88

9-
def flatten(d, parent_key="", sep="."):
10-
items = []
11-
if isinstance(d, dict):
12-
for k, v in d.items():
13-
new_key = f"{parent_key}{sep}{k}" if parent_key else k
14-
items.extend(flatten(v, new_key, sep=sep).items())
15-
elif isinstance(d, list):
16-
if not d: # empty list
17-
items.append((parent_key, ""))
18-
else:
19-
for i, v in enumerate(d):
20-
new_key = f"{parent_key}{sep}{i}" if parent_key else str(i)
21-
items.extend(flatten(v, new_key, sep=sep).items())
22-
else:
23-
items.append((parent_key, d))
24-
return dict(items)
25-
26-
279
def llm_gen_ai_request_model(params: LLMAttributesParams) -> ExtractorResponse:
2810
return ExtractorResponse(content=params.llm_request.model or "<unknown_model_name>")
2911

3012

3113
def llm_gen_ai_request_type(params: LLMAttributesParams) -> ExtractorResponse:
32-
return ExtractorResponse(content=type or "<unknown_type>")
14+
return ExtractorResponse(content="chat" or "<unknown_type>")
3315

3416

3517
def llm_gen_ai_response_model(params: LLMAttributesParams) -> ExtractorResponse:

veadk/tracing/telemetry/attributes/extractors/tool_attributes_extractors.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import json
2+
13
from veadk.tracing.telemetry.attributes.extractors.types import (
24
ExtractorResponse,
35
ToolAttributesParams,
@@ -8,6 +10,32 @@ def tool_gen_ai_operation_name(params: ToolAttributesParams) -> ExtractorRespons
810
return ExtractorResponse(content="execute_tool")
911

1012

13+
def tool_gen_ai_tool_message(params: ToolAttributesParams) -> ExtractorResponse:
14+
tool_input = {
15+
"id": "123",
16+
"role": "tool",
17+
"content": json.dumps(
18+
{
19+
"name": params.tool.name,
20+
"description": params.tool.description,
21+
"parameters": params.args,
22+
}
23+
),
24+
}
25+
return ExtractorResponse(type="event", content=tool_input)
26+
27+
28+
# def tool_gen_ai_tool_message(params: ToolAttributesParams) -> ExtractorResponse:
29+
# # tool_output = {
30+
# # "id": params.function_response_event.,
31+
# # "name": ...,
32+
# # "response": ...,
33+
# # }
34+
# print(params.function_response_event)
35+
# # return ExtractorResponse(content=json.dumps(tool_output) or "<unknown_tool_output>")
36+
37+
1138
TOOL_ATTRIBUTES = {
1239
"gen_ai.operation.name": tool_gen_ai_operation_name,
40+
"gen_ai.tool.message": tool_gen_ai_tool_message,
1341
}

veadk/tracing/telemetry/attributes/extractors/types.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212

1313
@dataclass
1414
class ExtractorResponse:
15-
content: Any
15+
content: list | dict | None | str | int | float
1616

1717
type: Literal["attribute", "event"] = "attribute"
1818
"""Type of extractor response.
1919
20-
`raw`: span[...] = raw
21-
`event`: span.add_event(...) = ...
20+
`attribute`: span.add_attribute(attr_name, attr_value)
21+
`event`: span.add_event(...)
2222
"""
2323

2424
@staticmethod
@@ -33,14 +33,16 @@ def update_span(
3333
for k, v in _res.items():
3434
span.set_attribute(k, v)
3535
else:
36-
span.set_attribute(attr_name, res)
36+
# set anyway
37+
span.set_attribute(attr_name, res) # type: ignore
3738
elif response.type == "event":
3839
if isinstance(response.content, dict):
3940
span.add_event(attr_name, response.content)
40-
else: # list
41+
elif isinstance(response.content, list):
4142
for event in response.content:
4243
span.add_event(attr_name, event)
4344
else:
45+
# Unsupported response type, discard it.
4446
pass
4547

4648

veadk/tracing/telemetry/exporters/inmemory_exporter.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,6 @@
2929
logger = get_logger(__name__)
3030

3131

32-
inmemory_span_processor = None
33-
34-
3532
# ======== Adapted from Google ADK ========
3633
class _InMemoryExporter(export.SpanExporter):
3734
def __init__(self) -> None:
@@ -109,6 +106,3 @@ def __init__(self, name: str = "inmemory_exporter") -> None:
109106

110107
self._exporter = _InMemoryExporter()
111108
self.processor = _InMemorySpanProcessor(self._exporter)
112-
113-
global inmemory_span_processor
114-
inmemory_span_processor = self.processor

veadk/tracing/telemetry/telemetry.py

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
LLMAttributesParams,
1515
ToolAttributesParams,
1616
)
17-
from veadk.tracing.telemetry.exporters import inmemory_exporter
1817
from veadk.utils.logger import get_logger
1918

2019
logger = get_logger(__name__)
@@ -23,27 +22,47 @@
2322
def trace_send_data(): ...
2423

2524

26-
def set_common_attributes(current_span: _Span, **kwargs) -> None:
25+
def set_common_attributes(
26+
invocation_context: InvocationContext, current_span: _Span, **kwargs
27+
) -> None:
28+
from veadk.agent import Agent
29+
2730
if current_span.context:
2831
current_span_id = current_span.context.trace_id
29-
30-
spans = inmemory_exporter.inmemory_span_processor.spans
31-
32-
spans_in_current_trace = [
33-
span
34-
for span in spans
35-
if span.context and span.context.trace_id == current_span_id
36-
]
37-
38-
common_attributes = ATTRIBUTES.get("common", {})
39-
for span in spans_in_current_trace:
40-
if span.name.startswith("invocation"):
41-
span.set_attribute("gen_ai.operation.name", "chain")
42-
elif span.name.startswith("agent_run"):
43-
span.set_attribute("gen_ai.operation.name", "agent")
44-
for attr_name, attr_extractor in common_attributes.items():
45-
value = attr_extractor(**kwargs)
46-
span.set_attribute(attr_name, value)
32+
else:
33+
logger.warning(
34+
"Current span context is missing, failed to get `trace_id` to set common attributes."
35+
)
36+
return
37+
38+
if isinstance(invocation_context.agent, Agent):
39+
try:
40+
from veadk.tracing.telemetry.opentelemetry_tracer import OpentelemetryTracer
41+
42+
tracer: OpentelemetryTracer = invocation_context.agent.tracers[0] # type: ignore
43+
spans = tracer._inmemory_exporter.processor.spans # # type: ignore
44+
45+
spans_in_current_trace = [
46+
span
47+
for span in spans
48+
if span.context and span.context.trace_id == current_span_id
49+
]
50+
51+
common_attributes = ATTRIBUTES.get("common", {})
52+
for span in spans_in_current_trace:
53+
if span.name.startswith("invocation"):
54+
span.set_attribute("gen_ai.operation.name", "chain")
55+
elif span.name.startswith("agent_run"):
56+
span.set_attribute("gen_ai.operation.name", "agent")
57+
for attr_name, attr_extractor in common_attributes.items():
58+
value = attr_extractor(**kwargs)
59+
span.set_attribute(attr_name, value)
60+
except Exception as e:
61+
logger.error(f"Failed to set common attributes for spans: {e}")
62+
else:
63+
logger.warning(
64+
"Failed to set common attributes for spans as your agent is not VeADK Agent. Skip this."
65+
)
4766

4867

4968
def trace_tool_call(
@@ -72,6 +91,7 @@ def trace_call_llm(
7291
from veadk.agent import Agent
7392

7493
set_common_attributes(
94+
invocation_context=invocation_context,
7595
current_span=span, # type: ignore
7696
agent_name=invocation_context.agent.name,
7797
user_id=invocation_context.user_id,

0 commit comments

Comments
 (0)