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 and Microsoft Agent Framework both produce native ai.agent.invoke and ai.agent.handoff spans. For MAF, handoffs in a HandoffBuilder workflow are detected and synthesized automatically - see Microsoft Agent Framework. LangChain is supported for general tracing (LLM calls, tools, chains), but agent and handoff span detection there requires LangGraph node naming conventions or transfer_to_* tool names. Support for additional frameworks will be added over time. Use manual decoration for any framework not yet covered.
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
- Microsoft Agent Framework — native agent and handoff tracing for MAF
- Conversation Tracing — visualize full multi-turn sessions