Как ищешь проблему, если получаешь в логах таймаут

«Как ищешь проблему, если получаешь в логах таймаут» — вопрос из категории DevOps, который задают на 23% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Проверяю последовательно:

  1. Сетевую доступность - ping, traceroute, проверка фаерволов
  2. Таймауты соединения - сравниваю с конфигом http.Client:
client := &http.Client{
    Timeout: 30 * time.Second, // дефолтный 0 - нет таймаута
}
  1. Логи сервера - ищу медленные запросы, зависшие горутины
  2. Метрики - CPU, память, goroutine count
  3. Профилирование при долгих ответах:
import _ "net/http/pprof"
go func() {
    log.Println(http.ListenAndServe(":6060", nil))
}()
  1. Контексты - проверяю не отменяется ли context.WithTimeout раньше времени