Sentry 연동으로 실시간 에러 추적 및 알림 받기

Django DRF 프로젝트에 Sentry를 연동하여 운영 환경에서 발생하는 에러를 실시간으로 추적하고 개발자에게 즉시 알림을 보내는 시스템 구축

Sentry가 필요한 이유

  • 에러 발생 즉시 실시간 알림 (Slack, Email 등)

  • 에러 발생 컨텍스트 (Request 정보, User 정보 등) 자동 수집

  • 에러 발생 빈도, 영향받는 사용자 수 등 통계 제공

  • 동일 에러 그룹핑 관리, 릴리즈 버전별 추적

Sentry 프로젝트 생성 및 기본 연동

Sentry 프로젝트 생성

  • Sentry.io 가입 후 Django 플랫폼 선택

  • DSN(Data Source Name) 발급 받기

  • 환경 변수로 DSN 관리 필수

SDK 설치 및 설정

pip install sentry-sdk
# settings.py
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration

SENTRY_DSN = ENV.str("SENTRY_DSN", default=None)

if SENTRY_DSN:
    sentry_sdk.init(
        dsn=SENTRY_DSN,
        integrations=[DjangoIntegration()],
        traces_sample_rate=1.0 if ENV.str("DJANGO_SETTINGS_MODULE") == "config.settings.production" else 0.0,
        release=ENV.str("APP_VERSION", default="dev"),
        environment=ENV.str("DJANGO_SETTINGS_MODULE").split(".")[-1],
        send_default_pii=False,
    )

컨텍스트 및 태그 추가

사용자 정보 자동 수집

  • Django 인증 시스템과 자동 통합

  • 로그인된 사용자의 id, email, username 자동 수집

커스텀 미들웨어로 태그 및 컨텍스트 추가

# middleware.py
import sentry_sdk

class SentryContextMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.user.is_authenticated:
            sentry_sdk.set_tag("user_level", request.user.level)
            sentry_sdk.set_context("user_info", {
                "name": request.user.get_full_name(),
                "company": request.user.company.name if request.user.company else "N/A",
            })
        
        response = self.get_response(request)
        return response

성능 모니터링

성능 추적 활성화

  • traces_sample_rate 설정으로 성능 모니터링 활성화

  • 가장 느린 API 엔드포인트 확인

  • N+1 쿼리 문제 탐지

  • 운영 환경에서만 적절한 샘플링 비율 설정

실시간 알림 설정

Slack 연동

  • Sentry와 Slack 워크스페이스 연동

  • 알림 규칙 생성: 운영 환경 에러 발생 시 특정 채널로 알림

  • 조건별 알림 설정 (에러 빈도, 특정 태그 등)

고급 설정 및 주의사항

민감 정보 필터링

def before_send(event, hint):
    if 'exc_info' in hint:
        exc_type, exc_value, tb = hint['exc_info']
        if isinstance(exc_value, (PermissionDenied, SuspiciousOperation)):
            return None
    
    if 'request' in event and 'data' in event['request']:
        if 'password' in event['request']['data']:
            event['request']['data']['password'] = "[FILTERED]"
    
    return event

수동 에러 보고

# 비즈니스 로직 실패 케이스 보고
sentry_sdk.capture_message("결제 실패", level="warning")

# 예외를 처리했지만 Sentry에 보고
sentry_sdk.capture_exception(e)

릴리즈 추적

  • CI/CD 파이프라인에서 Git Commit 해시나 버전 태그를 release 값으로 설정

  • 버전별 에러 발생 패턴 추적

Last updated