Мониторинг доступности и сбор ошибок

Если ваш сайт по какой-то причине не работает — пользователь пишет в службу поддержки: «Помогите, у меня ошибка, сайт не открывается!». Служба поддержки передаёт эту информацию в технический отдел, в итоге об этом узнаёт администратор сервера и всё исправляет.
Это правильно, но долго, и не на каждом веб-проекте есть служба поддержки, да и не всякий пользователь напишет о проблеме. В результате сайт может быть недоступен в течение заметного времени, что плохо отразится на проекте.
Будет лучше, если администратор сможет узнать о проблемах на сервере раньше всех. В этом ему помогут сервисы мониторинга, которые можно развернуть на сервере или воспользоваться облачным решением. В этом уроке мы познакомимся с облачными сервисами UptimeRobot и Sentry.

UptimeRobot

Суть работы UptimeRobot в том, что он делает регулярные запросы к вашему сервису и фиксирует статус ответа: если сервер возвращает ответ "200 ОК", то всё хорошо, если же, например, "502 Bad Gateway", то на сервере что-то упало. При возникновении проблем на сервере UptimeRobot уведомляет об этом администратора по email или в мессенджере. Таким образом администратор всегда в курсе, если на сервере что-то пошло не так.
Для начала зарегистрируйтесь на https://uptimerobot.com и подтвердите свой email.
После этого вы попадёте на главный дашборд:
image
Нажмите на зеленую кнопку "Add New Monitor". «Монитором» в этой системе называют настроенную систему отслеживания определённого проекта. Таких мониторов в вашем аккаунте может быть несколько.
В открывшемся окне укажите тип монитора: HTTP(s).
image
Затем придумайте имя для этого монитора (Friendly Name), оно будет отображаться на дашборде. Это может быть любое название, описывающее отслеживаемый проект.
Введите URL, который хотите мониторить, например, адрес главной страницы проекта. Последнее поле, Monitoring Interval, можете оставить как есть: «каждые пять минут».
Справа в желтой зоне видны контакты, на которые будут приходить уведомления с этого монитора. По умолчанию там указан адрес электронной почты, под которым вы зарегистрированы в UptimeRobot. Можно настроить отправку оповещений в ваш аккаунт Telegram или Slack, это делается через меню My Settings на главной странице.
Нажмите синюю кнопку "Create Monitor".
Перед вами появится интерактивный монитор, который фиксирует состояние проекта:
image
Ваш монитор только что создан и пока не набрал статистики: шкала будет серая. Но через некоторое время шкала приобретёт примерно такой вид, как на скриншоте.
Зелёная зона на шкале — «с сервером всё ок, он откликается и возвращает статус 200». Красная зона — «у нас проблемы!». Если навести курсор на красную зону — можно узнать, в какое время были неполадки.
Ниже шкалы выводятся логи: лейбл ↑Up означает, что с сервером все хорошо, ↓Down показывает, что сервер упал. Справа от лейблов фиксируется время, статус-код ответа и длительность указанного состояния.
Потратьте пять минут чтобы изучить монитор самостоятельно, там всё интуитивно понятно.
Для проверки подключитесь к своему удаленному серверу по ssh и остановите минут на десять nginx. Вам придёт оповещение, что сервер не отвечает, и на графике отобразится красная зона. Не забудьте потом поднять сервер снова.
Через несколько дней накопится достаточное количество данных, и тогда будет интересно вернуться в UptimeRobot и изучить статистику.

Sentry

Sentry похож на UptimeRobot, но он мониторит ошибки веб-приложений (например, ошибки Django). Облачная версия Sentry доступна бесплатно для одного пользователя.
Стандартные логи проекта — это хорошо, но не всегда читаемо. Отчёты Sentry будут намного удобнее и полезнее.
Sentry позволит мгновенно узнавать об ошибках и о любых, даже некритичных, багах и поможет исправить их.
Создайте аккаунт на https://sentry.io/signup/: введите свои данные и нажмите Create Your Account. Появится вот такое приветствие:
image
Выберите Django в качестве платформы и нажмите кнопку Create Project.
Перед вами появится инструкция по интеграции Sentry в Django. Мы продублируем её здесь.
Для интеграции вашего Django-проекта с сервисом Sentry нужно установить специальный пакет sentry-sdk, он будет отслеживать состояние проекта. В настройках sentry-sdk будет указан ключ (DSN — Data Source Name, «имя источника данных»), чтобы связать приложение sentry-sdk с вашим аккаунтом в Sentry. Этот ключ есть в вашем личном кабинете на Sentry: Projects → <имя-проекта> → Client Keys.
Подключитесь по ssh к своему серверу, убедитесь, что виртуальное окружение активировано и установите пакет sentry-sdk:
Скопировать кодBASH
pip install sentry-sdk
Откройте файл settings.py и настройте пакет sentry-sdk:
Скопировать кодPYTHON
import sentry_sdk from sentry_sdk.integrations.django import DjangoIntegration # скопируйте dsn из вашего личного кабинета на Sentry: # Projects → <имя-проекта> → Client Keys sentry_sdk.init( dsn="ключ_dsn_из_личного_кабинета", integrations=[DjangoIntegration()], )
Готово, интеграция закончена. Можно проверить, как всё это работает.
Создайте функцию, которая делит на ноль: она будет замечательно падать с ошибкой. Создайте роут (правило в urlpatterns), по которому будет вызываться эта функция.
Откройте в редакторе nano файл urls.py и добавьте в него тестовый код (для простоты функцию можно добавить прямо в этот файл, всё равно после теста её нужно будет удалить):
Скопировать кодPYTHON
def trigger_error(request): division_by_zero = 1 / 0 urlpatterns = [ path('sentry-debug/', trigger_error), ]
После этого перезапустите Gunicorn командой sudo systemctl restart gunicorn: изменения вступят в силу.
Готово: сами себе выкопали яму. Давайте в неё наступим. Обратитесь к адресу ваш_домен/sentry-debug/.
Сервер вернёт ошибку: error 500. В этот момент Sentry создаст «событие» (event) в своем журнале и отправит вам на почту оповещение. Оповещения приходят только о новых ошибках, так что сервис не будет вас заваливать письмами.
Вернитесь на сайт https://sentry.io/ и в разделе Issues вы увидите «событие»:
image
События можно сортировать по различным параметрам, это удобно, если событий больше, чем на скриншоте.
Нажмите на событие, чтобы получить более подробную информацию:
image
Здесь выложена исчерпывающая информация о произошедшем инциденте — какая операционная система у пользователя, с какого клиента и в какое время был совершен запрос, вернувший ошибку. Но мало того: в событии даже указан файл и описан код, который вызвал ошибку!
Исправим ошибку. Вернитесь на удаленный сервер, откройте urls.py, удалите функцию и роут для sentry-debug/. Сохраните изменения и перезапустите Gunicorn.
Откройте Sentry, отметьте галочкой исправленное событие и нажмите Resolve (англ. «разрешить», «исправить»: задача решена).
image
Ошибка отмечена как исправленная. Если она возникнет вновь, Sentry опять сообщит вам об этом.
Следить за состоянием вашего сервера теперь не составит труда.