Deployment Verification Testing
Deployment verification is the testing done on an environment immediately after a new version is deployed to it, to confirm that the deployment worked and the new version behaves as expected with real configuration, real infrastructure and, in production, real traffic. Pre-release testing proves the build is good; deployment verification proves this deployment of it is good. They fail for different reasons — a missing environment variable, an unapplied migration, a wrong certificate, a load balancer still pointing at the old version — and none of those show up in a staging test run.
This guide walks through the work in the order it happens: writing the verification plan and rollback criteria before deploying, running post-deployment smoke tests, keeping synthetic checks running afterwards, verifying progressive rollouts such as canary releases and feature flags, reading monitoring signals, and validating a rollback — including the database migrations that can make rollback hard.
What deployment verification covers
A deployment changes more than code. It changes container images, configuration, secrets, database schema, infrastructure and routing, often in one step. Deployment verification checks the result of all of these together, in the target environment, with the question: is the new version running, correctly configured, reachable, and behaving at least as well as the previous one?
It helps to separate deploying from releasing. Deploying puts new code on servers; releasing exposes new behaviour to users. Techniques such as canary releases, blue-green switching and feature flags exist to separate the two, so a team can verify a deployment with little or no user exposure before releasing. The smoke suite is the same one described in the guide on smoke, sanity and regression testing, now pointed at the freshly deployed environment.
- Version check — the environment serves the version that was meant to be deployed, on every instance.
- Health and dependencies — services are up and can reach their databases, queues, caches and third parties.
- Critical paths — login, the main business transaction and its API respond correctly.
- Configuration and security — correct URLs, certificates, redirects and security headers; no debug mode.
- Behaviour under real traffic — errors, latency and business metrics comparable with the previous version.
Decide success and rollback criteria before you deploy
The most important part of deployment verification happens before the deployment: writing down what “good” looks like and what will trigger a rollback. Criteria decided during an incident are decided under pressure, by whoever is awake, with a strong bias towards “give it five more minutes”. Criteria decided in advance turn the rollback into a routine step instead of an argument.
A plan fits on one page. It names the rollout steps, the people on call, the signals and thresholds that define success, the conditions under which the team rolls back without discussion, how the rollback is done and how it will be verified. The example below is for a service deployed as a canary; the thresholds are illustrations, and your own should come from the service’s normal baseline.
Release verification plan: orders-service 5.9.0 (example)
Deployment: canary 5% -> 25% -> 100%, 15 min per step; flag new_checkout OFF at deploy
People: release engineer + tester on call (named in the release ticket)
Before: backup confirmed; migration 0042 is additive only (expand step)
Post-deploy smoke: smoke.sh against the canary, then against the production URL
Success signals, canary compared with baseline, at every step:
- HTTP 5xx rate <= baseline + 0.5 percentage points
- p95 latency <= baseline x 1.2
- checkout conversion within 10% of baseline (same window)
- no new error signatures in the logs
Rollback criteria (any one => roll back, no debate):
- smoke failure on canary or production
- 5xx rate above 2% for 5 consecutive minutes
- payment failures above baseline x 2
- data integrity alert (duplicate or missing orders)
Rollback method: redeploy image 5.8.3; new_checkout stays OFF; migration 0042 is kept (additive)
Rollback verified: smoke.sh passes and /version reports 5.8.3 on every instance
Done when: 100% of traffic for 1 hour with all signals green- 1Plan written before deployingSuccess signals, rollback criteria, release engineer + tester on call; backup confirmed; migration 0042 additive onlyBefore
- 2Deploy 5.9.0Flag
new_checkoutOFF at deploy - 3Post-deploy smoke
smoke.shagainst the canary, then against the production URLBranch: Smoke failure on either → roll backFail
- 4Canary 5%15 minutes
Branch: Any one rollback criterion → roll backFail
Gate: All success signals green, compared with the baseline
- 525% of traffic15 minutes
Branch: Any one rollback criterion → roll backFail
Gate: All success signals green, compared with the baseline
- 6100% of trafficWatched for 1 hour against the same signals
Branch: Any one rollback criterion → roll backFail
Throughout steps 4–6 Success signals: 5xx ≤ baseline + 0.5 percentage points, p95 ≤ baseline × 1.2, checkout conversion within 10% of baseline (same window), no new error signatures
Then:Done: 100% of traffic for 1 hour with all signals green
- Rollback criteria: any one → roll back, no debateSmoke failure; 5xx above 2% for 5 consecutive minutes; payment failures above baseline × 2; data integrity alert (duplicate or missing orders)
- Rollback: redeploy image 5.8.3
new_checkoutstays OFF, migration 0042 is kept; verified whensmoke.shpasses and/versionreports 5.8.3 on every instance
Example plan for orders-service 5.9.0: the thresholds are illustrations; derive yours from your service’s normal baseline.
Post-deployment smoke tests
Run the smoke suite as the last step of the deployment job, against the environment just deployed, and make the pipeline fail if it fails. Keep it short (a few minutes), independent of test data that may not exist in production, and safe to run against production: read-only calls, or writes made with a dedicated test account whose data is excluded from reports and billing. Check negative behaviour too — a protected endpoint that suddenly returns 200 without a token is a deployment defect.
The script below is an example of the simplest useful form: HTTP checks with explicit expected status codes and a version check. Most teams later move the same checks into their API or UI test framework so that results are published in the same report format as other tests.
- Hit every instance or region if you can, not just the load balancer — a single stale instance is a classic partial-deployment defect.
- Bypass caches for at least one check; a CDN can serve a healthy-looking cached page while the origin returns errors.
- Make the health endpoint meaningful: it should report dependency status, not just return 200 because the process is alive.
- Check security headers, TLS and redirects after infrastructure changes; they are configured outside the code and are easy to lose.
#!/usr/bin/env bash
# Example post-deployment smoke script. Usage: ./smoke.sh https://staging.example.com
set -euo pipefail
BASE_URL="$1"
EXPECTED_VERSION="${EXPECTED_VERSION:-}"
check() { # name, path, expected HTTP status
local name="$1" path="$2" expected="$3" status
status=$(curl -s -o /dev/null -w '%{http_code}' --max-time 10 "$BASE_URL$path" || true)
if [ "$status" != "$expected" ]; then
echo "FAIL $name: $path returned $status, expected $expected"
exit 1
fi
echo "ok $name ($status)"
}
check "health" "/health" 200
check "home page" "/" 200
check "product API" "/api/v1/products/1001" 200
check "auth still needed" "/api/v1/orders" 401
# Only if the service exposes its version
if [ -n "$EXPECTED_VERSION" ]; then
deployed=$(curl -s --max-time 10 "$BASE_URL/version" || true)
if [ "$deployed" != "$EXPECTED_VERSION" ]; then
echo "FAIL version: got $deployed, expected $EXPECTED_VERSION"
exit 1
fi
echo "ok version ($deployed)"
fiTry it: API Health Checker Try it: API Endpoint Tester Try it: Security Header Analyzer Try it: Redirect Checker
Synthetic checks after the deployment
A smoke test runs once; synthetic monitoring keeps running. Synthetic checks are scripted transactions — load the home page, log in with a monitoring account, search, add to cart, call a key API — executed on a schedule from outside the system, every few minutes, with alerts on failure or slowness. They catch problems that appear some time after a deployment: a memory leak, an expiring certificate, a scheduled job that breaks a cache, a third party that changed its behaviour.
Treat synthetic checks as tests: keep them in version control, review them with each feature change, give them dedicated test accounts and data, and make sure a failure reaches a person. A synthetic check that has been failing quietly for a week is worse than none, because it creates the impression of coverage. When you write the schedule as a cron expression, check it and its next run times before relying on it.
Try it: Cron Expression Generator Try it: Cron Expression Explainer Try it: Response Time Analyzer
Canary releases, blue-green and feature flags
Progressive delivery exposes a change to a growing share of traffic, with a check at each step. In a canary release, the new version first receives a small share of traffic — a few percent, or internal users — and its behaviour is compared with the baseline running the old version before the share is increased. Google’s SRE workbook describes canarying as comparing the canary population against a control, which is the key point for testers: compare like with like, over the same time window, not the canary against yesterday’s whole fleet.
Blue-green deployment keeps two identical environments; the new version is deployed to the idle one, verified there with the smoke suite, and traffic is switched over, with the old environment kept ready for an immediate switch back. Feature flags separate release from deployment inside the code: new behaviour ships switched off, is enabled for internal users, then for a percentage of customers, and can be switched off without a redeploy.
- Test both flag states, and the transition between them for users in the middle of a flow (a cart created with the flag off, checked out with it on).
- Verify targeting: the flag is on exactly for the intended users, regions or percentage, and off for everyone else.
- Run the smoke suite against the canary or the idle environment directly, before any real traffic reaches it.
- Keep both versions compatible during the rollout: APIs, message formats and database schema must work with old and new code at the same time.
- Remove flags after full release; long-lived flags multiply the combinations to test.
Monitoring signals to watch
During and after a rollout, verification relies on production signals rather than test results. The Google SRE book’s four golden signals are a sensible minimum: latency, traffic, errors and saturation. Add business signals, because many deployment defects produce no errors at all — orders simply stop, or totals are wrong. Compare each signal with the baseline for the same period and look for step changes that line up with the deployment time.
- Errors — HTTP 5xx rate, failed jobs, client-side JavaScript errors, new error messages that did not exist before the deployment.
- Latency — p95 and p99 of key endpoints, not only the average; slow successful requests are still a regression.
- Traffic — sudden drops can mean users cannot reach a feature; sudden rises can mean retry storms.
- Saturation — CPU, memory, connection pools, queue depth; a slow leak shows here hours after a clean smoke test.
- Business — sign-ups, logins, checkouts, payments, messages sent, compared with the same hour on previous days.
- Delivery health over time — change fail rate and failed deployment recovery time, two of the DORA metrics, show whether deployment verification and rollback are working across many releases.
Rollback and release validation
A rollback is itself a deployment and must be verified the same way: run the smoke suite again and confirm the version endpoint reports the previous version on every instance. Rehearse the rollback on staging for any release that changes infrastructure or data, and time it — a rollback that takes an hour is not a safety net for a defect that costs money every minute. Sometimes a forward fix is faster and safer than a rollback; decide which applies in the plan, not during the incident.
Database migrations are what most often make rollback hard. Once a migration drops a column, renames a table or rewrites data, the previous version of the code may no longer run against the new schema, and reversing the migration may lose data written since the deployment. The common mitigation is the expand-and-contract approach: first add new structures in a backward-compatible way, deploy code that works with both, migrate data, and only in a later release remove the old structures. Testing migrations — on a production-sized copy, with old code against the new schema, and with measurement of locks and duration — is covered in the guide on database transactions and migrations testing.
- Rollback criteria written before the deployment, with numeric thresholds and a named decision owner.
- Rollback procedure rehearsed and timed; the artefact of the previous version still available.
- Old code tested against the new schema whenever a migration ships with the release.
- Destructive migration steps (drop, rename, type change) shipped in a later release than the code that stops using them.
- Rollback verified by the same smoke suite and version check as the deployment.
Typical deployment defects
- Production returns 5.8.3 on two of six instances after deploying 5.9.0 (partial rollout).
- Health endpoint returns 200 while the database connection pool is exhausted.
- Smoke test passes against a cached CDN page while the origin returns 502.
- GET /api/v1/orders returns 200 without a token after gateway configuration change.
- Strict-Transport-Security header missing on the new load balancer.
- Canary shows three times the baseline 5xx rate on POST /orders for users with saved cards.
- Flag new_checkout enabled for 5% also shows the new flow to logged-out visitors.
- Rollback to 5.8.3 fails: old code cannot read orders with the new status PENDING_REVIEW.
- Synthetic login check failing for six days because its test account password expired.
Deployment verification checklist
- Verification plan written: rollout steps, success signals, rollback criteria, owners.
- Migrations reviewed for backward compatibility; old code tested against the new schema.
- Post-deployment smoke suite runs automatically and fails the pipeline on failure.
- Version confirmed on every instance or region.
- Security headers, TLS and redirects checked after infrastructure changes.
- Canary or idle environment verified before real traffic; compared with baseline at each step.
- Feature flags tested in both states and for correct targeting.
- Golden signals and business signals watched for the agreed period.
- Rollback rehearsed, timed and verified with the same smoke suite.
- Synthetic checks updated for the new behaviour and alerting a real person.
Frequently asked questions
What is the difference between deployment verification and release testing?
Release testing, such as the regression suite on a release candidate, shows that the build is good. Deployment verification shows that this particular deployment of the build works in its target environment, with its real configuration, infrastructure and traffic. Both are needed, and they catch different defects.
Is it safe to run smoke tests in production?
Yes, if they are designed for it: read-only checks where possible, and writes only through dedicated test accounts whose data is excluded from reporting, billing and communications. Never use real customer accounts or trigger real payments or messages.
What is a canary release?
A deployment in which the new version first receives a small share of traffic, and its errors, latency and business signals are compared with the old version running alongside it. If the canary is healthy, the share grows step by step; if not, it is rolled back with limited user impact.
When should we roll back instead of fixing forward?
When the rollback criteria agreed before the deployment are met and a rollback is known to be safe and fast. A forward fix can be better when rollback is blocked, for example by a data migration, or when the fix is small and can be deployed faster than the rollback. Decide which applies in the plan.
Why do database migrations make rollback hard?
Because the previous code may not work with the changed schema, and reversing a migration can lose data written after the deployment. The expand-and-contract approach avoids this by making each schema change backward compatible and removing old structures only in a later release.
Are synthetic checks a replacement for real monitoring?
No. Synthetic checks tell you whether scripted journeys work from outside; real-user monitoring, logs and metrics tell you what is happening to actual traffic. Use both: synthetic checks catch outages on paths with little traffic, real monitoring catches problems your scripts do not cover.
References
- Canarying Releases — The Site Reliability WorkbookReleasing a change to a small share of traffic first and comparing it with the baseline before rolling out — deployment verification as practised in SRE.
- Site Reliability Engineering: How Google Runs Production SystemsService level objectives, error budgets, monitoring the "four golden signals" and handling overload — the operational side of resilience.
- DORA's software delivery performance metricsThe DORA delivery metrics — change lead time, deployment frequency, failed deployment recovery time, change fail rate and related measures — grouped by throughput and instability.
- Release It! Second Edition: Design and Deploy Production-Ready Software (Michael T. Nygard)Stability patterns — timeouts, circuit breakers, bulkheads, back-pressure — and the failure modes load testing is meant to find.
- Continuous Integration (Martin Fowler)The widely referenced description of continuous integration: integrate often, keep the build self-testing and fast, and fix a broken build immediately.
- GitHub Actions documentationHow workflows, jobs, runners and artifacts are defined in GitHub Actions — where automated tests run on each push or pull request.
Practice exercise
Review a verification plan, then read the canary
You are the tester on call for an online bus-ticket booking platform (fictional). Release 7.4.0 of the bookings service goes to production on Thursday as a canary. It adds seat selection behind a feature flag, ships two database migrations and moves the service to a new load balancer. The release engineer has written a one-page verification plan and asked you to review it before the deployment. The material below gives the change list, the service’s baseline, the draft plan and, further down, the readout from the first canary step.
Work on paper in two passes. First, correct the plan before the deployment with the guide’s plan, smoke and rollback sections: numeric criteria from the baseline, a smoke suite that fits this release, and a rollback that will actually work. Then read the 10:25 readout against your criteria and decide what happens next. A percentage calculator helps with the thresholds. Allow 20–30 minutes.
Online bus-ticket booking platform (fictional) - bookings-service
Release 7.4.0 replaces 7.3.2. Deployment: Thu 15 Oct 2026, 10:00.
Topology: 6 instances behind a load balancer; a CDN in front of the web pages.
Canary: 2 extra instances run 7.4.0 and get a weighted share of traffic.
People:release engineer and rollback decision owner: Tariq | tester on call: you
support lead: Lama
What changes in 7.4.0
- Seat selection on the booking page, behind feature flag seat_map.
OFF at deploy; later: staff accounts -> 10% of customers -> 100%.
- Migration 0131: add nullable column bookings.seat_number.
- Migration 0132: rename column bookings.status to bookings.state
(7.4.0 reads and writes state; 7.3.2 reads and writes status).
- New load balancer with a new TLS certificate; HTTP -> HTTPS redirect reconfigured.
Baseline: last 14 days, same weekday and hour, from the dashboards
HTTP 5xx rate 0.2%
p95 latency, POST /api/v2/bookings 480 ms
booking completion rate (started -> paid) 62%
payment failure rate 1.0%
Draft verification plan (written by Tariq, for your review)
Rollout: canary 5% -> 25% -> 100%, 20 min per step
Smoke: run smoke.sh by hand after the deploy job
(health, home page, trips API, auth 401, version)
Success: no serious errors, site feels fast
Rollback: if it looks bad, redeploy 7.3.2 and revert the migrations
Done when: the deployment job is green
Readout at 10:25 - canary at 5% for 20 min; migration 0131 applied
Agreed at the plan review: 0132 held back; this 7.4.0 build still uses status.
Signal Canary 7.4.0 Control 7.3.2
HTTP 5xx rate 0.2% 0.2%
p95 latency, POST /api/v2/bookings 610 ms 470 ms
average latency, POST /api/v2/bookings 210 ms 200 ms
booking completion rate 41% 61%
payment failure rate 1.0% 0.9%
new error signatures in the logs none -
smoke.sh against the canary instances all ok, version 7.4.0
10:18 ticket from Lama: a customer who is not logged in sees a seat map
on the booking page and cannot continue to payment.- Rewrite the draft’s success signals and rollback criteria as numeric thresholds derived from the baseline, with the comparison method (canary against control, same time window) and the owner of the rollback decision.
- Correct the smoke line: where and when the post-deployment smoke suite runs, which checks it must contain for this release in particular, and how it fails the pipeline.
- Review the two migrations against the rollback line: can 7.3.2 be redeployed once 0132 has run? What do you change in the release or in the rollback method? Then rewrite the "Rollback" and "Done when" lines.
- Read the 10:25 readout against your criteria: for each signal say whether it passes, and explain what the average latency and the equal 5xx rate do and do not tell you. What does the support ticket say about the flag?
- Decide: increase to 25%, hold, or roll back — and write what happens next: the rollback steps and their verification, what is recorded, and the defects to raise.
Show the model answer
Plan review, criteria. "No serious errors" and "site feels fast" cannot be checked by anyone at 10:25, so replace them with numbers derived from the baseline and state how they are compared: canary against the control running 7.3.2, over the same 20-minute window, at every step — not against yesterday’s whole fleet. Success signals: HTTP 5xx rate at most control + 0.5 percentage points (0.7% against this baseline); p95 latency of POST /api/v2/bookings at most 1.2 × control (576 ms against the 480 ms baseline); booking completion rate at least 90% of the control’s rate (about 56% with the 62% baseline); payment failure rate at most 1.5 × control; no new error signatures in the logs. Rollback criteria, any one of which means roll back without discussion: smoke failure on the canary or on production; 5xx rate above 2% for 5 consecutive minutes; booking completion rate more than 10% below control for a whole step; payment failure rate above 2 × control; a data integrity alert (missing or duplicate bookings, one seat sold twice). Name the people: Tariq owns the rollback decision, you run the smoke suite and read the signals at each step, and the thresholds are written in the release ticket before 10:00. The exact numbers are a judgement; what is not negotiable is that they exist, come from this service’s baseline and are agreed before the deployment.
Plan review, smoke. Running smoke.sh by hand after the job means it can be forgotten under pressure, runs after traffic has already arrived, and cannot fail the pipeline. Make the smoke suite the last automated step of the deployment job, run first against the canary instances directly (a check through the load balancer at 5% mostly reaches 7.3.2), then against production after every step, and failing the job if any check fails. For this release it must contain: GET /health returns 200 and the health endpoint reports its dependencies (database, payment provider); the home page with the cache bypassed, so the origin is checked and not a CDN copy; the trips API (GET /api/v2/trips for a route that runs every day) returns 200 with a non-empty list, rather than a fixed trip id that may already have departed; GET /api/v2/bookings without a token returns 401, the negative check that catches a gateway that stopped enforcing authentication; /version returns 7.4.0 on each canary instance, and at 100% on every one of the six instances, not a single call through the load balancer; and, because the load balancer and certificate changed, the TLS certificate is valid for the domain, http:// redirects to https:// on the same path with a 301 or 308, and the security headers present on the old load balancer, including Strict-Transport-Security, are present on the new one. Add a flag-state check: with seat_map OFF, the booking page contains no seat map, requested both without a session and with the test account. Writes, if any, only through the dedicated test account whose bookings are excluded from reports and payments.
Plan review, migrations and rollback. Migration 0131 adds a nullable column: additive, 7.3.2 ignores it, so it stays in place on rollback and needs no special handling. Migration 0132 renames bookings.status to bookings.state, and that breaks the plan twice. First, no canary can work with it: while the canary runs, the control still runs 7.3.2 and reads status, so the moment 0132 runs 95% of traffic fails; and if 0132 does not run, 7.4.0 reads a state column that does not exist. Second, "redeploy 7.3.2 and revert the migrations" is not a rollback method: renaming the column back during an incident, under load, breaks whichever version is still running, and it is a down-migration nobody has ever run, executed at the worst possible moment. The fix is expand-and-contract: 7.4.0 is changed to keep using status and ships without 0132; if the new name is really needed, a later release adds state as a new column, writes both and keeps reading status, a backfill copies the existing values, the next release reads state, and only a release that comes after the code has stopped using status drops it. Before any release that carries a migration, the old code is tested against the new schema on staging. Rewrite the lines. Rollback: while the canary is below 100%, set its traffic weight to 0; at 100%, redeploy image 7.3.2 to all six instances; keep 0131; seat_map stays OFF; rehearsed and timed on staging, target under 10 minutes; verified when the smoke suite passes and /version reports 7.3.2 on every instance that receives traffic. Done when: 100% of traffic for 1 hour with every success signal green and the flag still OFF; a green deployment job only proves that the job finished. The flag rollout (staff, 10%, 100%) is a separate release decision with its own criteria and its own readouts.
Reading the readout. First check the control against the baseline: 0.2%, 470 ms, 61% and 0.9% are normal for this hour, so the comparison is valid. 5xx rate 0.2% against 0.2%: passes. p95 610 ms against 470 ms: 1.30 × control, above the 1.2 × limit of 564 ms; the success signal fails. Average latency 210 against 200 ms would pass, which is exactly why the average is not a criterion: 5% of slow requests barely move the mean while every one of those customers waits. Booking completion rate 41% against 61%: a third fewer bookings, far below the 10% floor of 54.9%; a rollback criterion is met. Payment failure rate 1.0% against 0.9%: within 1.5 × control, passes. No new error signatures: passes. The equal 5xx rate and the clean logs show the point of business signals: this defect produces no errors at all; customers simply stop before payment. On errors alone the canary would have been promoted to 25%.
The ticket. The plan says seat_map is OFF at deploy, for everyone. A customer who is not logged in sees the seat map, so the flag is being evaluated as ON at least for sessions without a user — a targeting defect of the kind the guide lists — and the new behaviour is reaching real customers on the canary while the release says it is not released. It explains the completion drop: the seat map blocks the path to payment. It may also be behind the p95 rise of POST /api/v2/bookings if the seat-map code path runs on those requests, but that is a hypothesis for the root-cause analysis, not a finding. The smoke suite did not see it because none of its checks loads the booking page as a logged-out session; the flag-state check from step 2 would have caught it before any traffic.
Decision: roll back now, not hold. A rollback criterion is met at the end of the first step, so the agreed answer is a rollback without discussion: you give Tariq, the decision owner, the criterion that fired and the readout, and he calls the rollback; the criteria agreed before 10:00 are what make this a routine call instead of a debate. Steps: set the canary weight to 0 so all traffic returns to the six 7.3.2 instances, then take the two canary instances out of service; keep migration 0131; seat_map stays OFF; run the smoke suite against each of the six instances and confirm /version reports 7.3.2 on all of them and that no traffic reaches 7.4.0; watch the same signals for the next 20 minutes and confirm the completion rate is back around 61%. Record the time of the decision, the criterion that fired, who decided, and how long the rollback took, because that number is what the plan promised. A forward fix is discussed after the rollback, with the root cause known, not instead of it.
Defects and follow-up. Reproduce the ticket on staging with 7.4.0 and the flag OFF, logged out and logged in, so that the title states exactly who is affected. Then raise two defects with the canary evidence attached: flag seat_map evaluated as ON for logged-out sessions (or for whichever sessions the reproduction shows), Critical, since it blocks the main booking path, with the ticket, the time window and the canary instance ids; and p95 of POST /api/v2/bookings 1.3 × control on 7.4.0, linked to the first until the root cause shows whether it is the same defect. Before the next attempt: the fix passes confirmation testing on staging, the flag-state check and the load balancer checks join the smoke suite, a synthetic check of the booking path asserts that no seat map appears while the flag is OFF and its alert reaches a person, and the canary is run again from 5% with the same criteria. Note what went right: the plan’s thresholds turned a 20-minute canary into a routine rollback with 5% of customers affected instead of all of them.
If your numbers differ, check the rules rather than the numbers: every criterion is numeric, comes from this service’s baseline, is compared canary against control over the same window, and is agreed before 10:00 with a named decision owner; the smoke suite runs automatically, directly against the instances, with a version check, a negative check and the checks that this release’s infrastructure change makes necessary; destructive migrations never ship with the code that stops using them; and a rollback is verified like a deployment. A stricter latency limit or a different completion floor is fine with a reason; "it looks bad" is not.
Your progress on this topic
Not started
Mark the topic complete when you have studied it and done the exercise.
Sign in to track your progress
Mark topics complete, continue where you left off and unlock specialisation exams.
Part of the QA Roadmap
Before this topic
Next topics
Tools mentioned in this guide
Check several API health endpoints at once and get status, latency and a pass/fail summary.
Quickly check that an API endpoint is reachable: status, response time, size, content type and TLS.
Measure an endpoint's response time over several samples: min, max, average, median and p95.
Compare two API responses (e.g. staging vs production) and list every structural and value difference.
Grade HTTP security headers (CSP, HSTS, X-Frame-Options, Referrer-Policy, Permissions-Policy, COOP/CORP) from pasted headers or a public URL.
Trace redirect chains (301/302/307/308) and see every hop, status and final URL.
Build cron expressions visually and preview the next run times.
Translate any cron expression into plain English and list upcoming run times.