On-call copilot for teams whose pager is louder than their signal. Ruby correlates alerts, deploys and config changes into one confirmed cause, then drafts the rollback while the incident is still open.
p99 latency 2,412 ms > 800 ms for 120 s
pg connections held 187 / 200
queue depth 3,204 > 1,000
write retries 1,190 in 60 s
origin 5xx ratio 4.1%
Deploy 8f2c1a4 raised POOL_MAX_CONSUMERS in pool-router from 24 to 96, so two replicas held 187 of the 200 connections Postgres allows.
origin
queued, not lost
retried to completion
insulated by stale-while-revalidate
12,847 requests affected · 431 checkouts failed · EUR 18,240 at risk
last 30 days, 87 teams
against each team's own 90-day baseline
into 1,204 causes · 7.4 : 1
median · was 11m 20s
Hour 02 is INC-4127. It broke the scale at 41 alerts in nine minutes and still came back as one cause.
Four things, all of them from INC-4127 as it actually happened at Halyard on 22 July.
Ruby diffs every change that landed inside the correlation window and points at the line, not the pull request. Here it read a pool ceiling and knew what the database allows.
Postgres max_connections is 200. Each replica opens two pools, so 96 consumers across two replicas requests 192. Nothing in review expresses that product, which is why this passed.
Proposed steps, your approval, then execution with a hold-time check on the end. Nothing runs unapproved and every step is logged with its timestamp.
Ruby proposed this, Amina Bello approved it at 02:15:58. Nothing runs unapproved.
1. Scale POOL_MAX_CONSUMERS back to 24
02:16:022. Drain pool-router replicas 2 / 2
02:16:443. Verify p99 under 400 ms for 120 s
holding 68 s of 120 sRuby drew this line: a latency breach in Datadog against a merge in GitHub, 41 minutes apart, across 31 connected sources.
Every hold states its reason and every one is reversible. Amina saw five alerts that night instead of forty-one, and the ledger says exactly which thirty-six were kept and why.
Ruby fills the sections it can prove from the incident record: summary, timeline, impact, root cause. It writes prose, with the numbers in it, and it cites the deploy.
What it cannot know it leaves to you and says so. Contributing factors and action items came back marked for a human, because judgement is not in the telemetry.
At 02:11:30 UTC on 22 Jul 2026, deploy 8f2c1a4 raised POOL_MAX_CONSUMERS in pool-router from 24 to 96.
Each replica opens two pools, so the two running replicas requested 192 of the 200 connections Postgres allows; 187 were held at the moment checkout-api began timing out.
p99 checkout latency moved from 218 ms to 2,412 ms over 90 seconds and 431 checkouts failed before the rollback completed at 02:16:44.
The change passed review because the pool ceiling is not expressed anywhere near the database's connection limit, and no test asserts the product of replicas, pools and consumers.
p99 by route for checkout-api since the deploy
Ruby knows which route labels your histograms carry and which service owns them, so a sentence becomes PromQL you can read, edit and keep.
It shows the query it wrote. If it guessed a label wrong you will see that before you trust the number, which is the only way this is useful at two in the morning.
Ruby correlates across 31 sources and writes back to 4 of them. Read access is enough to start; write-back is opt-in per target.
Not on the list? OpenTelemetry ingest and raw webhooks cover anything that can emit an event with a timestamp.
for 3 services
Enough to watch one critical path.
per engineer / month
What on-call rotations of 4 to 40 actually run.
annual, from EUR 24k
For fleets where the collectors cannot leave your VPC.
Billed on engineers in the rotation, not seats in the workspace. Halyard runs 9 engineers on Team and pays EUR 342 a month.
Three services free. Median time from connecting Datadog to a first correlated cause is 4 minutes.