At a glance
A dual-axis view that overlays ClickHouse query throughput (queries per second) against the storefront order rate over the same window. In a healthy analytics stack the two lines move together: more shoppers means more events to query, more dashboards refreshed, more order rows scanned. The card exists to catch the moment they diverge. A query-per-second spike with no matching order spike means something is hammering the database that is not real demand: a runaway dashboard auto-refresh, a bot scraping reports, a retry storm, or a misconfigured BI tool polling every few seconds. That phantom load consumes the same connection pool, memory, and merge capacity your real analytics need, so it puts revenue-supporting queries at risk without any revenue to show for it.
Calculation
Two series are computed and overlaid on a shared time axis. ClickHouse QPS is the per-second delta of the cumulativeQuery event counter:
Worked example
A platform team runs ClickHouse as the analytics warehouse behind a Shopify storefront. Marketing dashboards, a finance reporting tool, and an internal “live orders” wallboard all query it. Snapshot of the dual-axis card on 14 Apr 26.
The Nerve Centre headline reads QPS spike with no order spike, 6x normal, outlined red. The DBA reads it as follows:
- Orders are completely unaffected. The order line never left its 18 to 24 band. Whatever drove QPS from 310 to 1,950 sold nothing. That immediately rules out a genuine traffic surge and points at an internal source.
- The shape says “machine, not human”. Human-driven load ramps and decays; this jumped to 1,950 in one bucket and held flat at ~2,000. A perfectly flat plateau is the signature of an automated client polling on a fixed interval: a dashboard stuck in an auto-refresh loop, a BI tool retrying a failed query, or a bot.
- The cost is real even though the revenue is not. During the spike, Connection Pool Saturation % climbed toward 90% and Query Latency p95 (ms) doubled. The finance team’s legitimate month-end report ran slow because a phantom client was eating the pool.
- QPS alone is not a health signal. A high number can be glorious (genuine demand) or wasteful (a bot). The order line is what tells the two apart. Never read QPS without its revenue context.
- Flat plateaus mean automation. Humans create ragged curves; machines create flat lines and clean step changes. The shape of the divergence often names the cause before you open
system.processes. - Phantom load steals from real load. The connection pool, memory, and merge capacity a dashboard storm consumes are the same resources your finance and merchandising queries need. An order-less QPS spike is not free, it is revenue-supporting capacity spent on nothing.
Sibling cards
Reconciling against the source
Where to look in ClickHouse’s own tooling:Read the liveWhy our number may legitimately differ from a manual check:Querycounter and derive QPS yourself inclickhouse-client:See who is generating the load right now insystem.processes, grouped byclient_nameoruser, and confirm the actual statements insystem.query_logover the last 15 minutes. ClickHouse’s built-inSHOW PROCESSLISTgives the same live view in a single command. On ClickHouse Cloud, the samesystem.eventsandsystem.query_logqueries run in the SQL console, and the managed monitoring view plots queries per second over time so you can confirm the spike against the platform’s own chart. For the order side, reconcile against the ecommerce connector’s native admin (Shopify Analytics, BigCommerce Analytics, or Adobe Commerce reports) for orders in the same window.
Cross-connector reconciliation:
Known limitations / FAQs
QPS spiked but orders also spiked. Is that an alert? No, and that is the whole point of the card. When both lines rise together it is genuine, revenue-supporting demand: more shoppers, more events, more dashboards being read about real activity. The card only flags the case where QPS jumps and the order line stays flat. A matched spike is healthy load and should not fire. Why use a 15-minute window? My traffic patterns are slower than that. Fifteen minutes is short enough to catch a sudden phantom spike while still giving the order line meaningful context. Real shopper-driven query and order load track each other over minutes, so a tight window keeps the comparison honest. A longer window would average a sharp two-minute bot burst into the surrounding hour and hide it. If your analytics genuinely move on a slower rhythm, the window is configurable in the Alert Rules tab. Our database serves analytics that have nothing to do with orders. Won’t this card always look divergent? It can, and that is worth knowing before you rely on it. The card assumes query load is broadly correlated with storefront activity, which holds for most ecommerce analytics stacks. If a large share of your QPS comes from order-independent workloads (log analytics, product telemetry, ML feature pipelines), expect a noisier baseline and tune the spike threshold accordingly, or lean on Queries per Second (live) and Connection Pool Saturation % for capacity signals that do not depend on the order reference. How do I tell a dashboard storm from a bot from a retry loop? Look atsystem.query_log for the spike window. A dashboard storm shows many different queries from many BI client names arriving at once (everyone opening their dashboard). A bot or scraper shows one client name repeating a small set of queries on a fixed interval. A retry loop shows the same single query repeated rapidly, often a query that is also appearing in your error or slow-query logs. The query mix usually names the cause before you do anything else.
Can a real flash sale look like a phantom spike?
Briefly, if the order connector lags. During a flash sale, marketing and ops dashboards refresh aggressively to watch it, so QPS can jump a beat before the order series catches up through its polling cycle. The card may flag for one bucket and then clear as orders arrive. A genuine flash sale resolves itself within a cycle; a true phantom spike stays divergent. If in doubt, check whether orders are climbing on the storefront admin even if the card’s order line has not refreshed yet.
The card cleared on its own. Should I still investigate?
Yes, if it recurs. A one-off self-clearing spike (someone left a report open, then closed it) is low priority. A spike that returns at the same time each day, or every time a particular service deploys, is a pattern: an automated client with a bad refresh interval or a leaking poll. Recurring order-less spikes waste capacity continuously even though each one looks harmless in isolation. Cross-reference Connection Pool at >90% Saturation to see whether the recurring spike is also pushing the pool to its limit.