Skip to content

Commit c4b3e59

Browse files
RKestcopybara-github
authored andcommitted
refactor(telemetry): extract invocation span into _instrumentation.record_invocation
Co-authored-by: Max Ind <maxind@google.com> PiperOrigin-RevId: 939850648
1 parent be23327 commit c4b3e59

2 files changed

Lines changed: 32 additions & 2 deletions

File tree

src/google/adk/runners.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
from .sessions.base_session_service import BaseSessionService
5757
from .sessions.base_session_service import GetSessionConfig
5858
from .sessions.session import Session
59+
from .telemetry import _instrumentation
5960
from .telemetry.tracing import tracer
6061
from .tools.base_toolset import BaseToolset
6162
from .utils._debug_output import print_event
@@ -66,6 +67,10 @@
6667

6768
logger = logging.getLogger('google_adk.' + __name__)
6869

70+
# Silence unused warning.
71+
# tracer is imported for backwards compatibility, to avoid breaking change in the API.
72+
_ = tracer
73+
6974

7075
def _find_active_task_isolation_scope(session) -> Optional[str]:
7176
"""Walk session backwards; find the active paused task agent's scope.
@@ -454,7 +459,9 @@ async def _run_node_async(
454459
Events flow through ic._event_queue via NodeRunner.
455460
"""
456461

457-
with tracer.start_as_current_span('invocation'):
462+
with _instrumentation.record_invocation(
463+
entrypoint_node=node or self.agent, conversation_id=session_id
464+
):
458465
# 1. Setup
459466
session = await self._get_or_create_session(
460467
user_id=user_id, session_id=session_id
@@ -1040,7 +1047,9 @@ async def _run_with_trace(
10401047
new_message: Optional[types.Content] = None,
10411048
invocation_id: Optional[str] = None,
10421049
) -> AsyncGenerator[Event, None]:
1043-
with tracer.start_as_current_span('invocation'):
1050+
with _instrumentation.record_invocation(
1051+
entrypoint_node=self.agent, conversation_id=session_id
1052+
):
10441053
session = await self._get_or_create_session(
10451054
user_id=user_id,
10461055
session_id=session_id,

src/google/adk/telemetry/_instrumentation.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import sys
2121
import time
2222
from typing import AsyncIterator
23+
from typing import Iterator
2324
from typing import TYPE_CHECKING
2425

2526
from opentelemetry import trace
@@ -35,6 +36,7 @@
3536
from ..models.llm_request import LlmRequest
3637
from ..models.llm_response import LlmResponse
3738
from ..tools.base_tool import BaseTool
39+
from ..workflow._base_node import BaseNode
3840

3941
logger = logging.getLogger("google_adk." + __name__)
4042

@@ -69,6 +71,25 @@ def _get_elapsed_s(
6971
return time.monotonic() - fallback_start
7072

7173

74+
@contextlib.contextmanager
75+
def record_invocation(
76+
entrypoint_node: BaseNode | None,
77+
conversation_id: str,
78+
) -> Iterator[None]:
79+
"""Top-level ``invocation`` span for a runner invocation.
80+
81+
Args:
82+
entrypoint_node: The runner's root agent/node.
83+
conversation_id: Session/conversation id.
84+
85+
Yields:
86+
Nothing; the span is active for the duration of the block.
87+
"""
88+
del entrypoint_node, conversation_id # Unused until schema v2 lands.
89+
with tracing.tracer.start_as_current_span("invocation"):
90+
yield
91+
92+
7293
@dataclasses.dataclass
7394
class TelemetryContext:
7495
"""Stores all telemetry related state."""

0 commit comments

Comments
 (0)