sentry-python-sdkby sentry

Full Sentry SDK setup for Python. Use when asked to "add Sentry to Python", "install sentry-sdk", "setup Sentry in Python", or configure error monitoring,…

npx skills add https://github.com/getsentry/sentry-for-ai --skill sentry-python-sdk

All Skills > SDK Setup > Python SDK

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

# OpenTelemetry tracing — check for SDK + instrumentations
grep -rE "opentelemetry-sdk|opentelemetry-instrumentation|opentelemetry-distro" \
  requirements.txt pyproject.toml 2>/dev/null
grep -rn "TracerProvider\|trace\.get_tracer\|start_as_current_span" \
  --include="*.py" 2>/dev/null | head -5

# 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.)
  • OpenTelemetry tracing? (Use OTLP path instead of native tracing.)
  • 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:

Route from OTel detection:

  • OTel tracing detected (opentelemetry-sdk / opentelemetry-distro in requirements, or TracerProvider in source) → use OTLP path: OTLPIntegration(); do not set traces_sample_rate; Sentry links errors to OTel traces automatically

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; not available with OTLP path
  • Crons — Celery Beat, APScheduler, or cron patterns detected
  • Metrics — business KPIs, SLO tracking

Recommendation matrix:

FeatureRecommend when...Reference
Error MonitoringAlways — non-negotiable baseline${SKILL_ROOT}/references/error-monitoring.md
OTLP IntegrationOTel tracing detected — replaces native Tracing${SKILL_ROOT}/references/tracing.md
TracingDjango/Flask/FastAPI/AIOHTTP/etc. detected; skip if OTel tracing detected${SKILL_ROOT}/references/tracing.md
ProfilingProduction + performance-sensitive workload; skip if OTel tracing detected (requires traces_sample_rate, incompatible with OTLP)${SKILL_ROOT}/references/profiling.md
LoggingAlways (stdlib); enhanced for Loguru${SKILL_ROOT}/references/logging.md
MetricsBusiness events or SLO tracking needed${SKILL_ROOT}/references/metrics.md
CronsCelery Beat, APScheduler, or cron patterns${SKILL_ROOT}/references/crons.md
AI MonitoringOpenAI/Anthropic/LangChain/etc. detected${SKILL_ROOT}/references/ai-monitoring.md

OTel tracing detected: "I see OpenTelemetry tracing in the project. I recommend Sentry's OTLP integration for tracing (via your existing OTel setup) + Error Monitoring + Sentry Logging [+ Metrics/Crons/AI Monitoring if applicable]. Shall I proceed?"

No OTel: "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

FrameworkWhere to call sentry_sdk.init()Notes
DjangoTop of settings.py, before any importsNo middleware needed — Sentry patches Django internally
FlaskBefore app = Flask(__name__)Must precede app creation
FastAPIBefore app = FastAPI()StarletteIntegration + FastApiIntegration auto-enabled together
StarletteBefore app = Starlette(...)Same auto-integration as FastAPI
AIOHTTPModule level, before web.Application()
TornadoModule level, before app setupNo integration class needed
QuartBefore app = Quart(__name__)
FalconModule level, before app = falcon.App()
SanicInside @app.listener("before_server_start")Sanic's lifecycle requires async init
Celery@signals.celeryd_init.connect in worker AND in calling processDual-process init required
RQmysettings.py loaded by worker via rq worker -c mysettings
ARQBoth 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-enabledExplicit required
Django, Flask, FastAPI, Starlette, AIOHTTP, Tornado, Quart, Falcon, Sanic, BottleDramatiqIntegration
Celery, RQ, Huey, ARQGRPCIntegration
SQLAlchemy, Redis, asyncpg, pymongoStrawberryIntegration
Requests, HTTPX, aiohttp-clientAsyncioIntegration
OpenAI, Anthropic, LangChain, Pydantic AI, MCPOpenTelemetryIntegration
Python logging, LoguruWSGIIntegration / ASGIIntegration

For Each Agreed Feature

Walk through features one at a time. Load the reference, follow its steps, verify before moving on:

FeatureReference fileLoad when...
Error Monitoring${SKILL_ROOT}/references/error-monitoring.mdAlways (baseline)
Tracing${SKILL_ROOT}/references/tracing.mdHTTP handlers / distributed tracing
Profiling${SKILL_ROOT}/references/profiling.mdPerformance-sensitive production
Logging${SKILL_ROOT}/references/logging.mdAlways; enhanced for Loguru
Metrics${SKILL_ROOT}/references/metrics.mdBusiness KPIs / SLO tracking
Crons${SKILL_ROOT}/references/crons.mdScheduler / cron patterns detected
AI Monitoring${SKILL_ROOT}/references/ai-monitoring.mdAI library detected

