> Как обнаружить, что процесс начал занимать больше времени (Go)

Уровень: senior · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Для обнаружения увеличения времени выполнения процесса в Go можно использовать несколько подходов.

1. Метрики и профилирование
Встроенный пакет net/http/pprof позволяет собирать профили CPU и трассировки. Добавьте эндпоинт /debug/pprof/ и регулярно снимайте профили. Сравнивайте время выполнения ключевых функций через go tool pprof -top. Например, если время в processRequest выросло с 50ms до 200ms - это сигнал.

2. Мониторинг с помощью Prometheus и гистограмм
Используйте prometheus/client_golang для создания гистограммы времени выполнения:

GO
var requestDuration = prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "process_duration_seconds",
Help: "Duration of process execution",
Buckets: prometheus.DefBuckets,
},
[]string{"status"},
)

Измеряйте время с помощью time.Since() и наблюдайте за квантилями (p99, p50) в Grafana. Резкий рост p99 указывает на проблему.

3. Логирование с задержками
Добавьте логирование с пороговыми значениями:

GO
start := time.Now()
defer func() {
if dur := time.Since(start); dur > 100*time.Millisecond {
log.Printf("SLOW: process took %v", dur)
}
}()

4. Трейсинг (OpenTelemetry)
Внедрите распределённую трассировку. Создайте спаны для ключевых операций и экспортируйте их в Jaeger или Zipkin. Увеличение времени в конкретном спане укажет на узкое место.

5. Системные утилиты
Используйте strace (Linux) для отслеживания системных вызовов или perf для анализа CPU. Например, strace -p <PID> -T покажет время каждого вызова.

Комбинируйте эти методы: настройте алерты в Prometheus на основе гистограмм, а при срабатывании анализируйте профили и трейсы.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью