How is Dunetrace different from LangSmith or Langfuse?
LangSmith and Langfuse are passive tracing tools — they record what happened so you can inspect it later. Dunetrace is active: it watches the structural pattern of every run and fires a Slack alert within 15 seconds of completion. You don't have to know something broke to open a dashboard. Think of Dunetrace as your alerting layer and Langfuse as your deep-inspection layer. They work well together — get the alert from Dunetrace, then drill into the full trace in Langfuse for root cause analysis.
How much overhead does the SDK add?
Less than 500µs per agent run. Events are buffered in a background thread — your agent is never blocked waiting on Dunetrace. The SDK patches OpenAI, Anthropic, and httpx globally so there is nothing to add to each call site. If the ingest service goes down your agent keeps running unaffected — the SDK buffers up to 10,000 events locally and ships them once it recovers, and the detector worker processes the queued runs on startup, so signals are delayed, not lost.
What frameworks and languages does Dunetrace support?
Python and TypeScript/Node. In Python: first-class support for LangChain, LangGraph, CrewAI, AutoGen, and Haystack. Any other framework works via
@dt.agent() decorator or context manager. FastAPI, Flask, and ASGI/WSGI apps are supported via middleware. The TypeScript SDK (npm install dunetrace) is a full peer of the Python one — auto-instrument OpenAI/Anthropic (including streamed calls) and outbound fetch with autoInstrument(), or wrap individual clients with dt.wrapOpenAI() / dt.wrapAnthropic() and tools with dt.tool(), plus voice hooks and the OpenTelemetry bridge. Zero-code instrumentation is available for any OpenTelemetry-compatible pipeline (Langdock, Dify, OpenLLMetry, etc.) — see the OpenTelemetry guide.
Can Dunetrace monitor voice agents?
Yes. Both SDKs have voice hooks —
transcriptionReceived, ttsGenerated, voiceActivityDetected, turnTaking, and recordingMetadata — that capture a spoken turn end to end alongside the LLM and tool work. Pass a conversationId and every turn rolls up into one call in the dashboard's Calls view, with duration, silence percentage, talk ratio, and per-stage cost (STT / LLM / TTS / telephony). The opt-in Voice detector pack adds nine voice-specific detectors (transcription-confidence drop, silence timeout, turn-taking collision, barge-in failure, TTS truncation, and more).
Can I send agent traces to Datadog, Grafana, or another OpenTelemetry backend?
Yes — Dunetrace speaks OpenTelemetry in both directions. It can export every run as OTLP spans (GenAI semantic conventions) to Datadog, Grafana Tempo, Honeycomb, or Signoz, alongside its own ingest — one env var in Python (
DUNETRACE_OTEL_ENABLED) or the DunetraceOtelExporter in TypeScript. It can also receive: point an existing OTel pipeline (OpenLLMetry, Traceloop, OpenLIT) at Dunetrace and the detectors run on your gen_ai.* spans with no code change. Full setup for both directions is in the OpenTelemetry guide.
Can I query Dunetrace from Claude Code or Cursor?
Yes, via the MCP server (
pip install dunetrace-mcp). It exposes read-only tools to Claude Code, Cursor, Codex, and any MCP-compatible client, so you can ask "is my agent healthy?", "what failed in the last 24 hours?", "how are my voice calls doing?", or "walk me through this run" without leaving your editor. See the MCP server docs.
Can I tune the detector thresholds?
Yes. Edit
detectors.yml in the repo root — no code changes or rebuilds needed. You can set per-agent overrides too. For example, a web-research agent that legitimately repeats queries can have a higher tool-loop threshold than your other agents. Apply changes with docker compose restart detector.
How do I set up Slack alerts?
Add
SLACK_WEBHOOK_URL to your .env file, then restart the alerts worker: docker compose restart alerts. Optionally set SLACK_CHANNEL and SLACK_MIN_SEVERITY to filter noise. Get a webhook URL from api.slack.com/messaging/webhooks. Generic webhooks (PagerDuty, Linear, custom) are also supported — set WEBHOOK_URL instead.
Still have a question? [email protected] or join Discord.