OpenTelemetry Tracing
docker-agent can export OpenTelemetry traces of an agent run to any OTLP/HTTP backend. This is separate from product-analytics telemetry and is opt-in via the --otel flag.
When enabled, docker-agent emits OpenTelemetry GenAI (gen_ai.*) and MCP (mcp.*) spans following the OpenTelemetry semantic conventions. Spans cover the agent turn, model calls (with token usage and cost attributes), tool calls, MCP client/server activity, sub-agent hand-offs, and provider fallbacks. W3C traceparent context is propagated so the whole run renders as a single connected trace tree.
Enabling
docker agent run agent.yaml --otel
Without an exporter endpoint configured, spans are recorded locally as no-ops. To ship them somewhere, set the standard OTLP environment variables described below.
Configuration
docker-agent reads the standard OTLP environment variables:
| Variable | Purpose |
|---|---|
OTEL_EXPORTER_OTLP_ENDPOINT |
Base OTLP/HTTP endpoint. The signal subpath (/v1/traces, /v1/metrics, /v1/logs) is appended automatically. |
OTEL_EXPORTER_OTLP_HEADERS |
Comma-separated key=value headers sent with every export request (for example, an Authorization header). |
OTEL_RESOURCE_ATTRIBUTES |
Extra resource attributes merged into every span. |
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT |
Set to true to capture prompt and response message content as span attributes. Off by default. |
[!NOTE] Base endpoint, not the full signal URL
Set
OTEL_EXPORTER_OTLP_ENDPOINTto the base endpoint (for examplehttps://cloud.langfuse.com/api/public/otel). docker-agent appends/v1/tracesfor you, matching the value documented by Langfuse and LangSmith. A barehost:portis also accepted and getshttps://(orhttp://for localhost).
[!WARNING] Message content can contain sensitive data
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENTis off by default because chat history routinely contains PII, secrets, and internal documents. Enable it only for backends and environments where exporting that content is acceptable.
Backends
Protocol support is OTLP over HTTP (http/protobuf). gRPC endpoints are not currently supported.
Langfuse
Langfuse exposes an OTLP endpoint and authenticates with HTTP Basic auth built from a project’s public and secret keys.
# Base64 of "public_key:secret_key"
LANGFUSE_AUTH=$(echo -n "pk-lf-...:sk-lf-..." | base64)
export OTEL_EXPORTER_OTLP_ENDPOINT="https://cloud.langfuse.com/api/public/otel"
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Basic ${LANGFUSE_AUTH}"
docker agent run agent.yaml --otel
Regional and self-hosted hosts use the same /api/public/otel base path:
| Region | Endpoint |
|---|---|
| EU | https://cloud.langfuse.com/api/public/otel |
| US | https://us.cloud.langfuse.com/api/public/otel |
| Self-hosted (>= v3.22.0) | http://localhost:3000/api/public/otel |
LangSmith
LangSmith authenticates with an x-api-key header (the raw API key, with no Basic/Bearer prefix). An optional Langsmith-Project header routes traces to a named project.
export OTEL_EXPORTER_OTLP_ENDPOINT="https://api.smith.langchain.com/otel"
export OTEL_EXPORTER_OTLP_HEADERS="x-api-key=<your-api-key>,Langsmith-Project=<project>"
docker agent run agent.yaml --otel
OpenTelemetry Collector
Any OTLP/HTTP collector (the OpenTelemetry Collector, Grafana Alloy, Jaeger, and so on) works by pointing at its base endpoint:
export OTEL_EXPORTER_OTLP_ENDPOINT="http://localhost:4318"
docker agent run agent.yaml --otel
[!NOTE] Langfuse and LangSmith ingest traces only
Both backends accept the traces signal only. docker-agent also wires metric and log exporters at the same endpoint, so their periodic exports return
404against trace-only backends. This is harmless to traces but appears in the debug log. Point a full OTLP collector at the endpoint if you also want metrics and logs.
Inspecting traces locally
Use --debug to print telemetry activity to the debug log (~/.cagent/cagent.debug.log by default) without standing up a backend:
docker agent run agent.yaml --otel --debug