Why Observability Matters for Agent Systems
Debugging modern agentic systems and distributed applications can be tricky, especially when you’re dealing with asynchronous workflows, multiple services, and custom logic layers. OpenTelemetry offers a powerful way to trace and understand these systems in real time. By instrumenting both the ACP communication and agent logic, you gain visibility into how data flows, how decisions are made, and where bottlenecks or errors might occur. This section demonstrates how to capture and visualize traces using both general-purpose and AI-focused OTLP exporters, so you can debug effectively and with confidence.What is OTLP exporter
In the context of the OpenTelemetry framework, an OTLP exporter acts as both a backend for data collection and a UI for data visualisation. We’ll review options:- Jaeger:General purpose
- Arize Phoenix: Optimized for AI workloads
Jaeger
Jaeger is Open source, distributed tracing platform OpenTelemetry data visualization. This tool has a simple base UI and allows you to see data from all spans (not just limited to agent observability).Run Jaeger
open instance on http://localhost:16686/search in the browser.
Phoenix
Phoenix is an open-source AI observability platform designed for experimentation, evaluation, and troubleshooting by Arize AI.It has its own semantic conventions that all supported frameworks must follow. The advantage is defining more custom attributes for trace’s well-visualization and evaluation. Use Phoenix when your primary focus is agent observability. The main disadvantage is that if the custom data atributes aren’t correctly parsed then phoenix truncates them, making it not possible to debug.
By default, Phoenix runs on port 6006. You can either map this to the standard OTLP port 4318 or update the OTEL_EXPORTER_OTLP_ENDPOINT to point to the correct port.
Run Phoenix
open instance on http://localhost:4318/projects in the browser.
Jaeger Example for System Observability
In this example, we will focus only on the communication between the server and client usingJaeger.
Init the repository
This guide uses
uv. See the uv primer for more details.Define Agent / Client
Defineagent.py, telemetry.py and client.py files:
- agent.py
- telemetry.py
- client.py
configure_telemetry=True in the server.run function of the agent.py file.
Run the server
Run the client
Debug it
Openhttp://localhost:16686/search in your browser, select acp-client in the Service input on the left menu and click on the Find Traces button.
You should see your first trace. When you click on the trace, you should see the following details:
Phonexix Example for Agent Observability
In this section, we will set up observability for the agents themselves usingPhoenix.
LangGraph Agent
Init repository
Define Agent / Client
Defineagent.py, telemetry.py and client.py files:
- agent.py
- telemetry.py
- client.py
LangChainInstrumentor().instrument() line when we turn on the LangChain instrumentation (LangGraph included) in the agent.py file.
Run the server
Run the client
Debug it
Openhttp://localhost:4318/projects in your browser and choose the default project.
You should see your first trace called session. When you click on the trace, you should see these details:
