Мониторинг Django с Sentry
Sentry автоматически отслеживает ошибки и проблемы производительности в Django приложениях. Это мощный инструмент для production мониторинга, который помогает быстро находить и исправлять проблемы.
Установка и базовая настройка
Сначала установи Sentry SDK:
Интеграция в 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
Для контейнеризованных приложений:
Лучшие практики
- Не логируй пароли и токены: Используй
before_send
для очистки чувствительных данных - Настрой rate limiting: Ограничь количество ошибок от одного пользователя
- Группируй ошибки: Используй fingerprint для кастомной группировки
- Мониторь метрики: Отслеживай количество ошибок, время отклика, throughput
- Настрой алерты: Создай уведомления для критических ошибок
Отладка и тестирование
Проверь, что 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.