All three can run at once; they are wired so their own export traffic does not pollute the traces (see §4).
1. LangSmith (LangGraph-native tracing)
LangGraph emits traces to LangSmith automatically when tracing is enabled. Set these inservices/orchestrator/.env (or .env.dev):
universal-object-mapping-translator graph appears in your LangSmith project as a trace tree: extract_input → schema_inspection → generate_translation_node → validate_* → evaluation_node, with each node’s inputs, outputs, token counts, and latency. This is the primary tool for prompt debugging and for spotting which stage dominates a run’s wall-clock time.
2. Pydantic Logfire (OpenTelemetry)
Logfire is configured and active by default inreact_agent/graph.py. It instruments the HTTP clients and the OpenAI-compatible SDK so every outbound model/MCP/sandbox call becomes an OpenTelemetry span:
OTEL_EXPORTER_OTLP_* environment variables at any OTLP-compatible collector (Grafana Tempo, Honeycomb, Jaeger, your own OpenTelemetry Collector) to keep telemetry in your own infrastructure.
The repo also sets OTEL resource attributes so traces are tagged with the source revision:
DAYTONA_OTEL_ENABLED=true / DAYTONA_EXPERIMENTAL_OTEL_ENABLED=true.
3. Langfuse (optional)
Langfuse support is available (thelangfuse dependency is installed) but its LangChain CallbackHandler is commented out by default in graph.py. To enable it, supply credentials and uncomment the handler wiring:
4. Keeping Telemetry Out of the Traces
A subtle but important detail: the tracing backends themselves make HTTP calls (to upload spans). Without care, Logfire’s httpx instrumentation would trace Langfuse’s and LangSmith’s own uploads, creating noisy, recursive spans. UOM excludes those URLs from instrumentation:5. Bring Your Own Backend — Checklist
- Just want graph/prompt traces? Set the four
LANGSMITH_*vars. Nothing else required. - Want OTEL spans in your own collector? Set
LOGFIRE_TOKEN(or configure a bare OTLP exporter) and theOTEL_EXPORTER_OTLP_ENDPOINT. Logfire is already instrumenting the code. - Want self-hosted LLM analytics? Add the
LANGFUSE_*vars and uncomment the handler ingraph.py. - Add a new excluded URL to the
OTEL_PYTHON_*_EXCLUDED_URLSregexes whenever you add an exporter, so its upload traffic does not get traced.
6. Related Reading
DevOps & Deployment
Compose profiles, env configuration, and production operations.
Getting Started
Boot the stack and enable request mocking for local dev.
Architecture
The graph whose spans you are tracing.
Why runs are slow
Use traces to confirm where the ~12 minutes go.