Skip to main content

Trace Filter Expressions

August 17, 2026 Available in arize-phoenix 20.3.0+ The traces table now takes its own filter expression, joining the span and session filter languages. Filter on a trace’s own fields, on values rolled up from its spans, or on anything inside it with a comprehension — instead of filtering spans and inferring which traces they belong to.
The Traces tab filtered by the expression num_spans > 10 and error_count > 0, showing the matching traces
  • Trace intrinsicstrace_id, start_time, end_time, and latency_ms.
  • Span rollups, never nullnum_spans, error_count, token_count_prompt, token_count_completion, token_count_total, prompt_cost, completion_cost, total_cost, tool_span_count, and llm_span_count all read 0 when there is no matching data.
  • Root-span reach-throughinput, output, attributes["llm.model_name"], metadata["key"], and user.id read the trace’s root span.
  • Comprehensions over what’s inside — iterate spans, trace_annotations, span_annotations, and span_cost_details with any, all, len, max, min, and sum.
  • Topology — a span exposes children, parent_span, and siblings, so parent-child shapes are expressible directly.
  • Strict names — unlike span filters, an unknown name is rejected with a “did you mean” suggestion rather than silently read as an attribute path that matches nothing.
The filter field completes field names by category and inserts working snippets with the loop variable already named, so a comprehension arrives ready to edit rather than ready to type.
Links carrying the old span-level filter still work: opening one on the Traces tab raises a notice that traces now use trace-level filters, and the span filter stays applied on the Spans tab.

Filter Expressions

The full reference for span, trace, and session filters

Read-Only Analytics SQL over MCP

August 13, 2026 Available in arize-phoenix 20.2.0+ Phoenix’s built-in MCP server gains two tools that let an agent answer questions no fixed endpoint anticipates — which model has the worst p95 latency this week, which prompts produce the most retries — with one query instead of paging through spans and aggregating them itself.
  • describeSqlSchema publishes the queryable schema as DDL, with the curation a database cannot supply: which area a table belongs to (telemetry, datasets, experiments), what one row means, how to reach the project, which JSON paths are populated, and — at detail="full" — the running deployment’s expression indexes, read live from the catalog.
  • executeSql runs one read-only statement and returns columns and rows, plus the limits that applied. validate_only=True checks a statement without running it.
  • Bounded by capability, not identity — read-only statements only, 500 rows by default and 5000 at most, byte caps per row and per response, a statement deadline, and a bounded execution queue. Admission is an allowlist over the parsed statement tree, so casing, comments, and nesting cannot smuggle anything past it.
  • Both backends declared, not hidden — SQLite and PostgreSQL are supported, and a refusal names the spelling that works on the backend you’re on (percentile(x, p) on SQLite, percentile_cont(p) WITHIN GROUP (ORDER BY x) on PostgreSQL).
  • Two columns Phoenix addslatency_ms and graphql_node_id are computed per row on both backends; graphql_node_id is the same ID the Phoenix UI and REST API show.
On PostgreSQL:
The tools live on the same /mcp endpoint as the rest of the Phoenix MCP surface, which ships enabled by default. Point any MCP client at it and the tools appear alongside the existing ones.

Remote MCP Server

Connect an MCP client to the Phoenix server’s built-in endpoint

Annotation Details on Hover

August 17, 2026 Available in arize-phoenix 20.3.0+ Hover an annotation token anywhere it appears — spans, traces, and sessions tables included — and Phoenix shows every annotation recorded under that name without leaving the row.
  • Every annotation, not just the summary — score, label, and explanation for each one, with the mean score in the header colored by the config’s optimization direction.
  • Who wrote it — the annotator kind (human or LLM) and the author.
  • Filter from the popover — inline filter chips append the matching condition to the table’s filter, so a suspicious label becomes a filtered table in one press.
  • Reachable without a mouse — the trigger is a button, so keyboard focus and long press open the same popover a hover does.

Annotate Traces

Record and review feedback on spans, traces, and sessions

Approval Decisions on PXI Tool Spans

August 13, 2026 Available in arize-phoenix 20.2.0+ Tool calls that PXI gated behind an approval prompt now record the verdict on the emitted TOOL span as pxi.approval.decision and pxi.approval.source, so you can filter for what a user accepted or rejected instead of fetching every TOOL span and reading its output.
The same expression works in the filter bar above the spans and traces tables. Calls that were cancelled or are still awaiting a decision stay unmarked, so the attribute’s absence is meaningful — consumers can skip them rather than guess.

Also in This Release

August 13 – August 17, 2026 Available in arize-phoenix 20.2.0–20.3.0
  • Dialogs behave the same everywhere — every viewport dialog dismisses from its backdrop, Escape closes the innermost overlay first, and focus returns where it started (arize-phoenix 20.3.0+).
  • The PXI assistant stays reachable while a dialog is open, and pressing its rail never dismisses the dialog underneath (arize-phoenix 20.3.0+).
  • Tooltips no longer swallow clicks aimed at the controls beneath them, and menus keep the page scrollable while open (arize-phoenix 20.3.0+).
  • Refreshed built-in token prices so cost tracking stays accurate for the current model lineup (arize-phoenix 20.2.0+ and 20.2.1+).