Abstract
Every plumber knows the rule: a leak doesn't announce itself. It waits. Go services learn the same lesson the expensive way.
The bug is always the same: a goroutine started, and never stopped. In one of our systems, 287,000 had accumulated before anyone noticed. Every fix was one line; every diagnosis took days; almost all surfaced in production, not in tests.
We'll treat a long-lived Go service as the plumbing system it is. We'll look at how goroutines leak by construction, why an architecture that fans a single request out across many unreliable peers makes it nearly inevitable, and how to catch it — with `goleak` in CI, and Go 1.27's new `goroutineleak` profile in production.