Sentry Integration
Overview
Sentry integration for error tracking, performance monitoring, and observability across Django applications.
Installation
Required Package
From requirements.txt analysis:
Django Configuration
# settings.py
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
from sentry_sdk.integrations.celery import CeleryIntegration
sentry_sdk.init(
dsn=os.getenv('SENTRY_DSN'),
integrations=[
DjangoIntegration(
transaction_style='url',
middleware_spans=True,
signals_spans=True,
),
CeleryIntegration(
monitor_beat_tasks=True,
propagate_traces=True,
),
],
traces_sample_rate=0.1, # Adjust based on traffic
send_default_pii=False,
environment=os.getenv('ENVIRONMENT', 'development'),
release=os.getenv('RELEASE_VERSION', 'unknown'),
)
OpenTelemetry Integration
Based on requirements.txt analysis:
# OpenTelemetry packages
opentelemetry-api==1.22.0
opentelemetry-sdk==1.22.0
opentelemetry-exporter-zipkin==1.22.0
opentelemetry-exporter-otlp==1.22.0
opentelemetry-instrumentation-django==0.43.b
opentelemetry-instrumentation-celery==0.43.b
opentelemetry-instrumentation-mysql==0.43.b
OpenTelemetry Configuration
# settings.py - OpenTelemetry setup
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
# Set up tracing
trace.set_tracer_provider(TracerProvider())
tracer = trace.get_tracer(__name__)
# Configure OTLP exporter
otlp_exporter = OTLPSpanExporter(
endpoint=os.getenv('OTEL_EXPORTER_OTLP_ENDPOINT', 'http://localhost:4317'),
headers={"Authorization": f"Bearer {os.getenv('OTEL_AUTH_TOKEN')}"},
)
span_processor = BatchSpanProcessor(otlp_exporter)
trace.get_tracer_provider().add_span_processor(span_processor)
Environment Variables
# .env file
SENTRY_DSN=https://[email protected]/project-id
ENVIRONMENT=development # development, staging, production
RELEASE_VERSION=v1.0.0
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
OTEL_AUTH_TOKEN=your_auth_token
Custom Error Handling
Manual Error Reporting
import sentry_sdk
try:
# Some operation that might fail
process_data()
except Exception as e:
sentry_sdk.capture_exception(e)
# Handle error appropriately
Adding Context
with sentry_sdk.configure_scope() as scope:
scope.set_tag("component", "payment_processor")
scope.set_context("payment", {
"amount": payment.amount,
"currency": payment.currency,
"method": payment.method,
})
# Process payment
Custom Breadcrumbs
sentry_sdk.add_breadcrumb(
message='User initiated payment',
category='payment',
level='info',
data={
'amount': amount,
'currency': currency,
}
)
Performance Monitoring
Transaction Tracking
import sentry_sdk
# Manual transaction
with sentry_sdk.start_transaction(name="data_processing", op="task"):
# Your processing logic here
process_large_dataset()
Custom Metrics
# Track custom metrics
sentry_sdk.set_measurement("processing_time", processing_time_ms, "millisecond")
sentry_sdk.set_measurement("records_processed", record_count, "none")
Celery Integration
Configuration
# celery.py
from celery.signals import task_failure
import sentry_sdk
@task_failure.connect
def sentry_task_failure_handler(sender=None, task_id=None, exception=None, traceback=None, einfo=None, **kwargs):
with sentry_sdk.configure_scope() as scope:
scope.set_tag("celery_task", sender.name)
scope.set_context("task", {
"task_id": task_id,
"task_name": sender.name,
})
sentry_sdk.capture_exception(exception)
Task Monitoring
# tasks.py
from celery import shared_task
import sentry_sdk
@shared_task
def process_data_task(data_id):
with sentry_sdk.start_transaction(name="process_data_task", op="celery.task"):
try:
# Process data
result = process_data(data_id)
return result
except Exception as e:
sentry_sdk.capture_exception(e)
raise
User Context
Django User Integration
# middleware or view
from sentry_sdk import configure_scope
def add_user_context(request):
if request.user.is_authenticated:
with configure_scope() as scope:
scope.set_user({
"id": request.user.id,
"username": request.user.username,
"email": request.user.email,
})
Filtering Sensitive Data
Data Scrubbing
# settings.py
sentry_sdk.init(
# ... other config
before_send=before_send_filter,
send_default_pii=False,
)
def before_send_filter(event, hint):
# Remove sensitive data
if 'request' in event:
if 'data' in event['request']:
# Remove password fields
if isinstance(event['request']['data'], dict):
event['request']['data'].pop('password', None)
event['request']['data'].pop('secret_key', None)
return event
Release Tracking
Deployment Integration
# Deploy script
import subprocess
import sentry_sdk
# Create release
release = sentry_sdk.release.create_release(
organization="azmx",
project="your-project",
version=os.getenv('RELEASE_VERSION'),
)
# Associate commits
sentry_sdk.release.set_commits(
organization="azmx",
project="your-project",
version=os.getenv('RELEASE_VERSION'),
auto=True,
)
Dashboard and Alerting
Key Metrics to Monitor
- Error rate by endpoint
- Response time percentiles
- Celery task failure rates
- Database query performance
- Custom business metrics
Alert Rules
Set up alerts for: - Error rate > 5% for 5 minutes - Response time > 2 seconds for 95th percentile - Celery task failure rate > 10% - Critical errors (500s) in production
Team KPI Integration
Backend Engineer KPIs
- API Error Rate: Target ≤ 2% (tracked via Sentry)
- Response Time: Target ≤ 500ms average (tracked via Sentry)
- Issue Resolution: Target ≤ 2 days (tracked via Sentry alerts)
Monitoring Dashboards
Access via: https://sentry.azmx.sa