Skip to content

Commit d4c422e

Browse files
RKestcopybara-github
authored andcommitted
chore(telemetry): Remove gen_ai.agent.{request,response}.size metrics
In open-telemetry/semantic-conventions-genai#202 we've decided to remove those metrics as we don't see a use case for them. They can be reevaluated in the future if new use case appears. Co-authored-by: Max Ind <maxind@google.com> PiperOrigin-RevId: 941689939
1 parent e85a7b2 commit d4c422e

7 files changed

Lines changed: 7 additions & 245 deletions

File tree

src/google/adk/telemetry/_instrumentation.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ def record_llm_response(
106106
def _record_agent_metrics(
107107
agent_name: str,
108108
elapsed_s: float,
109-
user_content: object,
110109
events: object,
111110
caught_error: Exception | None,
112111
) -> None:
@@ -116,8 +115,6 @@ def _record_agent_metrics(
116115
elapsed_s,
117116
caught_error,
118117
)
119-
_metrics.record_agent_request_size(agent_name, user_content)
120-
_metrics.record_agent_response_size(agent_name, events)
121118
_metrics.record_agent_workflow_steps(agent_name, events)
122119
except Exception: # pylint: disable=broad-exception-caught
123120
logger.exception("Failed to record agent metrics for agent %s", agent_name)
@@ -145,7 +142,6 @@ async def record_agent_invocation(
145142
_record_agent_metrics(
146143
agent.name,
147144
_metrics.get_elapsed_s(span, start_time),
148-
getattr(ctx, "user_content", None),
149145
getattr(getattr(ctx, "session", None), "events", []),
150146
caught_error,
151147
)

src/google/adk/telemetry/_metrics.py

Lines changed: 0 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from google.adk import version
2222
from google.adk.telemetry import tracing
2323
from google.adk.telemetry._token_usage import TokenUsage
24-
from google.genai import types
2524
from opentelemetry import metrics
2625
from opentelemetry.semconv._incubating.attributes import gen_ai_attributes
2726
from opentelemetry.semconv._incubating.metrics import gen_ai_metrics
@@ -92,48 +91,6 @@
9291
81.92,
9392
],
9493
)
95-
_agent_request_size = meter.create_histogram(
96-
"gen_ai.agent.request.size",
97-
unit="By",
98-
description="Size of agent requests.",
99-
explicit_bucket_boundaries_advisory=[
100-
1,
101-
4,
102-
16,
103-
64,
104-
256,
105-
1024,
106-
4096,
107-
16384,
108-
65536,
109-
262144,
110-
1048576,
111-
4194304,
112-
16777216,
113-
67108864,
114-
],
115-
)
116-
_agent_response_size = meter.create_histogram(
117-
"gen_ai.agent.response.size",
118-
unit="By",
119-
description="Size of agent responses.",
120-
explicit_bucket_boundaries_advisory=[
121-
1,
122-
4,
123-
16,
124-
64,
125-
256,
126-
1024,
127-
4096,
128-
16384,
129-
65536,
130-
262144,
131-
1048576,
132-
4194304,
133-
16777216,
134-
67108864,
135-
],
136-
)
13794
_agent_workflow_steps = meter.create_histogram(
13895
"gen_ai.agent.workflow.steps",
13996
unit="1",
@@ -191,28 +148,6 @@ def record_workflow_invocation_duration(
191148
_workflow_invocation_duration.record(elapsed_s, attributes=attrs)
192149

193150

194-
def record_agent_request_size(
195-
agent_name: str, user_content: types.Content | None
196-
):
197-
"""Records the size of the agent request."""
198-
size = _get_content_size(user_content)
199-
attrs = {gen_ai_attributes.GEN_AI_AGENT_NAME: agent_name}
200-
_agent_request_size.record(size, attributes=attrs)
201-
202-
203-
def record_agent_response_size(agent_name: str, events: list[Event]):
204-
"""Records the size of the agent response by extracting content from events."""
205-
response_content: types.Content | None = None
206-
for event in reversed(events):
207-
if event.author == agent_name and event.content:
208-
response_content = event.content
209-
break
210-
211-
size = _get_content_size(response_content)
212-
attrs = {gen_ai_attributes.GEN_AI_AGENT_NAME: agent_name}
213-
_agent_response_size.record(size, attributes=attrs)
214-
215-
216151
def record_agent_workflow_steps(agent_name: str, events: list[Event]):
217152
"""Records the number of steps in the agent workflow by counting the number of events."""
218153
attrs = {gen_ai_attributes.GEN_AI_AGENT_NAME: agent_name}
@@ -318,20 +253,6 @@ def record_client_token_usage(
318253
_client_token_usage.record(output_token_count, attributes=output_attrs)
319254

320255

321-
def _get_content_size(
322-
content: types.Content | None,
323-
) -> int:
324-
if not content or not content.parts:
325-
return 0
326-
size = 0
327-
for part in content.parts:
328-
if part.text is not None:
329-
size += len(part.text.encode("utf-8"))
330-
if part.inline_data and part.inline_data.data:
331-
size += len(part.inline_data.data)
332-
return size
333-
334-
335256
def _get_provider_name() -> str:
336257
return tracing._guess_gemini_system_name()
337258

tests/unittests/telemetry/functional_node_test_cases.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2597,18 +2597,6 @@
25972597
value=NON_DETERMINISTIC,
25982598
),
25992599
}),
2600-
"gen_ai.agent.request.size": frozenset({
2601-
MetricPoint(
2602-
attributes={"gen_ai.agent.name": AGENT_NAME},
2603-
value=len(USER_PROMPT),
2604-
),
2605-
}),
2606-
"gen_ai.agent.response.size": frozenset({
2607-
MetricPoint(
2608-
attributes={"gen_ai.agent.name": AGENT_NAME},
2609-
value=len(FINAL_TEXT),
2610-
),
2611-
}),
26122600
"gen_ai.agent.workflow.steps": frozenset({
26132601
MetricPoint(attributes={"gen_ai.agent.name": AGENT_NAME}, value=3),
26142602
}),
@@ -2653,18 +2641,6 @@
26532641
value=NON_DETERMINISTIC,
26542642
),
26552643
}),
2656-
"gen_ai.agent.request.size": frozenset({
2657-
MetricPoint(
2658-
attributes={"gen_ai.agent.name": AGENT_NAME},
2659-
value=len(USER_PROMPT),
2660-
),
2661-
}),
2662-
"gen_ai.agent.response.size": frozenset({
2663-
MetricPoint(
2664-
attributes={"gen_ai.agent.name": AGENT_NAME},
2665-
value=len(FINAL_TEXT),
2666-
),
2667-
}),
26682644
"gen_ai.agent.workflow.steps": frozenset({
26692645
MetricPoint(attributes={"gen_ai.agent.name": AGENT_NAME}, value=3),
26702646
}),