For each feature: Read ${SKILL_ROOT}/references/<feature>.md, follow steps exactly, verify it works.


Configuration Reference

Key sentry_sdk.init() Options

OptionTypeDefaultPurpose
dsnstrNoneSDK disabled if empty; env: SENTRY_DSN
environmentstr"production"e.g., "staging"; env: SENTRY_ENVIRONMENT
releasestrNonee.g., "[email protected]"; env: SENTRY_RELEASE
send_default_piiboolFalseInclude IP, headers, cookies, auth user
traces_sample_ratefloatNoneTransaction sample rate; None disables tracing
traces_samplerCallableNoneCustom per-transaction sampling (overrides rate)
profile_session_sample_ratefloatNoneContinuous profiling session rate
profile_lifecyclestr"manual""trace" = auto-start profiler with spans
profiles_sample_ratefloatNoneTransaction-based profiling rate
enable_logsboolFalseSend logs to Sentry (SDK ≥ 2.35.0)
sample_ratefloat1.0Error event sample rate
attach_stacktraceboolFalseStack traces on capture_message()
max_breadcrumbsint100Max breadcrumbs per event
debugboolFalseVerbose SDK debug output
before_sendCallableNoneHook to mutate/drop error events
before_send_transactionCallableNoneHook to mutate/drop transaction events
ignore_errorslist[]Exception types or regex patterns to suppress
auto_enabling_integrationsboolTrueSet False to disable all auto-detection

OTLPIntegration Options (pass to constructor)

OptionTypeDefaultPurpose
setup_otlp_traces_exporterboolTrueAuto-configure OTLP exporter; set False if you send to your own Collector
collector_urlstrNoneOTLP HTTP endpoint of an OTel Collector (e.g., http://localhost:4318/v1/traces); when set, spans are sent to the collector instead of directly to Sentry
setup_propagatorboolTrueAuto-configure Sentry propagator for distributed tracing
capture_exceptionsboolFalseIntercept exceptions recorded via OTel Span.record_exception

Environment Variables

VariableMaps toNotes
SENTRY_DSNdsn
SENTRY_RELEASEreleaseAlso auto-detected from git SHA, Heroku, CircleCI, CodeBuild, GAE
SENTRY_ENVIRONMENTenvironment
SENTRY_DEBUGdebug

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:

  1. Set debug=True in sentry_sdk.init() — prints SDK internals to stdout
  2. Verify the DSN is correct
  3. Check SENTRY_DSN env var is set in the running process
  4. 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 detectedSuggest skill
React / Next.jssentry-react-sdk
Svelte / SvelteKitsentry-svelte-sdk
Vue / NuxtUse @sentry/vue — see docs.sentry.io/platforms/javascript/guides/vue/
Other JS/TSsentry-react-sdk (covers generic browser JS patterns)

Troubleshooting

IssueSolution
Events not appearingSet debug=True, verify DSN, check env vars in the running process
Malformed DSN errorFormat: https://<key>@o<org>.ingest.sentry.io/<project>
Django exceptions not capturedEnsure sentry_sdk.init() is at the top of settings.py before other imports
Flask exceptions not capturedInit must happen before app = Flask(__name__)
FastAPI exceptions not capturedInit before app = FastAPI(); both StarletteIntegration and FastApiIntegration auto-enabled
ASGI chained exceptions suppressedBy default, Sentry's ASGI middleware strips exception chains (raise exc from None). To preserve chained exceptions, set _experiments={"suppress_asgi_chained_exceptions": False} in sentry_sdk.init()
Celery task errors not capturedMust call sentry_sdk.init() in the worker process via celeryd_init signal
Sanic init not workingInit must be inside @app.listener("before_server_start"), not module level
uWSGI not capturingAdd --enable-threads --py-call-uwsgi-fork-hooks to uWSGI command
No traces appearing (native)Verify traces_sample_rate is set (not None); check that the integration is auto-enabled
No traces appearing (OTLP)Verify sentry-sdk[opentelemetry-otlp] is installed; do not set traces_sample_rate when using OTLPIntegration
Profiling not startingRequires traces_sample_rate > 0 + either profile_session_sample_rate or profiles_sample_rate; not compatible with OTLP path
enable_logs not workingRequires SDK ≥ 2.35.0; for direct structured logs use sentry_sdk.logger; for stdlib bridging use LoggingIntegration(sentry_logs_level=...)
Too many transactionsLower traces_sample_rate or use traces_sampler to drop health checks
Cross-request data leakingDon't use get_global_scope() for per-request data — use get_isolation_scope()
RQ worker not reportingPass --sentry-dsn="" to disable RQ's own Sentry shortcut; init via settings file instead

More skills from sentry

NotebookLM Web Importer

Import web pages and YouTube videos to NotebookLM with one click. Trusted by 200,000+ users.

Install Chrome Extension