Как отлаживать приложение Django, работающее на Heroku, с помощью удаленного pdb-соединения?

Чтобы отладить ошибку, которую я вижу на Heroku, но не на моем локальном компьютере, я пытаюсь выполнить пошаговую отладку.

Типичный подход import pdb; pdb.set_trace() не работает с Heroku, поскольку у вас нет доступа к консоли, подключенной к вашему приложению, но, очевидно, вы можете использовать rpdb, "удаленная" версия pdb.

Итак, я установил rpdb, добавил import rpdb; rpdb.set_trace() в нужное место. Когда я делаю запрос, который попадает в строку rpdb, приложение зависает, как и ожидалось, и я вижу следующее в моем журнале heroku:

pdb is running on 3d0c9fdd-c18a-4cc2-8466-da6671a72cbc:4444

Итак, как подключиться к работающему PDB? Я пробовал heroku run nc 3d0c9fdd-c18a-4cc2-8466-da6671a72cbc 4444 попытаться подключиться к указанному хосту из системы heroku, но это сразу же выходит со статусом 1 и без сообщения об ошибке.

Итак, мой конкретный вопрос: как мне теперь подключиться к этому удаленному PDB?

Общий связанный с этим вопрос: подходит ли это вообще для такого рода интерактивной отладки приложения, работающего на Heroku? Есть ли способ лучше?

ПРИМЕЧАНИЕ RE CELERY: Обратите внимание, я также пробовал аналогичный подход с Celery, но безрезультатно. По умолчанию rdb (удаленная оболочка pdb) сельдерея использует localhost, к которому вы не можете добраться, если это Heroku. Я пробовал использовать переменную среды CELERY_RDB_HOST для домена веб-сайта, размещенного на Heroku, но это дает ошибку «Невозможно назначить запрошенный адрес». Итак, это та же основная проблема - как подключиться к удаленному экземпляру pdb, который работает на Heroku?


person Ghopper21    schedule 04.04.2013    source источник


Ответы (2)


Отвечая на ваш второй вопрос, я делаю это по-разному в зависимости от типа ошибки (на стороне браузера, серверной части или представления). Будет ли у вас работать что-то подобное для бэкэнд-тестирования и тестирования просмотра (юнит-тесты)?

$ heroku run --app=your-app "python manage.py shell --settings=settings.production"

Затем выполните отладку в ipython:

>>> %run -d script_to_run_unittests.py

Даже если вы не запускаете приложение django, вы можете просто запустить отладчик как параметр командной строки для ipython, чтобы любые ошибки python перенаправляли вас в отладчик:

$ heroku run --app=your-app "ipython --pdb"

Фронтенд-тестирование - это совершенно другая игра, в которой вы должны изучить такие инструменты, как селен. Я думаю, что есть также "салатный" модуль набора тестов, который упрощает написание внешних тестов. Написание теста, который ломается, - это первый шаг в отладке (по крайней мере, мне так сказали;).

Если ошибка кажется простой, вы всегда можете выполнить старую операцию «распечатать и запустить» с помощью чего-то вроде

import logging
logger = logging.getLogger(__file__)
logger.warn('here be bugs')`

и просмотрите свои файлы журналов с помощью getsentry.com или аналогичного инструмента мониторинга или просто:

heroku logs --tail
person hobs    schedule 04.04.2013
comment
Хороший материал, но не знаете, как эти подходы помогут вам отладить ответ на запрос сервера? (Чтобы быть конкретным, моя ошибка заключается в теге шаблона, который ведет себя странно на Heroku по сравнению с локальным.) - person Ghopper21; 05.04.2013
comment
@ Ghopper21 вы можете зарегистрировать ответ на запрос сервера или запустить отладчик (установить точку останова с import ipdb;ipdb.set_trace()), где был составлен ответ сервера (на ваш взгляд), чтобы вы могли его изучить. - person hobs; 01.01.2017

Думаю, вы ищете что-то вроде этого:

http://docs.celeryproject.org/en/latest/tutorials/debugging.html

person dusual    schedule 04.04.2013
comment
Да, и как только вы познакомитесь с celery, он отлично подходит для многих вещей, помимо простой отладки ... например, создания параллельных задач для виджетов в вашем UX, или сеансов pubsub и т. Д. - person hobs; 04.04.2013
comment
Это выглядит многообещающе, очень похоже на rpdb, но я сталкиваюсь с той же проблемой - как подключиться к удаленному pdb? По умолчанию rdb использует хост сельдерея - localhost, к которому вы не можете добраться, если это Heroku. Я пробовал использовать переменную env CELERY_RDB_HOST для домена моего веб-сайта (размещенного на Heroku), но это дает ошибку Невозможно назначить запрошенный адрес. - person Ghopper21; 05.04.2013