Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Назначение Sentry в production
Sentry — это error tracking и monitoring platform, которая собирает, группирует и визуализирует исключения из вашего приложения. Это один из essential tools в production-среде.
Основная проблема, которую решает Sentry
До Sentry
# Ваше приложение работает на production
# Что-то сломалось в какой-то момент
# Пользователь получил 500 error, но вы не знаете почему
# Единственный способ — залезть в логи на сервере
ssh production-server
cd /var/log/myapp
tail -f app.log
# Ищите в тысячах строк нужное исключение
# Это может быть сложно и долго
С Sentry
# Исключение автоматически отправляется в Sentry
# Sentry группирует одинаковые ошибки
# Вы видите:
# - Когда произошла ошибка
# - Сколько раз произошла
# - На какой версии кода
# - На какой версии браузера
# - Стек трейс с контекстом
# - Значения переменных в момент ошибки
# Всё в красивом веб-интерфейсе, доступно в любой момент
Главные причины использовать Sentry
1. Обнаружение проблем в production
# Без Sentry: проблема обнаруживается когда:
# - Пользователь пожаловался
# - Метрики упали
# - Вы случайно заметили в логах
# С Sentry: вы узнаете в течение секунд
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
from sentry_sdk.integrations.celery import CeleryIntegration
sentry_sdk.init(
dsn="https://your-key@sentry.io/project-id",
integrations=[
DjangoIntegration(),
CeleryIntegration(),
],
traces_sample_rate=0.1, # 10% трафика для performance monitoring
environment="production",
)
# Теперь любой uncaught exception автоматически отправится в Sentry
@app.route('/api/users/{user_id}')
def get_user(user_id):
# Если здесь error — Sentry узнает
user = User.objects.get(id=user_id)
return {"name": user.name}
2. Контекст для отладки
Sentry не просто говорит "ошибка", а сохраняет полный контекст:
from sentry_sdk import capture_exception, set_context
def process_payment(order_id: int):
try:
order = Order.objects.get(id=order_id)
# Sentry будет знать эту информацию при ошибке
set_context("order", {
"id": order_id,
"amount": order.total_amount,
"customer_id": order.customer_id,
"status": order.status,
})
# Если произойдёт ошибка, Sentry покажет:
# - Стек трейс
# - Значения локальных переменных
# - Контекст (информацию о заказе)
# - Значения environment variables (безопасно)
charge_credit_card(order.amount)
order.status = "completed"
order.save()
except PaymentError as e:
set_context("error_context", {
"error_type": type(e).__name__,
"retry_count": 3,
"amount": order.total_amount,
})
capture_exception(e)
raise
3. Группировка и дедупликация
Проблема:
- Один и тот же баг вызывает 10,000 ошибок
- Без Sentry: вы видите 10,000 отдельных логов
- С Sentry: вы видите 1 issue с количеством 10,000
Улучшение: группировка
Sentry автоматически группирует ошибки по:
- Файлу и номеру строки
- Стеку трейса
- Типу исключения
- Пользовательским fingerprints
4. Performance Monitoring
# Sentry может отслеживать не только ошибки, но и производительность
import sentry_sdk
from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration
sentry_sdk.init(
dsn="...",
integrations=[SqlalchemyIntegration()],
traces_sample_rate=0.1,
)
from sentry_sdk import start_transaction
def generate_report(start_date, end_date):
with start_transaction(op="task", name="generate_report"):
# Sentry автоматически измеряет:
# - Время выполнения
# - SQL запросы и их время
# - Если что-то медленно, уведомляет вас
users = User.objects.filter(created_at__gte=start_date)
# Sentry видит этот SQL запрос и время его выполнения
for user in users:
process_user(user)
5. Alerts и Notifications
# Sentry может отправлять уведомления
# В веб-интерфейсе Sentry:
# - Создайте Alert: "если новая ошибка в production → отправить в Slack"
# - Создайте Alert: "если более 100 ошибок в минуту → page oncall"
# - Создайте Alert: "если P95 latency > 1 сек → уведомить team"
# Результат: вы узнаёте о проблемах в момент их возникновения
Реальный пример из production
Сценарий: баг при обновлении профиля
# Production
@app.route('/profile', methods=['PUT'])
def update_profile():
user_id = get_current_user_id()
data = request.get_json()
user = User.objects.get(id=user_id)
user.name = data['name']
user.email = data['email']
user.save() # Здесь может быть ошибка если email уже существует
# Без Sentry:
# - Некоторые пользователи сообщают, что не могут обновить профиль
# - Вы ждёте репортов
# - Вы лезете в логи
# - Вы в итоге находите ошибку через час
# С Sentry:
# - IntegrityError отправляется в Sentry
# - За 10 секунд вы видите в Slack: "New Issue: IntegrityError in update_profile"
# - Вы заходите в Sentry, видите:
# - Стек трейс показывает exact line
# - Контекст показывает какой email был дублирован
# - Вы видите, что это произошло 45 раз сегодня
# - Вы выдаёте fix за 5 минут
from django.db import IntegrityError
@app.route('/profile', methods=['PUT'])
def update_profile():
user_id = get_current_user_id()
data = request.get_json()
user = User.objects.get(id=user_id)
try:
user.email = data['email']
user.name = data['name']
user.save()
return {"status": "success"}
except IntegrityError as e:
# Sentry сразу узнает о проблеме
set_context("update_profile", {
"attempted_email": data['email'],
"user_id": user_id,
})
capture_exception(e)
return {"error": "Email already in use"}, 400
Интеграция с популярными фреймворками
# Django
sentry_sdk.init(
dsn="...",
integrations=[DjangoIntegration()],
)
# FastAPI
sentry_sdk.init(
dsn="...",
integrations=[StarletteIntegration()],
)
# Celery (background tasks)
sentry_sdk.init(
dsn="...",
integrations=[CeleryIntegration()],
)
# Requests (external API calls)
sentry_sdk.init(
dsn="...",
integrations=[RequestsIntegration()],
)
Что Sentry отслеживает
| Что | Пример |
|---|---|
| Необработанные исключения | ZeroDivisionError, AttributeError, etc |
| SQL errors | Broken queries, constraint violations |
| HTTP errors | 4xx, 5xx responses |
| Performance issues | Slow DB queries, N+1 problems |
| Browser errors | JavaScript exceptions (если JS) |
| Celery errors | Failed tasks |
| Database errors | Connection issues, timeouts |
Best Practices
# 1. Используйте environment variables
sentry_sdk.init(
dsn=os.getenv("SENTRY_DSN"),
environment=os.getenv("ENVIRONMENT"), # production, staging, etc
)
# 2. Фильтруйте ненужные ошибки
def before_send(event, hint):
# Не отправлять ошибки на тестовых данных
if "test_" in event.get("request", {}).get("url", ""):
return None
return event
sentry_sdk.init(
dsn="...",
before_send=before_send,
)
# 3. Добавляйте кастомный контекст
set_user({
"id": user.id,
"email": user.email,
"subscription": user.subscription_type,
})
# 4. Ловите ошибки явно
from sentry_sdk import capture_exception
try:
risky_operation()
except Exception as e:
capture_exception(e)
handle_gracefully()
Вывод
Sentry — это не опция, а necessary infrastructure для production приложений. Она преобразует работу с ошибками:
- До: "Почему упало?" → 1 час отладки
- После: "Ошибка в Sentry" → 5 минут fix
Это экономит время разработчиков, улучшает experience пользователей, и делает систему более надёжной. В любом production проекте Sentry должна быть первым инструментом, который вы настраиваете.