Sentry Python SDK
Opinionated wizard that scans your Python project and guides you through complete Sentry setup.
Invoke This Skill When
- User asks to "add Sentry to Python" or "setup Sentry" in a Python app
- User wants error monitoring, tracing, profiling, logging, metrics, or crons in Python
- User mentions
sentry-sdk, sentry_sdk, or Sentry + any Python framework
- User wants to monitor Django views, Flask routes, FastAPI endpoints, Celery tasks, or scheduled jobs
Note: SDK versions and APIs below reflect Sentry docs at time of writing (sentry-sdk 2.x).
Always verify against docs.sentry.io/platforms/python/ before implementing.
Phase 1: Detect
Run these commands to understand the project before making recommendations:
# Check existing Sentry
grep -i sentry requirements.txt pyproject.toml setup.cfg setup.py 2>/dev/null
# Detect web framework
grep -rE "django|flask|fastapi|starlette|aiohttp|tornado|quart|falcon|sanic|bottle" \
requirements.txt pyproject.toml 2>/dev/null
# Detect task queues
grep -rE "celery|rq|huey|arq|dramatiq" requirements.txt pyproject.toml 2>/dev/null
# Detect logging libraries
grep -E "loguru" requirements.txt pyproject.toml 2>/dev/null
# Detect AI libraries
grep -rE "openai|anthropic|langchain|huggingface|google-genai|pydantic-ai|litellm" \
requirements.txt pyproject.toml 2>/dev/null
# Detect schedulers / crons
grep -rE "celery|apscheduler|schedule|crontab" requirements.txt pyproject.toml 2>/dev/null
# Check for companion frontend
ls frontend/ web/ client/ ui/ static/ templates/ 2>/dev/null
What to note:
- Is
sentry-sdk already in requirements? If yes, check if sentry_sdk.init() is present — may just need feature config.
- Which framework? (Determines where to place
sentry_sdk.init().)
- Which task queue? (Celery needs dual-process init; RQ needs a settings file.)
- AI libraries? (OpenAI, Anthropic, LangChain are auto-instrumented.)
- Companion frontend? (Triggers Phase 4 cross-link.)
Phase 2: Recommend
Based on what you found, present a concrete proposal. Don't ask open-ended questions — lead with a recommendation:
Always recommended (core coverage):
- ✅ Error Monitoring — captures unhandled exceptions, supports
ExceptionGroup (Python 3.11+)
- ✅ Logging — Python
logging stdlib auto-captured; enhanced if Loguru detected
Recommend when detected:
- ✅ Tracing — HTTP framework detected (Django/Flask/FastAPI/etc.)
- ✅ AI Monitoring — OpenAI/Anthropic/LangChain/etc. detected (auto-instrumented, zero config)
- ⚡ Profiling — production apps where performance matters
- ⚡ Crons — Celery Beat, APScheduler, or cron patterns detected
- ⚡ Metrics — business KPIs, SLO tracking
Recommendation matrix:
| Feature |
Recommend when... |
Reference |
| Error Monitoring |
Always — non-negotiable baseline |
${SKILL_ROOT}/references/error-monitoring.md |
| Tracing |
Django/Flask/FastAPI/AIOHTTP/etc. detected |
${SKILL_ROOT}/references/tracing.md |
| Profiling |
Production + performance-sensitive workload |
${SKILL_ROOT}/references/profiling.md |
| Logging |
Always (stdlib); enhanced for Loguru |
${SKILL_ROOT}/references/logging.md |
| Metrics |
Business events or SLO tracking needed |
${SKILL_ROOT}/references/metrics.md |
| Crons |
Celery Beat, APScheduler, or cron patterns |
${SKILL_ROOT}/references/crons.md |
| AI Monitoring |
OpenAI/Anthropic/LangChain/etc. detected |
${SKILL_ROOT}/references/ai-monitoring.md |
Propose: "I recommend Error Monitoring + Tracing [+ Logging if applicable]. Want Profiling, Crons, or AI Monitoring too?"
Phase 3: Guide
Install
# Core SDK (always required)
pip install sentry-sdk
# Optional extras (install only what matches detected framework):
pip install "sentry-sdk[django]"
pip install "sentry-sdk[flask]"
pip install "sentry-sdk[fastapi]"
pip install "sentry-sdk[celery]"
pip install "sentry-sdk[aiohttp]"
pip install "sentry-sdk[tornado]"
# Multiple extras:
pip install "sentry-sdk[django,celery]"
Extras are optional — plain sentry-sdk works for all frameworks. Extras install complementary packages.
Quick Start — Recommended Init
Full init enabling the most features with sensible defaults. Place before any app/framework code:
import sentry_sdk
sentry_sdk.init(
dsn=os.environ["SENTRY_DSN"],
environment=os.environ.get("SENTRY_ENVIRONMENT", "production"),
release=os.environ.get("SENTRY_RELEASE"), # e.g. "[email protected]"
send_default_pii=True,
# Tracing (lower to 0.1–0.2 in high-traffic production)
traces_sample_rate=1.0,
# Profiling — continuous, tied to active spans
profile_session_sample_rate=1.0,
profile_lifecycle="trace",
# Structured logs (SDK ≥ 2.35.0)
enable_logs=True,
)
Where to Initialize Per Framework
| Framework |
Where to call sentry_sdk.init() |
Notes |
| Django |
Top of settings.py, before any imports |
No middleware needed — Sentry patches Django internally |
| Flask |
Before app = Flask(name) |
Must precede app creation |
| FastAPI |
Before app = FastAPI() |
StarletteIntegration + FastApiIntegration auto-enabled together |
| Starlette |
Before app = Starlette(...) |
Same auto-integration as FastAPI |
| AIOHTTP |
Module level, before web.Application() |
|
| Tornado |
Module level, before app setup |
No integration class needed |
| Quart |
Before app = Quart(name) |
|
| Falcon |
Module level, before app = falcon.App() |
|
| Sanic |
Inside @app.listener("beforeserverstart") |
Sanic's lifecycle requires async init |
| Celery |
@signals.celeryd_init.connect in worker AND in calling process |
Dual-process init required |
| RQ |
mysettings.py loaded by worker via rq worker -c mysettings |
|
| ARQ |
Both worker module and enqueuing process |
|
Django example (settings.py):
import sentry_sdk
sentry_sdk.init(
dsn=os.environ["SENTRY_DSN"],
send_default_pii=True,
traces_sample_rate=1.0,
profile_session_sample_rate=1.0,
profile_lifecycle="trace",
enable_logs=True,
)
# rest of Django settings...
INSTALLED_APPS = [...]
FastAPI example (main.py):
import sentry_sdk
sentry_sdk.init(
dsn=os.environ["SENTRY_DSN"],
send_default_pii=True,
traces_sample_rate=1.0,
profile_session_sample_rate=1.0,
profile_lifecycle="trace",
enable_logs=True,
)
from fastapi import FastAPI
app = FastAPI()
Auto-Enabled vs Explicit Integrations
Most integrations activate automatically when their package is installed — no integrations=[...] needed:
| Auto-enabled |
Explicit required |
| Django, Flask, FastAPI, Starlette, AIOHTTP, Tornado, Quart, Falcon, Sanic, Bottle |
DramatiqIntegration |
| Celery, RQ, Huey, ARQ |
GRPCIntegration |
| SQLAlchemy, Redis, asyncpg, pymongo |
StrawberryIntegration |
| Requests, HTTPX, aiohttp-client |
AsyncioIntegration |
| OpenAI, Anthropic, LangChain, Pydantic AI, MCP |
OpenTelemetryIntegration |
Python logging, Loguru |
WSGIIntegration / ASGIIntegration |
For Each Agreed Feature
Walk through features one at a time. Load the reference, follow its steps, verify before moving on:
| Feature |
Reference file |
Load when... |
| Error Monitoring |
${SKILL_ROOT}/references/error-monitoring.md |
Always (baseline) |
| Tracing |
${SKILL_ROOT}/references/tracing.md |
HTTP handlers / distributed tracing |
| Profiling |
${SKILL_ROOT}/references/profiling.md |
Performance-sensitive production |
| Logging |
${SKILL_ROOT}/references/logging.md |
Always; enhanced for Loguru |
| Metrics |
${SKILL_ROOT}/references/metrics.md |
Business KPIs / SLO tracking |
| Crons |
${SKILL_ROOT}/references/crons.md |
Scheduler / cron patterns detected |
| AI Monitoring |
${SKILL_ROOT}/references/ai-monitoring.md |
AI library detected |
For each feature: Read ${SKILL_ROOT}/references/<feature>.md, follow steps exactly, verify it works.
Configuration Reference
Key sentry_sdk.init() Options
| Option |
Type |
Default |
Purpose |
dsn |
str |
None |
SDK disabled if empty; env: SENTRY_DSN |
environment |
str |
"production" |
e.g., "staging"; env: SENTRY_ENVIRONMENT |
release |
str |
None |
e.g., "[email protected]"; env: SENTRY_RELEASE |
senddefaultpii |
bool |
False |
Include IP, headers, cookies, auth user |
tracessamplerate |
float |
None |
Transaction sample rate; None disables tracing |
traces_sampler |
Callable |
None |
Custom per-transaction sampling (overrides rate) |
profilesessionsample_rate |
float |
None |
Continuous profiling session rate |
profile_lifecycle |
str |
"manual" |
"trace" = auto-start profiler with spans |
profilessamplerate |
float |
None |
Transaction-based profiling rate |
enable_logs |
bool |
False |
Send logs to Sentry (SDK ≥ 2.35.0) |
sample_rate |
float |
1.0 |
Error event sample rate |
attach_stacktrace |
bool |
False |
Stack traces on capture_message() |
max_breadcrumbs |
int |
100 |
Max breadcrumbs per event |
debug |
bool |
False |
Verbose SDK debug output |
before_send |
Callable |
None |
Hook to mutate/drop error events |
beforesendtransaction |
Callable |
None |
Hook to mutate/drop transaction events |
ignore_errors |
list |
[] |
Exception types or regex patterns to suppress |
autoenablingintegrations |
bool |
True |
Set False to disable all auto-detection |
Environment Variables
| Variable |
Maps to |
Notes |
SENTRY_DSN |
dsn |
|
SENTRY_RELEASE |
release |
Also auto-detected from git SHA, Heroku, CircleCI, CodeBuild, GAE |
SENTRY_ENVIRONMENT |
environment |
|
SENTRY_DEBUG |
debug |
|
Verification
Test that Sentry is receiving events:
# Trigger a real error event — check dashboard within seconds
division_by_zero = 1 / 0
Or for a non-crashing check:
sentry_sdk.capture_message("Sentry Python SDK test")
If nothing appears:
- Set
debug=True in sentry_sdk.init() — prints SDK internals to stdout
- Verify the DSN is correct
- Check
SENTRY_DSN env var is set in the running process
- For Celery/RQ: ensure init runs in the worker process, not just the calling process
Phase 4: Cross-Link
After completing Python setup, check for a companion frontend missing Sentry:
ls frontend/ web/ client/ ui/ 2>/dev/null
cat frontend/package.json web/package.json client/package.json 2>/dev/null \
| grep -E '"react"|"svelte"|"vue"|"next"|"nuxt"'
If a frontend exists without Sentry, suggest the matching skill:
| Frontend detected |
Suggest skill |
| React / Next.js |
sentry-react-sdk |
| Svelte / SvelteKit |
sentry-svelte-sdk |
| Vue / Nuxt |
Use @sentry/vue — see docs.sentry.io/platforms/javascript/guides/vue/ |
| Other JS/TS |
sentry-react-sdk (covers generic browser JS patterns) |
Troubleshooting
| Issue |
Solution |
| Events not appearing |
Set debug=True, verify DSN, check env vars in the running process |
| Malformed DSN error |
Format: https://<key>@o<org>.ingest.sentry.io/<project> |
| Django exceptions not captured |
Ensure sentry_sdk.init() is at the top of settings.py before other imports |
| Flask exceptions not captured |
Init must happen before app = Flask(name) |
| FastAPI exceptions not captured |
Init before app = FastAPI(); both StarletteIntegration and FastApiIntegration auto-enabled |
| Celery task errors not captured |
Must call sentrysdk.init() in the worker process via celerydinit signal |
| Sanic init not working |
Init must be inside @app.listener("beforeserverstart"), not module level |
| uWSGI not capturing |
Add --enable-threads --py-call-uwsgi-fork-hooks to uWSGI command |
| No traces appearing |
Verify tracessamplerate is set (not None); check that the integration is auto-enabled |
| Profiling not starting |
Requires tracessamplerate > 0 + either profilesessionsamplerate or profilessample_rate |
enable_logs not working |
Requires SDK ≥ 2.35.0; for direct structured logs use sentrysdk.logger; for stdlib bridging use LoggingIntegration(sentrylogs_level=...) |
| Too many transactions |
Lower tracessamplerate or use traces_sampler to drop health checks |
| Cross-request data leaking |
Don't use getglobalscope() for per-request data — use getisolationscope() |
| RQ worker not reporting |
Pass --sentry-dsn="" to disable RQ's own Sentry shortcut; init via settings file instead |