At a glance
CRDB Pool Saturation vs Traffic Burst lays your CockroachDB connection-pool saturation alongside front-of-store traffic, row by row, over a rolling 15-minute window. It answers the one question a DBA cannot answer from the database alone: “is the pool filling up because real shoppers arrived, or because something is leaking sessions?” When saturation climbs in lockstep with a genuine traffic burst, the cluster is doing its job and you scale. When saturation climbs while traffic is flat, you have a connection leak or a runaway client pool, and adding capacity just delays the wall. This is the card that stops a team raising the connection ceiling against a leak.
Calculation
The card joins two independent series on a shared time axis and renders them per bucket:sql.conns gauge; the denominator is the connection ceiling (server.max_connections_per_gateway applied across gateway nodes on self-hosted clusters, or the plan limit on CockroachDB Cloud). The traffic series comes from whichever storefront or analytics connector is linked in the same Nerve Centre profile, normalised to a per-minute rate so the two series share a cadence.
The alert opens only when a saturation breach above 90% coincides with an elevated traffic reading in the same bucket: that pairing is the expected, scalable case and tells the team capacity is the lever. The more interesting signal is the anti-correlation: saturation above 90% with traffic flat. The engine surfaces that row distinctly because it points at a leak or a misbehaving client pool, where raising the ceiling is the wrong move. Each correlated row carries peak saturation, the busiest gateway nodes, and the matching traffic figure so the on-call engineer can size the response in one read.
Worked example
A platform team runs a 5-node CockroachDB self-hosted cluster behind the order and inventory APIs for a high-traffic retailer on Shopify.server.max_connections_per_gateway is 500 across all 5 gateways, giving a 2,500-connection ceiling. The storefront connector feeds live session rate. Snapshot taken on 14 Apr 26 at 20:00 BST, during the opening minutes of a scheduled flash sale.
Saturation and sessions rise together: every percentage point of pool fill is matched by more shoppers arriving. This is the scalable case. The card flags the 20:03 to 20:04 rows as a correlated breach, and the team reads it as “we are genuinely out of headroom because the sale worked”, not “something is broken”.
What the on-call SRE does with this:
- Confirm the correlation is tight. Because saturation tracks traffic almost linearly, this is real demand. Contrast with the alternative below, where the same 94% would mean a leak.
- Scale the right lever. Real demand means widen capacity: raise
server.max_connections_per_gatewayif node memory allows (Memory Usage % is comfortable here), add a gateway node, or, structurally, front the cluster with a connection pooler so app threads multiplex onto a bounded server pool. - Watch the downstream pulse. Cross-read Statement Latency p95 (ms): if it has not moved, the pool is full but not yet hurting users, and you have a few minutes to act cleanly.
Saturation marches to 96% while traffic sits at roughly 240 sessions/min all night. This is not demand; it is a service opening connections and never returning them to its pool. Raising the ceiling here would simply move the wall a few hours later. The fix is to find and restart the leaking client (or fix its pool configuration), confirmed by pairing with Connections In Use showing a flat-traffic climb.
- Saturation alone is ambiguous; saturation paired with traffic is a decision. 94% means “scale” or “find the leak” depending entirely on whether traffic moved with it.
- A correlated breach is a capacity win, not a failure. It means the sale drove real load. Plan capacity ahead of known peaks so you are not scaling reactively at 94%.
- The anti-correlated row is the one to fear. Saturation up, traffic flat, is the leak signature, and it is the case a database-only view would misread as “we need more capacity”.
Sibling cards
Reconciling against the source
Where to look natively:DB Console SQL dashboard (“Open SQL Sessions” panel) for the liveWhy our number may legitimately differ from the native view:sql.connsseries per node, the database side of this card.SELECT count(*) FROM crdb_internal.cluster_sessions;for the exact open-connection count at a moment.SHOW CLUSTER SETTING server.max_connections_per_gateway;to confirm the ceiling the saturation percentage divides by. CockroachDB Cloud Metrics tab plots the same connection series; the cluster Overview shows the plan connection limit. The traffic side has no CockroachDB equivalent: confirm it against your storefront or analytics connector’s own session / request reports.
Cross-connector reconciliation:
Known limitations / FAQs
Saturation hit 94% but the card did not raise the correlated alert. Why? The alert fires on saturation above 90% paired with an elevated traffic reading in the same bucket. If traffic was flat when saturation climbed, the engine surfaces the row as a likely leak rather than a capacity alert, because the correct action is different. Read the traffic column: if it is flat, treat it as a connection leak and pair with Connections In Use. Traffic clearly spiked but saturation barely moved. Is the card broken? No, that is the healthiest possible reading. It means your connection pooler (or a generous ceiling) absorbed the burst without the server-side pool filling. A storefront burst that does not move saturation is the goal; it tells you that you have real headroom for the next, larger peak. Which traffic series does the card use? Whichever storefront or analytics connector is linked in the same Nerve Centre profile: storefront sessions or request rate from Shopify, BigCommerce, or Adobe Commerce, or session rate from Google Analytics. If no front-end connector is linked, the card shows the saturation series alone and cannot classify breaches as demand vs leak; link a storefront connector to unlock the comparison. The two series look offset by a minute near a sharp ramp. Should I worry? No. Saturation and traffic are polled independently and snapped to shared buckets, so during a steep climb one can lead the other by a single bucket before they realign. The shape of the correlation over the 15-minute window is what matters, not a single-bucket offset. On CockroachDB Cloud I cannot setmax_connections_per_gateway. Does the comparison still work?
Yes. On Cloud the connection limit is set by your plan and enforced by the managed proxy; Vortex IQ divides by that plan limit instead of the cluster setting. The traffic pairing is unchanged, so the demand-vs-leak distinction works identically.
A correlated breach fired during a flash sale. Do I need to do anything?
A correlated breach means real demand, so the lever is capacity, not bug-hunting. If Statement Latency p95 (ms) has not climbed, the pool is full but not yet hurting users and you have a short window to widen the ceiling (memory permitting) or add a gateway. The durable answer for recurring peak breaches is a connection pooler in front of the cluster.
Can a single hot gateway create a false leak signal?
The card uses cluster-wide saturation, so a single hot gateway that averages out below 90% will not register at all. If you suspect uneven distribution, check the per-node spread on Connection Pool Saturation % and confirm your load balancer is spreading connections evenly across gateways.