Как удалённо отлаживать Go-приложения?

Ответ

Для удалённой отладки Go-приложений основным инструментом является Delve (dlv).

1. Запуск Delve на удалённом сервере:

Скомпилируйте ваше Go-приложение с отладочной информацией (по умолчанию go build это делает) и запустите Delve в режиме сервера:

# Скомпилировать приложение (если еще не скомпилировано)
# go build -gcflags="all=-N -l" -o myapp .

# Запустить Delve в режиме сервера
dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient --log

Ключевые флаги:

  • debug: Запускает отладчик для исполняемого файла, скомпилированного из текущего каталога. Можно также использовать exec /path/to/your/binary для уже скомпилированного бинарника.
  • --headless: Запускает Delve без интерактивного пользовательского интерфейса, в режиме сервера.
  • --listen=:2345: Указывает адрес и порт, на котором Delve будет слушать входящие соединения (например, от IDE).
  • --api-version=2: Рекомендуется использовать API версии 2 для совместимости с современными IDE.
  • --accept-multiclient: Позволяет нескольким клиентам подключаться к одному сеансу отладки.
  • --log: Включает логирование активности Delve, что полезно для диагностики.

2. Подключение из IDE (например, VS Code):

  1. Откройте проект в VS Code.
  2. Перейдите в раздел "Run and Debug" (Ctrl+Shift+D).
  3. Нажмите "create a launch.json file" или "Add Configuration...".
  4. Выберите конфигурацию "Go: Connect to Server".
  5. В файле launch.json укажите host:port удалённой машины (например, "port": 2345, "host": "your_remote_server_ip").

Пример launch.json:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Connect to Delve",
            "type": "go",
            "request": "attach",
            "mode": "remote",
            "port": 2345,
            "host": "your_remote_server_ip_or_hostname"
        }
    ]
}

3. Рекомендации для продакшена и безопасности:

  • Ограничьте доступ: Используйте фаервол (ufw, iptables) для ограничения доступа к порту Delve только с доверенных IP-адресов.
  • SSH-туннель: Для безопасного подключения используйте SSH-туннель. Это позволяет пробросить локальный порт на удалённый:
    ssh -L 2345:localhost:2345 user@remote_server_ip

    После этого вы можете подключаться к localhost:2345 со своей машины, а трафик будет перенаправлен на удалённый сервер.

  • Производительность: Отладка может замедлять приложение. Используйте её только при необходимости.
  • Логирование: Для мониторинга и диагностики в продакшене предпочтительнее использовать структурированное логирование (например, с библиотеками zap, logrus) и системы агрегации логов.

4. Альтернативные методы диагностики:

  • Профилирование (pprof): Для анализа производительности (CPU, память, горутины, блокировки).
  • Трейсинг (OpenTelemetry, Go's trace package): Для отслеживания потока выполнения запросов через распределённые системы.
  • Логирование: Как основной метод для понимания поведения приложения в продакшене.