Observability Dashboard
Use the current overview, session detail, trace explorer, and trace detail screens.
The Observability dashboard helps you move from organization-level health to the exact policy, tool, model, or error span behind an agent operation.
Open Observability
Choose an organization, then open Observability in the dashboard navigation.
The current product has four implemented screens:
- Overview and Sessions
- Session Detail
- Trace Explorer
- Trace Detail
Dedicated policy analytics, token charts, and advanced timeline views are planned. The backend endpoints already expose policy and token aggregates, but the current frontend does not query or render those pages.
Refresh and reporting periods
Every observability query polls over HTTP every 30 seconds. This is not streaming, so data can be up to one polling interval behind after it reaches the backend.
The current Overview and Trace Explorer request a fixed 7-day reporting period. The backend API accepts 1–90 days, but the current UI does not expose a time-range selector.
Traces per minute has different semantics from the other overview metrics:
- Traces per minute uses a trailing 60-minute window, bounded by the requested period.
- Sessions, traces, tokens, cost, latency, and errors use the full requested period, currently 7 days in the UI.
ArmorCodex and ArmorClaude complete turn telemetry at Stop, so a session can look incomplete until the turn ends, shipping completes, and the next 30-second poll runs.
1. Overview and Sessions
Route: /dashboard/observability
Use this screen to answer whether agents are producing telemetry and which sessions were active most recently.
The overview shows:
| Metric | Meaning |
|---|---|
| Traces / min | Recent trace throughput over the trailing window |
| Sessions | Sessions active in the reporting period |
| Traces | Accepted traces in the reporting period |
| Tokens | Input plus output tokens; the hint separates the two |
| Cost | Sum of generation costUsd values |
| p50 latency | Median trace duration |
| p95 latency | 95th-percentile trace duration |
| Errors | Traces whose status is not ok |
The Sessions table includes session ID, agent, product, start time, trace count, input-plus-output tokens, cost, status, and last activity. Select a row to open Session Detail.
Current limitations:
- Overview requests the first 50 sessions.
- The backend returns cursor metadata, but the current screen has no Load more control.
- The page has loading, empty, and retryable error states.
2. Session Detail
Route: /dashboard/observability/sessions/:id
The header shows:
- full session ID and status;
- resolved agent name or raw agent ID;
- product;
- input-plus-output token total;
- cost;
- start time and last activity.
The trace table is chronological and includes time, name, status, latency, tokens, cost, span count, tags, input/output previews, and session ID. Select a trace name to open Trace Detail.
The backend session response includes cache token totals and trace count, although the current header does not display every returned field.
3. Trace Explorer
Route: /dashboard/observability/traces
Use Trace Explorer to find slow, denied, or failing operations across sessions.
Current filters:
- status:
OK,Error, orDenied; - Has error toggle;
- exact trace name;
- minimum duration in milliseconds.
The backend API also supports session, user, and agent filters, but these are not exposed in the current screen.
The trace table includes:
- time and trace name;
- status and latency;
- input/output tokens and cost;
- span and error count;
- tags;
- input and output preview;
- session link.
Current limitations:
- Trace Explorer requests the first 100 traces.
- The backend returns cursor metadata, but the screen has no Load more or infinite-scroll control.
- The name filter is sent as an exact backend match even though the input is labeled as search.
- Filters are local component state and are not preserved in the URL.
4. Trace Detail
Route: /dashboard/observability/traces/:id
The header shows trace name, status, duration, start time, source, product, and a link to the parent session.
Two tabs are implemented:
- Tree shows a selectable span tree and a sticky detail panel.
- Raw shows the complete trace response as formatted JSON.
The detail panel changes by span kind:
| Kind | Details |
|---|---|
policy_call | Decision, policy, matched rule, data classes, enforcement, source, reason, input, and output |
generation | Model, tokens, cost, finish reason, prompt, and completion |
span | Tool name, error, input, and output |
event | Level and message |
Spans are returned flat from the API. The UI builds the visible tree using parentSpanId.
Missing values and zero values
Optional values render as -- only when the API field is absent. Token and cost aggregates returned by the backend are normally numeric and initialized to zero, so the current list and dashboard views cannot reliably distinguish not reported from measured zero.
There is an additional cost limitation: SDKs encode an unknown model price as numeric 0, and the UI formats numeric zero as $0.00. A zero can therefore mean no generation span, pricing unavailable, or a measured zero. Inspect the raw trace for a generation span and check its model and token fields before interpreting the aggregate.
Current versus planned
| Capability | State |
|---|---|
| Overview metrics and recent sessions | Current |
| Session detail and chronological traces | Current |
| Trace filters and trace table | Current |
| Span tree, selected-span detail, raw JSON | Current |
| 30-second polling | Current |
| User-selectable reporting period | Planned |
| Cursor pagination controls in the UI | Planned |
| Dedicated policy pages | Planned; backend aggregate exists |
| Token/cost charts grouped by model, tool, or session | Planned; backend aggregate exists |
| Trace waterfall timeline and advanced tabs | Planned |
| True streaming | Planned |
Next: understand every field, use the read API, or troubleshoot missing data.