Skip to content

Commit 366573b

Browse files
committed
fix(telemetry): group traces when using agent as tool in an agent
1 parent 6638fb0 commit 366573b

File tree

2 files changed

+22
-21
lines changed

2 files changed

+22
-21
lines changed

src/strands/agent/agent.py

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from concurrent.futures import ThreadPoolExecutor
1717
from typing import Any, AsyncGenerator, AsyncIterator, Callable, Mapping, Optional, Type, TypeVar, Union, cast
1818

19-
from opentelemetry import trace
19+
from opentelemetry import trace as trace_api
2020
from pydantic import BaseModel
2121

2222
from ..event_loop.event_loop import event_loop_cycle, run_tool
@@ -300,7 +300,7 @@ def __init__(
300300

301301
# Initialize tracer instance (no-op if not configured)
302302
self.tracer = get_tracer()
303-
self.trace_span: Optional[trace.Span] = None
303+
self.trace_span: Optional[trace_api.Span] = None
304304

305305
# Initialize agent state management
306306
if state is not None:
@@ -504,23 +504,25 @@ async def stream_async(self, prompt: Union[str, list[ContentBlock]], **kwargs: A
504504
message: Message = {"role": "user", "content": content}
505505

506506
self._start_agent_trace_span(message)
507-
508-
try:
509-
events = self._run_loop(message, invocation_state=kwargs)
510-
async for event in events:
511-
if "callback" in event:
512-
callback_handler(**event["callback"])
513-
yield event["callback"]
514-
515-
result = AgentResult(*event["stop"])
516-
callback_handler(result=result)
517-
yield {"result": result}
518-
519-
self._end_agent_trace_span(response=result)
520-
521-
except Exception as e:
522-
self._end_agent_trace_span(error=e)
523-
raise
507+
if self.trace_span is not None:
508+
span = self.trace_span
509+
with trace_api.use_span(span):
510+
try:
511+
events = self._run_loop(message, invocation_state=kwargs)
512+
async for event in events:
513+
if "callback" in event:
514+
callback_handler(**event["callback"])
515+
yield event["callback"]
516+
517+
result = AgentResult(*event["stop"])
518+
callback_handler(result=result)
519+
yield {"result": result}
520+
521+
self._end_agent_trace_span(response=result)
522+
523+
except Exception as e:
524+
self._end_agent_trace_span(error=e)
525+
raise
524526

525527
async def _run_loop(
526528
self, message: Message, invocation_state: dict[str, Any]
@@ -659,7 +661,6 @@ def _start_agent_trace_span(self, message: Message) -> None:
659661
message: The user message.
660662
"""
661663
model_id = self.model.config.get("model_id") if hasattr(self.model, "config") else None
662-
663664
self.trace_span = self.tracer.start_agent_span(
664665
message=message,
665666
agent_name=self.name,

src/strands/telemetry/tracer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ def start_agent_span(
414414
tools: Optional[list] = None,
415415
custom_trace_attributes: Optional[Mapping[str, AttributeValue]] = None,
416416
**kwargs: Any,
417-
) -> Optional[Span]:
417+
) -> Span:
418418
"""Start a new span for an agent invocation.
419419
420420
Args:

0 commit comments

Comments
 (0)