Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
fix: add exclude_list to @trace_class on high-frequency event classes
Addresses #1034 — the @trace_class decorator on EventQueue and related classes
generates 1500+ spans per LLM streaming session from high-frequency internal
methods (enqueue_event, dequeue_event, task_done, etc.).

Added exclude_list to @trace_class on:
- EventQueueLegacy: excludes enqueue_event, dequeue_event, task_done, is_closed
- EventQueueSource: excludes enqueue_event, dequeue_event, task_done, is_closed
- EventConsumer: excludes consume_all
- InMemoryQueueManager: excludes add, get, create_or_tap

This reduces tracing spans from 1500+ to ~53 per session (97% reduction) while
preserving useful RequestHandler-level traces. The existing exclude_list
mechanism in trace_class is used — no new API surface or breaking changes.
  • Loading branch information
naveenkumarbaskaran committed May 2, 2026
commit 6ba029c976808c854b234933de7f6142e73f469f
5 changes: 4 additions & 1 deletion src/a2a/server/events/event_consumer.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,10 @@
logger = logging.getLogger(__name__)


@trace_class(kind=SpanKind.SERVER)
@trace_class(
kind=SpanKind.SERVER,
exclude_list=['consume_all'],
)
class EventConsumer:
"""Consumer to read events from the agent event queue."""

Expand Down
5 changes: 4 additions & 1 deletion src/a2a/server/events/event_queue.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,10 @@ async def enqueue_event(self, event: Event) -> None:
"""


@trace_class(kind=SpanKind.SERVER)
@trace_class(
kind=SpanKind.SERVER,
exclude_list=['enqueue_event', 'dequeue_event', 'task_done', 'is_closed'],
)
class EventQueueLegacy(EventQueue):
"""Event queue for A2A responses from agent.

Expand Down
5 changes: 4 additions & 1 deletion src/a2a/server/events/event_queue_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@
logger = logging.getLogger(__name__)


@trace_class(kind=SpanKind.SERVER)
@trace_class(
kind=SpanKind.SERVER,
exclude_list=['enqueue_event', 'dequeue_event', 'task_done', 'is_closed'],
)
class EventQueueSource(EventQueue):
"""The Parent EventQueue.

Expand Down
5 changes: 4 additions & 1 deletion src/a2a/server/events/in_memory_queue_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,10 @@
from a2a.utils.telemetry import SpanKind, trace_class


@trace_class(kind=SpanKind.SERVER)
@trace_class(
kind=SpanKind.SERVER,
exclude_list=['add', 'get', 'create_or_tap'],
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

The tap method is missing from the exclude_list. To be consistent with the exclusion of add, get, and create_or_tap, and to reduce redundant spans for management operations that are already covered by the underlying queue's traces, tap should also be excluded.

Suggested change
exclude_list=['add', 'get', 'create_or_tap'],
exclude_list=['add', 'get', 'tap', 'create_or_tap'],

)
class InMemoryQueueManager(QueueManager):
"""InMemoryQueueManager is used for a single binary management.

Expand Down
Loading