Canary Testing: Write the Abort Criterion First
Canary testing fails when the abort criterion is vague. Learn how to write the signal, threshold, and owner before traffic ever moves.

A release manager at a mid sized fintech company once told me the worst part of her week wasn't the outage. It was the 40 minutes of Slack arguing about whether the outage counted. Error rates had ticked up on the new checkout flow, but only for 3% of users. Half the room wanted to wait and see.
That argument is the whole story of canary testing. Teams adopt canaries because they sound safe. Ship to a sliver of traffic, watch the numbers, roll back if something looks wrong. But "looks wrong" is doing all the work in that sentence. Most teams never pin it down until they're staring at a dashboard mid incident, which is the worst possible time to agree on anything.
This post is about the part of canary testing that actually determines whether it protects you: the abort criterion. Not the percentage of traffic you route. Not the tooling. The single written decision that says what stops the release, and who gets to pull the trigger without asking permission first.
What canary testing actually is
A canary release ships a new version to a small slice of real traffic, usually a single digit percentage. The rest of your users stay on the current version. You compare the two groups on the same metrics, at the same time. If the new version looks worse, you pull it back before everyone sees it.
It's easy to confuse canary testing with two neighboring strategies.
- Blue-green deployment keeps two full environments running and switches all traffic at once. There's no gradual comparison, just an instant cutover you can instantly reverse.
- Feature flags let you turn a feature on or off for chosen users, independent of deployment. The code can already be live everywhere while the behavior itself stays hidden until you flip a switch.
A canary sits between them. It's a deployment technique that happens to give you a live experiment, but only if you decide in advance what you're measuring.
The abort criterion is the actual content of a canary
The routing part of a canary, sending 5% of requests to the new version, is infrastructure work your deployment platform already does. That's not where the thinking goes. The thinking goes into one short document that should exist before the canary starts. It needs four things written down.
- Signal: the exact metric you're watching, like checkout error rate or p95 latency on the payments endpoint, not "how it feels."
- Threshold: the number that triggers a stop, like error rate above 1.5%, not "if it seems high."
- Window: how long the signal has to hold before it counts, like 10 consecutive minutes rather than one noisy spike.
- Owner: a named person, not a team, who can order a rollback without getting sign off first.
Without those four things, a canary is just a slower way to find out you shipped a bug. You'll still argue about whether the bug is bad enough to matter. Except now you're arguing live, with customers already affected.
Here's what that looks like in practice. A checkout team ships a new payment provider integration behind a canary at 5% of traffic. Nobody wrote a threshold beforehand. Fifteen minutes in, error rates on the canary group are running at 2%, versus 0.3% on the control group. One engineer says that's within normal noise for a new integration warming up its connection pool. Another says it's already double what she'd accept. There's no document to settle it, so the canary runs another 20 minutes while they argue, and by the time they roll back, 400 real customers have hit a failed payment.
Why the argument always goes the wrong way once traffic is live
Here's the part that surprises people. A threshold debated while the canary is running is almost always resolved in favor of continuing. It's not because anyone is careless. It's because stopping a release feels like an admission that something is broken, and every person in the room has a reason to wait for one more data point.
The 900 test suite that took 50 minutes to run gave everyone false comfort that the code was already validated. So the instinct is to trust that prior validation over a live signal that hasn't finished its window yet. That's backwards. The test suite told you the code works in a simulated environment. The canary is telling you what's happening to real customers right now.
Contrast that with a team that wrote the criterion the day before: error rate above 1.5% for 10 minutes, owned by whoever is on call. When the graph crosses that line, nobody has to build consensus. The decision was already made, back when nobody's job was on the line for making it. The on call engineer doesn't debate. They roll back, write up what happened, and the retro can argue about the threshold itself, not about whether it's real.
The overlap with release readiness criteria
If your team already writes a release readiness checklist, the abort criterion for a canary is the same artifact, just measured at a different moment. Release readiness asks whether you're allowed to ship, checked before deployment starts. The abort criterion asks whether you're still allowed to keep it live, checked continuously after deployment begins.
Both are decided in advance. Both name a signal and a threshold. Both exist so nobody has to invent judgment under pressure. Teams that already have a habit of writing readiness criteria tend to write good abort criteria too, because it's the same muscle, just aimed at a different window of time. If your team keeps a documented readiness checklist for releases, the canary abort criterion belongs right next to it, not in a separate mental category.
What the platform does and what the team decides
It's worth being honest about the division of labor here. The deployment platform, whether that's a Kubernetes based rollout controller, a cloud provider's traffic manager, or a CD tool, handles the actual routing. It splits traffic, shifts the percentage, and executes the rollback command. That's infrastructure, and it's genuinely automated in most modern setups.
What none of that tooling decides for you is the threshold. Tesbo doesn't perform deployments, route traffic, or monitor production, and no test case management tool should claim to. What a documented test case and readiness checklist can do is make sure the abort criterion was written, reviewed, and attached to the release before anyone touched a traffic slider. The decision exists on paper before it needs to exist in an argument.
Choosing a percentage and a duration without guessing
There's no standard canary percentage or duration. Any post that hands you one is guessing on your behalf. The right numbers come from your traffic volume.
A service handling 2 million requests an hour can find a meaningful signal in 1% of traffic within a few minutes. That's enough volume for the error rate comparison to be statistically believable fast. A service handling 500 requests an hour is a different problem entirely. It might need 25% of traffic and an hour long window just to collect enough data points to trust the comparison at all.
Work backward from how long it takes your signal to become statistically believable. Set your window to that. Then pick a percentage large enough to hit that window without exposing more users than the risk actually justifies. A checkout bug affecting 25% of traffic for an hour is a much bigger incident than the same bug affecting 1% of traffic for ten minutes, so the percentage decision is really a risk decision wearing a traffic number's clothes.
Questions people ask
Is canary testing the same as A/B testing?
They share the mechanic of splitting traffic, but A/B testing usually measures a business or product metric over days or weeks. A canary measures operational health over minutes or hours before a full release.
Who should own the abort decision?
A named individual, usually whoever is on call or the release owner for that deployment, not a group that has to reach consensus in real time.
What happens if the canary passes but a problem shows up later?
That's a sign your signal or window was too narrow. Widen the window, or add a signal that captures slower failure modes, like a memory leak that takes an hour to show up.
Can feature flags replace canary testing?
Not fully. Feature flags control who sees a feature, but a canary controls which version of the deployed code serves a request. That matters for infrastructure level regressions a flag can't catch.
Does Tesbo run or manage canary releases?
No. Tesbo manages documented test cases and readiness criteria. Traffic routing, rollbacks, and production monitoring belong to your deployment platform.
Try Tesbo, or get the next useful idea
Start building your testing workflow now, or get one practical email a month.
Get startedOne email a month
What we shipped, what we learned, and the occasional infographic worth pinning. Unsubscribe in one click.


