Мониторишь runtime.NumGoroutine() — если число растёт и не падает, есть утечка. Через pprof goroutine profile смотришь, где они застряли — обычно видно стек вызовов с блокировкой на канале или мьютексе. Типичные причины: забыл закрыть канал, HTTP body не закрыт, тикер не остановлен. Для тестов используй goleak от Uber — он ловит горутины, которые не завершились после теста.