Multi-Agent Tracing
Multi-agent tracing captures how agents in a system interact — which agent ran, what it received and produced, and when control passed from one agent to another. Each agent becomes a distinct span in the trace, with handoffs recorded as first-class events.
There are two ways to instrument a multi-agent system: auto-instrumentation (zero-config for supported frameworks) and manual decoration (works with any framework or custom code).
Auto-Instrumentation
For supported frameworks, auto_instrument() handles all span creation automatically — no decorator changes required.
LangGraph
With LangGraph auto-instrumentation, every graph.invoke(), graph.ainvoke(), graph.stream(), and graph.astream() call is traced automatically. Nodes are classified as agents based on their name.
A node is treated as an agent if its name contains one of these keywords (case-insensitive):
| Keyword | Example node name |
|---|---|
agent | research_agent, agent_node |
specialist | billing_specialist |
orchestrator | main_orchestrator |
coordinator | task_coordinator |
supervisor | supervisor |
Nodes that don’t match are traced as regular spans. To explicitly mark a node, set agent_name or is_agent in the invocation metadata:
Agent name resolution
The agent name on each ai.agent.invoke span is resolved with this priority order. The first source that produces a value wins:
metadata.agent_name— explicit override passed in the invocation config.metadata.langgraph_node— set automatically by LangGraph for each node.serialized.name— provided by the framework when available.- Last segment of
serialized.id— falls back to the class path (for exampleChatGoogleGenerativeAI). "unknown"— when none of the above is set.
Handoff detection
Handoffs are detected automatically in two ways:
transfer_to_*tools — any tool whose name starts withtransfer_to_creates anai.agent.handoffspan. Detection runs in the LangChain callback’s tool path, so it works for any LangChain-based system (including LangGraph and the LangGraph prebuilt agents that emit these tools), not just LangGraph specifically.- Sequential transitions — when one agent ends and a different agent starts, a handoff span is created between them.
More Frameworks
LangGraph is currently the only framework with native ai.agent.invoke and ai.agent.handoff span support out of the box (it benefits from the agent-name keywords, langgraph_node metadata, and transfer_to_* tool detection described above). LangChain itself is auto-instrumented for general tracing — LLM calls, tools, chains — but agent and handoff spans only appear when one of the agent signals above is present.
For every other framework (CrewAI, OpenAI Agents SDK, LlamaIndex, AutoGen, …), use manual decoration below: wrap the agent functions with @observe(span_name=AIOperationType.AGENT_INVOKE, ...) and they will produce the same span shape.
Manual Decoration
Use @observe with the ai.agent.invoke span name to instrument any agent function, regardless of how it’s built:
Recording Handoffs
To explicitly record when one agent hands off to another, create a handoff span around the transition:
Full Manual Example
Trace Visualization
The Graph View in Rhesis renders agents, tools, and handoffs as nodes and edges, with turn markers for multi-turn conversations:
Span Reference
ai.agent.invoke
| Attribute | Key | Description |
|---|---|---|
| Operation type | ai.operation.type | agent.invoke |
| Agent name | ai.agent.name | Agent identifier |
| Event: input | ai.agent.input | Agent input |
| Event: output | ai.agent.output | Agent output |
ai.agent.handoff
| Attribute | Key | Description |
|---|---|---|
| Operation type | ai.operation.type | agent.handoff |
| From agent | ai.agent.handoff.from | Agent initiating the handoff |
| To agent | ai.agent.handoff.to | Agent receiving control |
See Semantic Conventions for the full attribute reference.
Related:
- Decorators —
@observeand@endpoint - Auto-Instrumentation — zero-config tracing for LangChain and LangGraph
- Conversation Tracing — visualize full multi-turn sessions