tests/unittests/telemetry/functional_test_cases.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2291,18 +2291,6 @@
22912291
value=NON_DETERMINISTIC,
22922292
),
22932293
}),
2294-
"gen_ai.agent.request.size": frozenset({
2295-
MetricPoint(
2296-
attributes={"gen_ai.agent.name": AGENT_NAME},
2297-
value=len(USER_PROMPT),
2298-
),
2299-
}),
2300-
"gen_ai.agent.response.size": frozenset({
2301-
MetricPoint(
2302-
attributes={"gen_ai.agent.name": AGENT_NAME},
2303-
value=len(FINAL_TEXT),
2304-
),
2305-
}),
23062294
"gen_ai.agent.workflow.steps": frozenset({
23072295
MetricPoint(attributes={"gen_ai.agent.name": AGENT_NAME}, value=3),
23082296
}),
@@ -2338,18 +2326,6 @@
23382326
value=NON_DETERMINISTIC,
23392327
),
23402328
}),
2341-
"gen_ai.agent.request.size": frozenset({
2342-
MetricPoint(
2343-
attributes={"gen_ai.agent.name": AGENT_NAME},
2344-
value=len(USER_PROMPT),
2345-
),
2346-
}),
2347-
"gen_ai.agent.response.size": frozenset({
2348-
MetricPoint(
2349-
attributes={"gen_ai.agent.name": AGENT_NAME},
2350-
value=len(FINAL_TEXT),
2351-
),
2352-
}),
23532329
"gen_ai.agent.workflow.steps": frozenset({
23542330
MetricPoint(attributes={"gen_ai.agent.name": AGENT_NAME}, value=3),
23552331
}),

tests/unittests/telemetry/functional_test_helpers.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -314,16 +314,6 @@ class HistogramSpec(NamedTuple):
314314
attr="_tool_execution_duration",
315315
metric_name="gen_ai.execute_tool.duration",
316316
),
317-
HistogramSpec(
318-
module=_metrics,
319-
attr="_agent_request_size",
320-
metric_name="gen_ai.agent.request.size",
321-
),
322-
HistogramSpec(
323-
module=_metrics,
324-
attr="_agent_response_size",
325-
metric_name="gen_ai.agent.response.size",
326-
),
327317
HistogramSpec(
328318
module=_metrics,
329319
attr="_agent_workflow_steps",

tests/unittests/telemetry/test_instrumentation.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,16 +86,16 @@ def test_get_elapsed_s_span_non_int_end():
8686

8787
@pytest.mark.asyncio
8888
async def test_record_agent_invocation_tolerates_minimal_context():
89-
"""Tolerates context-likes that lack user_content or session.
89+
"""Tolerates context-likes that lack session.
9090
9191
Test doubles, partial migrations, and external embedders can pass an
92-
InvocationContext-like object without `user_content` or with a `session`
93-
that has no `events` attribute. The telemetry path must not raise
94-
AttributeError on the metrics call in those cases.
92+
InvocationContext-like object with a `session` that has no `events`
93+
attribute. The telemetry path must not raise AttributeError on the
94+
metrics call in those cases.
9595
"""
9696
agent = mock.MagicMock()
9797
agent.name = "test_agent"
98-
# Bare object without `user_content` and without `session`.
98+
# Bare object without `session`.
9999
bare_ctx = object()
100100

101101
with (
@@ -112,7 +112,6 @@ async def test_record_agent_invocation_tolerates_minimal_context():
112112

113113
mock_record.assert_called_once()
114114
call_args = mock_record.call_args
115-
# positional: (agent_name, elapsed_s, user_content, events, caught_error)
115+
# positional: (agent_name, elapsed_s, events, caught_error)
116116
assert call_args.args[0] == "test_agent"
117-
assert call_args.args[2] is None # user_content default
118-
assert call_args.args[3] == [] # events default
117+
assert call_args.args[2] == [] # events default

0 commit comments

Comments
 (0)