Смотрящий
Основная цель данной статьи познакомить вас с особенностями работы как серверной, так и клиентской части Sentry.
Sentry является Open source проектом мониторинга ошибок, можно использовать как SaaS, так и self-hosted. Основное его преимущество в том, что он группирует множество одинаковых ошибок, в терминологии sentry - событий, в один агрегат. Рассмотрим как устроен данный инструмент:
Сам Sentry написан на Django, для работы с очередями использутся Celery (Redis или RabbitMQ), планируется переход на Kafka, в качестве хранилища - Postgres. На стороне вашего приложения нужно будет установить SDK. Клиент и сервер общаются между собой по REST API.
Существует несколько интерфейсов для хранения разного рода данных, которые могут иметь свой бэкенд:
- Search - для поисковых запросов
- Tagstore - для работы с тегами событий
- TSDB - (time series database) - для графиков
В качестве бэкенда можно ипользовать:
- Cassandra
- Riak
- ClickHouse, с помощью приложения - snuba
Если вы используете self-hosted вариантом, то у вас есть возможность подключать пользователей Sentry к LDAP, с помощью плагина getsentry-ldap-auth В SaaS варианте можно подключать SSO для:
- OneLogin
- Okta
- Auth0
Жизненный цикл логирования выглядит следующим образом
- В приложении логгируется событие.
- SDK отправляет событие по http в Sentry.
- На стороне Sentry событие записывается в очередь.
- Воркер обрабатывает данные и записывает их в хранилище.
Sentry + Python
Первым клиентом для python был raven, который на данный момент является устаревшим. Ему на замену пришел - sentry-python. Новые клиенты написаны для всех поддерживаемых языков, связано это в первую очередь с унфикацией клиентов и настроек. Также у разработчиков Sentry появляется возможность для добавления новой функциональности. Подробнее можно ознакомиться на официальном сайте.
Все SDK по умолчанию должны отправлять события асинхронно и в фоновом режиме. Если рассматривать Python SDK, то во время первого логгирования запускается отдельный тред, занимающийся отправкой событий.
Рассмотрим случаи, в которых мы теряем события:
1. Таймаут ожидания
Создадим файл cli.py:
import logging
import sentry_sdk
from sentry_sdk.integrations.logging import LoggingIntegration
DSN = 'https://XXXX@sentry.io/YYYY'
logging.basicConfig(level=logging.DEBUG)
sentry_sdk.init(
dsn=DSN,
integrations=[LoggingIntegration(
level=logging.INFO,
event_level=logging.INFO
)]
)
# Log generator
for i in range(15):
logging.error("error {}".format(i))
pip install sentry-sdk # Install requirements
time python cli.py
...
DEBUG:urllib3.connectionpool:https://sentry.io:443 "POST /api/YYYY/store/ HTTP/1.1" 200 41
DEBUG:urllib3.connectionpool:https://sentry.io:443 "POST /api/YYYY/store/ HTTP/1.1" 200 41
DEBUG:urllib3.connectionpool:https://sentry.io:443 "POST /api/YYYY/store/ HTTP/1.1" 200 41
DEBUG:urllib3.connectionpool:https://sentry.io:443 "POST /api/YYYY/store/ HTTP/1.1" 200 41
DEBUG:urllib3.connectionpool:https://sentry.io:443 "POST /api/YYYY/store/ HTTP/1.1" 200 41
DEBUG:urllib3.connectionpool:https://sentry.io:443 "POST /api/YYYY/store/ HTTP/1.1" 200 41
DEBUG:urllib3.connectionpool:https://sentry.io:443 "POST /api/YYYY/store/ HTTP/1.1" 200 41
DEBUG:urllib3.connectionpool:https://sentry.io:443 "POST /api/YYYY/store/ HTTP/1.1" 200 41
DEBUG:urllib3.connectionpool:https://sentry.io:443 "POST /api/YYYY/store/ HTTP/1.1" 200 41
real 0m2.217s
user 0m0.229s
sys 0m0.042s
Видим, что количество отправленных событий - 9, а время выполнения 2.217 секунды.
Почему так получилось? За ожидание отправки отвечает настройка - shutdown_timeout
, по умолчанию
равная 2 секундам. Зададим в sentry_sdk.init
shutdown_timeout=10
и запустим.
Мы получим то, что и ожидалось. SDK пытается
отправить логи пока не истечет лимит по времени, все не отправленные данные будут потеряны.
2. Лимиты
В случае использования SaaS вы можете уперется в лимиты, в таком случае вы будете получать 429 http статусы. Приложение при этом будет продолжать работать.
3. Потеря сети
Приложение также будет продолжать работать, если между вашим сервисом и Sentry пропадает сетевое соединение. Логи при этом будут потеряны.
Надо учитывать эти моменты при работе с Sentry.
4. Multiprocessing
К сожалению на данный момент SDK имеет проблемы при работе с multiprocessing и вы опять теряете свои логи. Следить за ходом событий можно - здесь
Полезно
Полезные дополнительные настройки в sentry_sdk.init
:
debug -> bool
- позволяет отслеживать ошибки самой SDKenvironment -> str
- задает среду разработки, например: dev, stage, prod.release -> str
- на мой взгляд одна из полезнейших настроек, которая позволяет указать версию текущего продука.
В самом Sentry можно гибко фильтровать логи как по environment так и по release.
Sentry является Open source проектом, да у него есть проблемы и их нужно знать, но вы можете поучаствовать в их исправлении и развитии данного продукта.
Использовался:
- sentry-sdk 0.14.3