At a glance
Search Latency p99 (ms) is the time below which 99% of search queries complete: only the worst 1% take longer. This is the extreme tail, the experience of your unluckiest shoppers and the canary for cluster stress. p99 is volatile by nature, so it carries a higher 500ms threshold than p95. When p99 spikes while p95 stays calm, a small number of pathological queries are to blame; when p99 and p95 climb together, the whole cluster is under pressure.
Calculation
The two source counters are the same as the other latency cards:query_total (query-phase operations completed) and query_time_in_millis (cumulative query-phase milliseconds), exposed per node in the search index stats. Vortex IQ samples both on each poll, takes consecutive deltas, and assembles the per-shard service times into a distribution across the rolling 5-minute window. The 99th percentile is read from that distribution and reported in milliseconds.
The 99th percentile is far more sensitive to individual slow operations than p95 or p50. A single deep-pagination request, an unbounded wildcard, a cold-cache query after a segment merge, or a GC pause on one node can push p99 up sharply while leaving the median untouched. That sensitivity is the point: p99 is meant to surface the worst case so it can be caught before it spreads. Like its siblings, the value is cluster-wide unless the connector is scoped to a specific index pattern, in which case only those shards contribute, isolating the storefront-facing path from background workloads.
Worked example
The same 6-node cluster behind a high-traffic storefront. Snapshot taken on 22 Apr 26 at 02:10 BST, during an overnight batch reindex.
The p99 card has breached its 500ms threshold, but p95 is still under its own 200ms line and p50 is healthy. This is the classic “tail-only” signature. The team reads it as follows:
- Only the worst 1% is affected. p95 holding at 180ms means 95% of shoppers are fine; the pain is concentrated in a thin tail. With p99 at 740ms against p95 at 180ms, that tail is steep, pointing at a handful of expensive operations rather than a saturated cluster.
- It coincides with the reindex. A nightly batch reindex is running, generating large segment merges. Indexing Rate (docs/sec) is elevated, and merges compete for I/O and heap with search. Cold-cache queries hitting freshly merged segments land in the tail.
- Heap is the multiplier. JVM Heap Used % sits at 78%, above the 75% GC-pressure line, and GC Pause Time (5m total ms) shows 1,200ms of cumulative pause. A 300ms stop-the-world pause lands directly in p99 for any query unlucky enough to overlap it.
Sibling cards
Reconciling against the source
Where to look in Elasticsearch’s own tooling:Why our number may legitimately differ:GET /_nodes/stats/indices/searchfor the rawquery_totalandquery_time_in_milliscounters per node; the lifetime ratio is an average, not a percentile.GET /<index>/_stats/searchfor the same counters scoped to one index pattern. Kibana Stack Monitoring → Overview → Search for the latency series over time, and the search-slowlog for the queries feeding the tail. On Elastic Cloud or AWS OpenSearch Service, the search-latency chart in the cluster monitoring dashboard.
Cross-connector reconciliation: