← Назад к вопросам

Зачем нужен Sentry?

1.8 Middle🔥 211 комментариев
#DevOps и инфраструктура

Комментарии (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 errorsBroken queries, constraint violations
HTTP errors4xx, 5xx responses
Performance issuesSlow DB queries, N+1 problems
Browser errorsJavaScript exceptions (если JS)
Celery errorsFailed tasks
Database errorsConnection 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 должна быть первым инструментом, который вы настраиваете.