At a glance
An alert card that fires when the share of search requests returning an error climbs above 1% and stays there for 5 minutes. This is the storefront-facing failure signal: when search errors spike, real users are getting empty or broken search result pages right now. A 1% error rate sounds small, but on a busy catalogue it means hundreds of failed searches an hour, and search is often the highest-intent path on an ecommerce site. The card answers one question directly: are shoppers’ searches failing, and how badly?
Calculation
The error rate is failed searches divided by total searches over the rolling 5-minute window, expressed as a percentage:total_search_requests is the delta of indices.search.query_total across the window. failed_search_requests is the sum of:
- Shard failures: a request where one or more shards returned an error or were unavailable (the
_shards.failedcount in responses, reflected in node stats). On a red or recovering cluster these climb because the missing shard cannot answer. - Thread-pool rejections: the delta of
thread_pool.search.rejected. When the search queue is full, Elasticsearch returns 429 and the request is rejected, not queued forever. - Circuit-breaking exceptions: a request rejected because answering it would exceed a memory breaker limit.
- Timeouts and 5xx: requests that exceeded their timeout or failed at the HTTP layer.
Worked example
A platform team runs Elasticsearch behind the search bar of a fashion retailer doing roughly 40 searches per second at peak. Snapshot taken on 19 Apr 26 at 12:05 BST, during the lunchtime traffic peak. A marketing email went out at 12:00 driving a burst of traffic. The search thread pool, sized for normal load, started rejecting requests once its queue filled. Over the 5-minute window the engine sees:
The Nerve Centre headline reads Search Error Rate 3.0%, sustained 6m, 360 pool rejections, outlined in red, and the on-call engineer is paged. The card tells the story cleanly:
- Shoppers are getting failed searches right now. 372 failures across the window means roughly 1.2 failed searches every second during the email burst. Each one is a shopper who searched and got an error page instead of products. On the highest-intent path on the site.
- The cause is rejections, not bad data. Shard failures are zero, so the cluster is healthy and the data is intact. The 360 rejections are the search thread pool saying “my queue is full”. Pair with HTTP Connection Saturation %, which will be high during the burst, and with Search Queries per Second (live), which spiked at 12:00.
- This is a capacity-vs-burst problem, not a correctness problem. The fix is not to debug a query; it is to absorb the burst: scale out search capacity, add a coordinating node, or put a short client-side retry-with-backoff in front of search so a rejected request is retried a moment later when the queue drains.
Sibling cards
Reconciling against the source
Where to look in Elasticsearch’s own tooling:On a managed service, AWS OpenSearch Service / managed offerings exposeGET /_nodes/stats/indices/searchreturnsquery_totalandquery_time_in_millis; the deltas give the denominator.GET /_nodes/stats/thread_poolreturns the search pool’srejected,queue, andcompletedcounters, the main source of capacity-driven errors.GET /_cat/thread_pool/search?v&h=node_name,active,queue,rejectedgives a quick per-node rejection table. Per-request, the_shards.failedfield in a search response and thefailuresarray name the exact shard errors; the slowlog and node logs recordCircuitBreakingExceptionandEsRejectedExecutionExceptionentries.
SearchRate, ThreadpoolSearchRejected, and 5xx request metrics in CloudWatch; Elastic Cloud surfaces search throughput and rejection counts in the deployment monitoring view. The managed ThreadpoolSearchRejected metric maps directly to the rejection component of this card.
Why our number may legitimately differ from a manual stats call:
Known limitations / FAQs
Do zero-result searches count as errors? No. A search that matches nothing is a successful request that returned an empty result set; the shopper may be disappointed but Elasticsearch did its job. Only genuine failures (shard failures, rejections, breaker exceptions, timeouts, 5xx) count toward the error rate. If you want to track empty-result searches as a relevance problem, that is a separate concern from this operational alert. Why is 1% the threshold? That seems strict. Search is the highest-intent path on most stores, so even a small failure rate is disproportionately costly: a shopper who searches has already decided to buy something. On a catalogue doing 40 searches per second, 1% is roughly 1,440 failed searches an hour. The 1% line is deliberately tight because every failed search is a near-miss conversion. You can adjust the threshold per profile if your baseline is genuinely noisier. The error rate spiked but the cluster is green. How can that be? A green cluster means all shards are allocated, but it says nothing about capacity. The most common green-cluster error spike is thread-pool rejection: a traffic burst fills the search queue and Elasticsearch returns 429 to protect itself. The data is fine; you simply ran out of capacity to serve the burst. Check HTTP Connection Saturation % and the search-poolrejected counter.
How do I tell a capacity problem from a correctness problem?
Read the failure mix. Rejections (429) dominating means capacity versus burst, scale out or add retry-with-backoff. Shard failures dominating means a cluster-health problem, check Cluster Status and Unassigned Shards. Circuit-breaking exceptions dominating means memory pressure, check JVM Heap Used %. The headline is the same 1%+, but the cause and fix differ entirely.
My client retries failed searches automatically. Does that inflate the error rate?
It can. If the client retries a rejected request, each attempt is a separate request and a rejected attempt counts as a failure, so an aggressive retry loop can multiply the apparent error count while the user eventually succeeds. This is usually still a true signal (the cluster genuinely could not serve the first attempt), but if you see a much higher error rate than your users report as broken, an over-eager retry policy is the likely reason. Retry-with-backoff (not immediate retry) keeps the signal honest and is gentler on the cluster.
Does this card cover indexing errors too, or only search?
Only search. Indexing failures and bulk rejections are tracked separately by Bulk Rejections (24h) because they have different causes (write backpressure) and different consequences (data not yet searchable, rather than a user seeing a broken result page). Keeping read and write errors on separate cards avoids conflating a sync-pipeline problem with a storefront-search problem.
The rate is just under 1% and never quite pages, but searches are clearly failing. What do I do?
Lower the threshold for your profile in the Alert Rules tab. The 1% default suits a typical store, but if your baseline error rate is normally near zero, a sustained 0.5% is already abnormal for you and worth paging on. Tune the threshold to your own baseline rather than the generic default, and pair it with the Search Error Rate % gauge to watch the sub-threshold trend.