The traffic split usually happens at a load balancer, service mesh, or ingress layer. Tools like NGINX, Envoy, Istio, or a cloud load balancer weight requests so that, say, 95 percent go to the stable version and 5 percent go to the canary. On Kubernetes this is often two Deployments behind one Service, with a controller like Argo Rollouts or Flagger adjusting the weights.
While traffic flows to the canary, you watch the same signals on both versions side by side: HTTP 5xx error rate, request latency at the p95 and p99 percentiles, CPU and memory, and business metrics like checkout success. The comparison matters more than the raw numbers. If the canary's error rate is 0.2 percent while the stable version sits at 0.1 percent, that doubling is a signal even though both look small.
If the canary stays healthy, an automated controller or a human ramps the weight up in stages, for example 5 then 25 then 50 then 100 percent, pausing at each step. If a metric crosses a threshold, the system rolls back by setting the canary weight to zero, and traffic returns to the version that was already proven stable in production.