SHADOW TESTING · MIRRORED TRAFFIC
Shadow testing: observe isolated candidate failures
Mirror checkout requests to a candidate, compare responses, and check that the shadow neither emails customers nor slows them down.
Event trace
Computed data
Final metrics
Twelve fictional checkout requests: three from the EU, two with an empty cart. Primary 120 ms, candidate 180 ms. Every response carries a fresh timestamp and request id. Mirroring selects requests by position, not at random. Real shadow systems also need data isolation and cost limits, which are not modeled.
A shadow that emails customers
Twelve checkout requests are mirrored to a candidate that returns EU prices in cents. The page opens with Mirrored share of requests 100%, Mirror mode asynchronous, live side effects and Response diff Exact JSON. Every mirrored request makes the candidate send a real confirmation email: SHADOW LEAKED SIDE EFFECTS, 12 duplicate side effects, and 12 flagged diffs of which only 3 are real.
Clean up the signal
Tick Stub the candidate side effects: no customer is touched, but the exact diff flags all 12 requests because timestamps and request ids always differ, burying the 3 real currency errors: NOISY DIFF. Choose Ignore timestamp and request id: exactly the three EU requests 3, 7 and 10 are flagged, CLEAN SIGNAL, 3 flagged and 3 real.
Never slow the user
With stubs and a normalized diff, choose Synchronous (user waits for both). The candidate takes 180 ms against the primary's 120 ms, so 12 users each wait 60 ms longer, 720 ms in total: USERS SLOWED. Mirroring belongs off the request path.
Sample size
Mirrored share selects requests by position. At 25% only requests 1, 5 and 9 are mirrored, none from the EU: DEFECT MISSED. At 50% the odd requests include EU requests 3 and 7: 2 of 3 real defects, still CLEAN SIGNAL. Candidate bug 500 error on an empty cart triggers on requests 5 and 11, both caught at 50%. With no bug the verdict is NO DIFFERENCES. The table marks each request as mirrored or not, what the candidate returned and whether it was flagged.
Replay and limits
Any change recomputes the run and rewinds it; the Complete-run preview states the outcome at once. Play and Pause walk through the events, Next event jumps one event, Restart rewinds, Speed runs from 0.25x to 2x and Inspection time seeks from 0 to 60 seconds, where the outcome and final metrics appear. Primary and candidate latencies are fixed and every response carries a fresh timestamp and request id. Data isolation and the cost of running a shadow are not modeled.