Как удалённо отлаживать 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): Для отслеживания потока выполнения запросов через распределённые системы.
  • Логирование: Как основной метод для понимания поведения приложения в продакшене.

Ответ 18+ 🔞

Вот, слушай, про отладку Go на удалённой машине. Ну, в общем, главный инструмент тут — Delve, он же dlv. Без него нихуя не получится, если честно.

1. Как запустить эту хрень на сервере:

Сначала скомпилируй своё приложение, чтобы отладочная информация осталась. Потом запускаешь Delve в каком-то особом, серверном режиме.

# Собираем бинарь (если ещё не собрал)
# go build -gcflags="all=-N -l" -o myapp .

# А теперь включаем режим бога — запускаем Delve как сервер
dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient --log

Смотри, что за флаги волшебные:

  • debug: Это чтобы отладчик прицепился к тому, что в текущей папке собрано. Или exec /путь/к/твоему/бинарнику — если уже собрал.
  • --headless: Запускает без всякого интерфейса, в режиме "слушай порт и жди, когда к тебе подключатся". Идеально для сервера.
  • --listen=:2345: Говорит, на каком порту слушать. 2345 — классика, но можешь и другой, если хочешь.
  • --api-version=2: Бери двойку, не ошибёшься. Современные IDE её любят.
  • --accept-multiclient: Позволяет подцепиться не одному, а нескольким клиентам. Вдруг ты с двух компов сразу дебажить захочешь, ёпта!
  • --log: Включает логирование самой Delve. Если что-то пойдёт не так — будет что в глаза тыкать.

2. Как из своей уютной IDE (типа VS Code) прицепиться к этому делу:

  1. Открываешь проект.
  2. Ищешь "Run and Debug" (Ctrl+Shift+D).
  3. Тыкаешь "create a launch.json file" или "Add Configuration...".
  4. Выбираешь "Go: Connect to Server".
  5. В файле launch.json пишешь адресок и порт твоего удалённого сервака.

Вот пример, как это выглядит в 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), чтобы пускал только с твоих доверенных IP. Иначе какой-нибудь полупидор к тебе в отладчик вломится.
  • SSH-туннель — твой друг. Самый надёжный способ. Пробрасываешь порт через SSH, и всё шифруется.
    ssh -L 2345:localhost:2345 user@remote_server_ip

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

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

4. Ну и на последок — альтернативы, если Delve — это слишком жирно:

  • Профилирование (pprof): Когда нужно понять, куда деваются процессор, память или почему всё встало колом из-за блокировок.
  • Трейсинг (OpenTelemetry, встроенный trace): Чтобы отследить, как запрос болтается по всем твоим сервисам. Для распределённых систем — самое то.
  • Ну и просто логи, блядь: Старый добрый способ понять, что твоё творение творит в бою. Иногда достаточно просто добавить пару осмысленных строк вывода, и всё становится ясно как божий день.