OXY_OBSERVABILITY_BACKEND— turns span capture on. Set it toclickhouse, the only supported backend, and Oxygen starts writing traces there. No capture happens if it’s unset.--enterprise— mounts the observability UI and API routes (the Traces / Metrics / Execution Analytics pages and their/api/*endpoints). Without it, traces are still captured (if the backend is set) but are only reachable via direct DB access.
Enabling observability
SetOXY_OBSERVABILITY_BACKEND=clickhouse, point Oxygen at a ClickHouse instance, then start the server with --enterprise to expose the UI.
oxy start boots an oxy-clickhouse container for you and points the connection at it — the backend variable is all you need to set:
http://localhost:3000/ide/observability/traces to see traces. Run an agent or workflow and the corresponding trace appears within a second or two.
The backend
ClickHouse is the sole observability backend, and there is no default in any mode — capture is opt-in everywhere, including--local.
Trace data is a columnar, append-heavy workload with fixed query shapes and TTL-based retention, and the store has to stay up precisely when the rest of the system is misbehaving — that is what it is there to debug. ClickHouse matches that shape and isolates a bad query to the query itself. Earlier releases also offered
duckdb, postgres, and airhouse backends; those were removed. Setting one of their names no longer falls back to anything — the server starts with observability off and prints a message telling you to migrate. Trace data is not carried across from them.--enterprise but don’t set OXY_OBSERVABILITY_BACKEND, the Traces page renders a “not configured” banner and nothing is recorded. The server also prints a warning on startup.
What’s recorded
Oxygen emits spans for the major execution boundaries:
Each span carries attributes like the agent name, model, execution status, and error messages if any. Nested spans are stitched into a waterfall view in the Trace Detail page so you can see where time was spent.
Environment variables
Retention
Trace data is automatically pruned after 90 days. Retention is derived from the longest time-window the Traces UI exposes, so the UI and the retention policy always agree. The policy is applied at the engine level viaALTER TABLE ... MODIFY TTL on schema init, so expiration is handled by ClickHouse’s own background merges — there is no pruning job to schedule or monitor.
No traces showing up?
- Confirm the server was started with
--enterprise. - Confirm
OXY_OBSERVABILITY_BACKEND=clickhouseis set — it has no default, in any mode. Check the startup output for a line likeObservability: clickhouse (...). - If the Traces page shows a “not configured” banner, the backend env var wasn’t set when the server started.
OXY_LOG_LEVELdoes not affect what is recorded. Traces are captured even atwarn.- If startup printed a message about a removed backend, you’re carrying a
duckdb,postgres, orairhousevalue from an older release — switch it toclickhouse. - Check
docker logs oxy-clickhouse(if usingoxy start) or your external instance’s logs for connection or schema errors.