Everstack
Getting StartedObservabilitySearch (ESQL)

Search (ESQL)

Filter traces with ESQL, the Everstack Search Query Language.

ESQL (Everstack Search Query Language) is a compact, filter-only language for finding traces. It is not SQL: there is no SELECT, FROM, or JOIN. You describe the runs you want, and Everstack returns them.

The Traces search bar speaks ESQL two ways:

  • Chips — committed filters show as neutral chips you can edit or remove.
  • Editor — the Editor button opens a freeform ESQL editor with syntax highlighting, autocomplete, and a plain-English Matches: description of your query.

Clauses combine with spaces (implicit AND). There is no OR or NOT yet.

Quick examples

failed
status:error provider:anthropic
model:gpt-5.2 cost > 0.05
tool.error exists duration > 30s
tokens.total > 15000 prompt contains "refund"
root.status:error
@campaign:summer tag:prod

Grammar

FormExampleMeaning
Free textcheckout failedFull-text match on input/output
Equalitymodel:gpt-5.2Field equals value
Containsoutput contains "refund"Substring match
Numericcost > 0.05Compare a number (>, >=, <, <=)
Durationduration > 30sUnits: ms, s, m, h
Existencetool.error existsThe condition is present
PresetfailedA saved shorthand (see below)
Metadata@user_id:123Match a metadata key/value
Scoperoot.status:errorRestrict to a span position

Values with spaces use quotes: prompt contains "dietary restriction".

Presets

Presets are one-word shorthands for common questions. They also appear as Lenses at the top of the search menu.

PresetExpands to
failedstatus:error
slowduration > 30s
expensivecost > 0.10
no_outputempty output
tool_errortool.error exists
retrya fallback/retry occurred

Fields

FieldAliasesExample
statusstatus_codestatus:error
modelmodel:gpt-5.2
providerprovider:anthropic
useruser_iduser:u_123
sessionsession_idsession:s_9
threadthread_idthread:t_4
environmentenvenv:production
correlationcorrelation:abc
tagtag:prod
costprice, spendcost > 0.05
durationlatency, duration_msduration > 30s
tokens.totaltokenstokens.total > 15000
ttftttft > 5s
tool.nametool.name:db.fetch
tool.errortool.error exists
cache.hitcache.hit exists
tracetraceIdtrace:8628cf45
agentagentNameagent:researcher
hashas:sandbox
outputoutput contains "..."

Filter by what ran (has:)

has:<span-type> matches traces that contain a span of a given kind — the agent-native filter no request log can offer:

has:sandbox     traces that used a sandbox
has:tool        traces that called a tool
has:agent       traces with an agent span
has:memory      traces that read/wrote memory
has:browser     traces that drove a browser
has:mcp         traces that called an MCP tool
has:voice       traces with voice / audio (TTS/STT) spans
has:vector      traces that hit a vector store / embeddings

Scopes: filter by span position

By default a filter matches a trace that contains any span meeting the condition. Prefix a field to be explicit:

  • any.model:gpt-5.2 — any span used gpt-5.2 (the default).
  • root.status:error — the trace's root span errored.

Agent-shaped filtering

tool.error exists, cache.hit exists, and ttft let you filter on what the agent actually did across its spans -- not just the top-line request. This is the difference between a request log and a trace store.

Saving and reusing queries

Every query you run is recorded under Observability -> Saved Queries, where you can name and pin the ones you reuse. Running a saved query jumps back into Traces with it applied.

Coming soon

  • Boolean OR / NOT.
  • sequence(llm -> tool:error -> llm) — match traces by the ordered shape of the run.
  • Parent/child span relationships.

On this page