PluginBench
Skill
Official
Review
Audit score 70

sentry-python-sdk

getsentry/sentry-for-ai

Complete Sentry error monitoring, tracing, profiling, and AI observability setup for Python applications.

What is sentry-python-sdk?

The Sentry Python SDK is a full-featured observability integration that captures errors, traces, profiles, logs, metrics, and cron job execution across Python web frameworks and task queues. Use it when you need to monitor application health, performance, and AI model interactions in production Python apps.

  • Captures unhandled exceptions and error groups with full context and stack traces
  • Distributed tracing across HTTP requests, async tasks, and background jobs
  • Continuous profiling to identify performance bottlenecks in production
  • Automatic instrumentation for OpenAI, Anthropic, LangChain, and other AI libraries
  • Structured logging integration with Python's stdlib logging and Loguru
  • Cron job and scheduled task monitoring via Celery Beat and APScheduler

How to install sentry-python-sdk

npx skills add https://github.com/getsentry/sentry-for-ai --skill sentry-python-sdk
Prerequisites
  • Python 3.6 or later
  • SENTRY_DSN environment variable from your Sentry project
  • pip or poetry for package installation
Claude Code
Cursor
Windsurf
Cline

How to use sentry-python-sdk

  1. 1.Install the core SDK with `pip install sentry-sdk` and framework-specific extras if needed (e.g., `pip install "sentry-sdk[django,celery]"`).
  2. 2.Add `sentry_sdk.init()` at the top of your application entry point (settings.py for Django, before app creation for Flask/FastAPI) with your DSN and desired features.
  3. 3.Set `traces_sample_rate` to enable tracing (start with 1.0 in development, lower to 0.1–0.2 in high-traffic production).
  4. 4.Enable profiling with `profile_session_sample_rate=1.0` and `profile_lifecycle="trace"` for continuous performance monitoring.
  5. 5.For Celery, initialize Sentry in both the worker process (via `@signals.celeryd_init.connect`) and the calling process to capture task errors.
  6. 6.Verify setup by triggering a test error or visiting your Sentry project dashboard to confirm events are arriving.

Use cases

Good for
  • Monitor Django, Flask, or FastAPI web application errors and request performance in production
  • Track Celery task failures and execution times across distributed workers
  • Capture AI model API calls and token usage from OpenAI or Anthropic integrations
  • Profile slow endpoints to identify performance regressions before users notice
  • Correlate frontend errors with backend traces using Sentry's cross-platform linking
Who it's for
  • Backend engineers building Python web applications (Django, Flask, FastAPI)
  • DevOps and SRE teams monitoring production application health
  • Data scientists and ML engineers tracking AI model integrations and LLM API usage
  • Full-stack teams needing unified error and performance monitoring across services

sentry-python-sdk FAQ

Do I need to install framework-specific extras like `sentry-sdk[django]`?

No, the base `sentry-sdk` package works with all frameworks. Extras are optional and install complementary packages for enhanced integration, but are not required.

Should I enable tracing in high-traffic production?

Yes, but lower the `traces_sample_rate` to 0.1–0.2 (10–20%) to reduce overhead and costs. Start at 1.0 in development and staging to validate setup.

Can Sentry monitor my OpenAI or Anthropic API calls?

Yes, Sentry auto-instruments OpenAI, Anthropic, LangChain, and other AI libraries with zero configuration. Token usage and model calls are captured automatically.

What's the difference between OTLP integration and native Sentry tracing?

If you already use OpenTelemetry tracing, use `OTLPIntegration()` instead of `traces_sample_rate`. OTLP sends traces to your OTel collector; Sentry links errors to those traces automatically. Profiling is not available with OTLP.

How do I monitor Celery background tasks?

Initialize Sentry in both the Celery worker process (via `@signals.celeryd_init.connect`) and the calling process. Sentry will then capture task errors, duration, and status automatically.

Full instructions (SKILL.md)

Source of truth, from getsentry/sentry-for-ai.


name: sentry-python-sdk description: 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, tracing, profiling, logging, metrics, crons, or AI monitoring for Python applications. Supports Django, Flask, FastAPI, Celery, Starlette, AIOHTTP, Tornado, and more. license: Apache-2.0 category: sdk-setup parent: sentry-sdk-setup disable-model-invocation: true

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|pyramid" \
  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. "myapp@1.0.0"
    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()
PyramidModule level, before config = Configurator()WSGI framework
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, Pyramid, Sanic, BottleDramatiqIntegration
Celery, RQ, Huey, ARQGRPCIntegration
SQLAlchemy, Redis, asyncpg, pymongoStrawberryIntegration
Requests, HTTPX, httpx2, 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., "myapp@1.0.0"; env: SENTRY_RELEASE
send_default_piiboolFalseInclude IP, headers, cookies, auth user, query strings (ASGI frameworks)
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()
Query strings not captured (ASGI)Query strings and client IP in ASGI frameworks (FastAPI, Starlette, etc.) require send_default_pii=True
RQ worker not reportingPass --sentry-dsn="" to disable RQ's own Sentry shortcut; init via settings file instead