Мониторинг Django с Sentry

Sentry автоматически отслеживает ошибки и проблемы производительности в Django приложениях. Это мощный инструмент для production мониторинга, который помогает быстро находить и исправлять проблемы.

Установка и базовая настройка

Сначала установи Sentry SDK:

1pip install sentry-sdk[flask]
2# или для poetry
3poetry add sentry-sdk[flask]

Интеграция в Django проект

Добавь в твой settings.py:

 1import sentry_sdk
 2from sentry_sdk.integrations.django import DjangoIntegration
 3from sentry_sdk.integrations.redis import RedisIntegration
 4from sentry_sdk.integrations.celery import CeleryIntegration
 5
 6# Настройка Sentry
 7sentry_sdk.init(
 8    dsn="https://your-key@your-org.ingest.sentry.io/your-project",
 9    integrations=[
10        DjangoIntegration(),
11        RedisIntegration(),
12        CeleryIntegration(),
13    ],
14    # Отслеживание производительности
15    traces_sample_rate=1.0,
16    # Отправка персональных данных (осторожно!)
17    send_default_pii=True,
18    # Настройка окружения
19    environment=os.getenv('DJANGO_ENV', 'development'),
20    # Фильтрация ошибок
21    before_send=lambda event, hint: None if 'ignore_this_error' in str(event) else event,
22)

Настройка в wsgi.py

Альтернативный способ - настройка в wsgi.py:

 1import os
 2import sentry_sdk
 3from sentry_sdk.integrations.django import DjangoIntegration
 4from django.core.wsgi import get_wsgi_application
 5
 6# Инициализация Sentry перед Django
 7sentry_sdk.init(
 8    dsn=os.environ.get('SENTRY_DSN'),
 9    integrations=[DjangoIntegration()],
10    traces_sample_rate=1.0,
11)
12
13os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
14application = get_wsgi_application()

Ручное логирование ошибок

Для отправки кастомных ошибок используй:

 1import sentry_sdk
 2
 3# Логирование исключений
 4try:
 5    # рискованный код
 6    result = some_risky_function()
 7except Exception as e:
 8    sentry_sdk.capture_exception(e)
 9    # или с дополнительным контекстом
10    sentry_sdk.capture_exception(e, extra={
11        'user_id': request.user.id,
12        'request_data': request.POST,
13        'custom_context': 'additional info'
14    })
15
16# Логирование сообщений
17sentry_sdk.capture_message(
18    "Пользователь выполнил важное действие",
19    level="info",
20    extra={
21        'user_id': user.id,
22        'action': 'payment_completed',
23        'amount': 1000
24    }
25)

Отслеживание производительности

Настрой performance monitoring:

 1import sentry_sdk
 2from sentry_sdk.integrations.django import DjangoIntegration
 3
 4sentry_sdk.init(
 5    dsn="YOUR_DSN",
 6    integrations=[DjangoIntegration()],
 7    # Отслеживание SQL запросов
 8    traces_sample_rate=1.0,
 9    # Отслеживание медленных запросов
10    profiles_sample_rate=1.0,
11)
12
13# Ручное создание транзакций
14with sentry_sdk.start_transaction(op="db", name="custom_query") as transaction:
15    # выполнение операции
16    result = database_query()
17    transaction.set_tag("query_type", "custom")
18    transaction.set_data("result_count", len(result))

Настройка фильтрации

Фильтруй ненужные ошибки:

 1def before_send(event, hint):
 2    # Игнорируем 404 ошибки
 3    if event.get('exception', {}).get('values', [{}])[0].get('type') == 'Http404':
 4        return None
 5
 6    # Игнорируем ошибки аутентификации
 7    if 'AuthenticationFailed' in str(event):
 8        return None
 9
10    # Игнорируем ошибки валидации форм
11    if 'ValidationError' in str(event):
12        return None
13
14    return event
15
16sentry_sdk.init(
17    dsn="YOUR_DSN",
18    before_send=before_send,
19    integrations=[DjangoIntegration()],
20)

