Смотрящий

Основная цель данной статьи познакомить вас с особенностями работы как серверной, так и клиентской части Sentry.

Sentry является Open source проектом мониторинга ошибок, можно использовать как SaaS, так и self-hosted. Основное его преимущество в том, что он группирует множество одинаковых ошибок, в терминологии sentry - событий, в один агрегат. Рассмотрим как устроен данный инструмент:

Sentry components diagram

Сам Sentry написан на Django, для работы с очередями использутся Celery (Redis или RabbitMQ), планируется переход на Kafka, в качестве хранилища - Postgres. На стороне вашего приложения нужно будет установить SDK. Клиент и сервер общаются между собой по REST API.

Существует несколько интерфейсов для хранения разного рода данных, которые могут иметь свой бэкенд:

В качестве бэкенда можно ипользовать:

Если вы используете self-hosted вариантом, то у вас есть возможность подключать пользователей Sentry к LDAP, с помощью плагина getsentry-ldap-auth В SaaS варианте можно подключать SSO для:

Жизненный цикл логирования выглядит следующим образом

Sentry sequence diagram

  1. В приложении логгируется событие.
  2. SDK отправляет событие по http в Sentry.
  3. На стороне Sentry событие записывается в очередь.
  4. Воркер обрабатывает данные и записывает их в хранилище.

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:

В самом Sentry можно гибко фильтровать логи как по environment так и по release.

Sentry sequence diagram

Sentry является Open source проектом, да у него есть проблемы и их нужно знать, но вы можете поучаствовать в их исправлении и развитии данного продукта.

Использовался: