Traces

June 18, 2026 · View on GitHub

title: Traces description: The raw trace stream every other dashboard aggregates from, shown without rollup. Filter by model, status, or conversation, and open any row's Trace Detail.

Traces

Traces dashboard - three filters in header (Model dropdown, Status dropdown, Conv id contains text field), and per-trace rows each showing trace ID, conversation ID, timestamp, provider, model, token counts, duration, span count, with the first row expanded into an inline span timeline

Traces tab - the live raw trace stream. The first row expands inline to a span Gantt (Spring AI advisor chain → model call); clicking the card opens the Trace Detail dialog with the full timeline and raw JSON.

Purpose - the raw trace stream. Every other dashboard tab aggregates from this view; Traces shows it without rollup. The headline operator drill-down for "give me the unfiltered evidence."

When to look here

  • "Show me everything that just happened" - open the tab, watch the live stream.
  • "I have a trace ID from a log line - find it" - Conv id contains filter (conversation id only; for a trace ID, use the Logs tab Jump to trace).
  • "What's in this trace's span tree?" - click any row → Trace Detail dialog.
  • "Filter to a specific model" - Model dropdown.
  • "Find every errored trace" - Status filter → ERROR.

Data source

Reactor ObservabilityRingBuffer.liveStream() (multicast Sinks.Many.directBestEffort()) plus snapshot() on attach. The Traces tab subscribes with sample(500 ms) so dropped frames coalesce silently into the next emission.

Controls

  • Model dropdown - ALL plus distinct model names auto-populated from the ring buffer
  • Status dropdown - ALL, OK, ERROR, CANCELLED
  • Conv id contains text field - substring match on conversation id

The Observability global refresh interval is honored, but Traces also subscribes to the live Sinks.Many stream so new rows appear without polling. The manual refresh button re-applies the filter to a static snapshot.

Row structure

ElementSource
Trace ID (short)TraceRecord.traceId truncated
Conversation badgeTraceRecord.conversationId truncated (e.g. Chat-6af5b06)
TimestampTraceRecord.startEpochMs
Provider · modelgen_ai.system · gen_ai.response.model
TokensinputTokens / outputTokens tok
DurationTraceRecord.durationMs human-formatted
Span countTraceRecord.spans.size()
Status dotGreen / red by TraceRecord.status
Inline span timeline (top row only)Mini Gantt of the spans for quick triage

Drilldown - Trace Detail dialog

Trace Detail dialog - header "Trace <id>", summary grid (Provider, Model, Status, Duration, In tokens, Out tokens, Tools, RAG, Conversation, Finish reason), Timeline section with horizontal Gantt of spans, Spans list with name · duration · status, footer with Open conversation thread / Show raw JSON / Close buttons

Trace Detail dialog - the Timeline section is a Gantt of every span in the TraceRecord; the Spans section lists their attributes inline. "Open conversation thread" routes to the Conversation Thread dialog for the parent conversation.

Click any trace row to open. Provides:

SectionContents
HeaderTrace <traceId-short>
Summary gridProvider · Model · Status · Duration · In/Out tokens · Tools count · RAG flag · Conversation (full ID) · Finish reason
TimelineCustom SpanTimelineCanvas web component rendering each span as a horizontal Gantt bar
Spans list<span name> · <duration ms> · status=<OK/ERROR> plus inline attributes
Open conversation thread buttonNavigates to the Conversation Thread dialog for the parent conversation (sibling drilldown documented below)
Show raw JSON buttonOpens a sub-dialog with the full TraceRecord JSON for the selected trace
Close buttonDismiss

Drilldown - Conversation Thread dialog

Conversation Thread dialog - header "Conversation Chat-...", summary strip (Messages, Conv span, Tokens in/out, Tools), chronological message thread alternating USER / ASSISTANT with per-message footer (date · model · token count · duration), and Continue in chat / Close buttons

Conversation Thread dialog - ConversationMessageExtractor deserialises the trace's prompt and completion content attributes into a structured chronological view. Tool calls (when present) render as inline cards between turns.

A sibling drilldown to Trace Detail. Reached from two entry points:

  • The Conversations grid on the Agentic Chat dashboard - click any conversation row.
  • The Open conversation thread button on the Trace Detail dialog above - drilling from a specific turn back out to the whole conversation it belongs to.

Where Trace Detail is per-turn (one TraceRecord), Conversation Thread is per-conversation (all TraceRecords sharing the same conversationId, reassembled into a chronological user / assistant / tool thread).

Contents

SectionContents
HeaderConversation <conversationId-short>
Summary stripMessages · Conv span · Tokens (in/out) · Tools
Message threadChronological user / assistant / tool messages with per-message footer (date · model · token count). Tool calls render as inline cards between turns.
Continue in chat buttonNavigates to Agentic Chat with the same conversation loaded
Close buttonDismiss

Content capture caveat - message bodies are present only if spring.ai.playground.observability.capture-prompt-content=true (the default). When that property is false, the thread shows roles and counts only - bodies do not flow into the trace stream. See Observability Architecture → Configuration surface for the property reference.

Cross-references