Настройка уведомлений

Создай правила уведомлений в веб-интерфейсе Sentry:

  • Email уведомления: Настрой SMTP в Sentry для отправки email
  • Slack интеграция: Подключи Slack webhook для мгновенных уведомлений
  • Discord/Telegram: Используй webhook для других мессенджеров
  • PagerDuty: Для критических ошибок с эскалацией

Настройка окружений

Разделяй ошибки по окружениям:

1# settings/development.py
2SENTRY_ENVIRONMENT = 'development'
3SENTRY_TRACES_SAMPLE_RATE = 0.1  # Меньше трассировок в dev
4
5# settings/production.py
6SENTRY_ENVIRONMENT = 'production'
7SENTRY_TRACES_SAMPLE_RATE = 0.05  # Оптимально для production
8SENTRY_PROFILES_SAMPLE_RATE = 0.1  # Отслеживание профилей

Интеграция с Celery

Для background задач:

 1from celery import Celery
 2import sentry_sdk
 3from sentry_sdk.integrations.celery import CeleryIntegration
 4
 5# Инициализация в Celery
 6sentry_sdk.init(
 7    dsn="YOUR_DSN",
 8    integrations=[CeleryIntegration()],
 9    traces_sample_rate=1.0,
10)
11
12app = Celery('your_project')
13app.config_from_object('django.conf:settings', namespace='CELERY')

Мониторинг API endpoints

Отслеживай производительность API:

 1from django.http import JsonResponse
 2import sentry_sdk
 3
 4def api_view(request):
 5    with sentry_sdk.start_transaction(op="http", name="api_endpoint") as transaction:
 6        transaction.set_tag("endpoint", "user_list")
 7        transaction.set_tag("method", request.method)
 8
 9        try:
10            # логика API
11            data = get_user_data()
12            transaction.set_data("user_count", len(data))
13            return JsonResponse(data)
14        except Exception as e:
15            sentry_sdk.capture_exception(e)
16            return JsonResponse({"error": "Internal error"}, status=500)

Настройка в Docker

Для контейнеризованных приложений:

1# Dockerfile
2ENV SENTRY_DSN=https://your-key@your-org.ingest.sentry.io/your-project
3ENV SENTRY_ENVIRONMENT=production
4ENV SENTRY_TRACES_SAMPLE_RATE=0.05

Лучшие практики

  • Не логируй пароли и токены: Используй before_send для очистки чувствительных данных
  • Настрой rate limiting: Ограничь количество ошибок от одного пользователя
  • Группируй ошибки: Используй fingerprint для кастомной группировки
  • Мониторь метрики: Отслеживай количество ошибок, время отклика, throughput
  • Настрой алерты: Создай уведомления для критических ошибок

Отладка и тестирование

Проверь, что Sentry работает:

 1# В Django shell или view для тестирования
 2import sentry_sdk
 3
 4# Тестовая ошибка
 5try:
 6    raise ValueError("Тестовая ошибка для Sentry")
 7except Exception as e:
 8    sentry_sdk.capture_exception(e)
 9
10# Проверь в веб-интерфейсе Sentry

FAQ

Q: Как настроить уведомления в Sentry?
A: Настрой правила уведомлений в веб-интерфейсе Sentry для email, Slack или других каналов. Создай правила по типам ошибок, частоте и окружению.

Q: Какой уровень sampling выбрать для production?
A: Для traces_sample_rate используй 0.05-0.1 (5-10%), для profiles_sample_rate - 0.1 (10%). Это обеспечит баланс между детализацией и производительностью.

Q: Как игнорировать определенные ошибки?
A: Используй функцию before_send для фильтрации ошибок по типу, сообщению или другим критериям.

Q: Как отслеживать пользователей в Sentry?
A: Используй sentry_sdk.set_user({"id": user.id, "email": user.email}) для идентификации пользователей в ошибках.

Q: Как настроить Sentry для разных окружений?
A: Используй переменные окружения SENTRY_ENVIRONMENT и разные DSN для dev/staging/production.