Why Python Needs Error Tracking
Python's dynamic nature means errors that would be caught at compile time in statically typed languages only surface at runtime. A TypeError, AttributeError, or KeyError can lurk in a code path that is only hit under specific conditions. Error tracking catches these issues when they happen in production.
Basic Python Setup
The simplest error tracking setup works for any Python application:
import bugsly
bugsly.init(
dsn="YOUR_DSN",
environment="production",
release="1.0.0",
)Once initialized, unhandled exceptions are automatically captured. You can also capture exceptions manually:
try:
risky_operation()
except Exception as e:
bugsly.capture_exception(e)
# Optionally re-raise or handle gracefullyDjango Integration
Django is the most common Python web framework. Proper integration captures middleware errors, template errors, and view exceptions.
# settings.py
import bugsly
bugsly.init(
dsn="YOUR_DSN",
environment="production",
integrations=[
bugsly.integrations.django.DjangoIntegration(),
],
)
MIDDLEWARE = [
'bugsly.integrations.django.BugslyMiddleware',
'django.middleware.security.SecurityMiddleware',
# ... rest of middleware
]The Django integration automatically captures:
- View exceptions with request context (URL, method, headers)
- Template rendering errors with template name and line
- Database query errors
- User information from
request.user
Flask Integration
from flask import Flask
import bugsly
bugsly.init(dsn="YOUR_DSN")
app = Flask(__name__)
@app.errorhandler(500)
def handle_500(error):
bugsly.capture_exception(error)
return "Internal Server Error", 500FastAPI Integration
FastAPI runs on ASGI and is fully async. Make sure your error tracking SDK supports async properly:
from fastapi import FastAPI
import bugsly
from bugsly.integrations.fastapi import BugslyMiddleware
bugsly.init(dsn="YOUR_DSN")
app = FastAPI()
app.add_middleware(BugslyMiddleware)
@app.get("/users/{user_id}")
async def get_user(user_id: int):
user = await db.get_user(user_id)
if not user:
raise HTTPException(status_code=404)
return userCelery Integration
Celery tasks run in separate worker processes. Errors in tasks are particularly important to track because they often involve critical background operations like sending emails or processing payments.
from celery import Celery
from celery.signals import celeryd_init
import bugsly
@celeryd_init.connect
def init_error_tracking(**kwargs):
bugsly.init(
dsn="YOUR_DSN",
environment="production",
)
app = Celery('tasks')
@app.task(bind=True, max_retries=3)
def process_payment(self, order_id):
try:
order = Order.objects.get(id=order_id)
charge_customer(order)
except PaymentGatewayError as e:
bugsly.capture_exception(e)
self.retry(exc=e, countdown=60)Adding Context
The most valuable error reports include context about the application state:
# Set user context
bugsly.set_user({"id": user.id, "email": user.email})
# Add custom context
bugsly.set_context("order", {
"order_id": order.id,
"total": str(order.total),
"items_count": order.items.count(),
})
# Add breadcrumbs
bugsly.add_breadcrumb(
category="payment",
message=f"Processing payment for order {order.id}",
level="info",
)Filtering Noise
Not all exceptions are bugs. Filter out expected exceptions:
bugsly.init(
dsn="YOUR_DSN",
ignore_errors=[
KeyboardInterrupt,
SystemExit,
django.http.Http404,
],
)Performance Tips
- Use sampling in high-traffic apps:
sample_rate=0.5captures 50% of errors - Send errors asynchronously so they do not block request handling
- Set max breadcrumbs to limit memory usage:
max_breadcrumbs=50
With these integrations in place, you have comprehensive Python error tracking across your entire application stack.
Try Bugsly Free
AI-powered error tracking that explains your bugs. Set up in 2 minutes, free forever for small projects.
Get Started Free