Python
Learn how to set up Sentry in your Python app, capture your first errors and traces, and view them in Sentry.
Use curl to download, read and follow: https://skills.sentry.dev/sentry-python-sdk/SKILL.mdUsing a framework?
This guide focuses on plain Python. If you're working with Django, FastAPI, Starlette, or any other web framework, choose the respective guide from the list of supported frameworks.
You need:
Run the command for your preferred package manager to add the Sentry SDK to your application:
pip install "sentry-sdk"
pip install "sentry-sdk"
uv add "sentry-sdk"
poetry add "sentry-sdk"
Choose the features you want to configure, and this guide will show you how:
Configuration should happen as early as possible in your application's lifecycle.
Import and initialize the SDK in your app's entry point:
import sentry_sdk
# ___PRODUCT_OPTION_START___ metrics
from sentry_sdk import metrics
# ___PRODUCT_OPTION_END___ metrics
sentry_sdk.init(
dsn="___PUBLIC_DSN___",
# Add request headers and IP for users,
# see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info
send_default_pii=True,
# ___PRODUCT_OPTION_START___ performance
# Set traces_sample_rate to 1.0 to capture 100%
# of transactions for tracing.
# see https://docs.sentry.io/platforms/python/configuration/options/#traces_sample_rate for more info
traces_sample_rate=1.0,
# ___PRODUCT_OPTION_END___ performance
# ___PRODUCT_OPTION_START___ profiling
# Enables continuous profiling.
# To collect profiles for all profile sessions,
# set `profile_session_sample_rate` to 1.0.
# see https://docs.sentry.io/platforms/python/configuration/options/#profile_session_sample_rate for more info
profile_session_sample_rate=1.0,
# Profiles will be automatically collected while
# there is an active span.
# see https://docs.sentry.io/platforms/python/configuration/options/#profile_lifecycle for more info
profile_lifecycle="trace",
# ___PRODUCT_OPTION_END___ profiling
# ___PRODUCT_OPTION_START___ logs
# Enable logs to be sent to Sentry
# see https://docs.sentry.io/platforms/python/configuration/options/#enable_logs for more info
enable_logs=True,
# ___PRODUCT_OPTION_END___ logs
)
import sentry_sdk
# ___PRODUCT_OPTION_START___ metrics
from sentry_sdk import metrics
# ___PRODUCT_OPTION_END___ metrics
sentry_sdk.init(
dsn="___PUBLIC_DSN___",
# Add request headers and IP for users,
# see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info
send_default_pii=True,
# ___PRODUCT_OPTION_START___ performance
# Set traces_sample_rate to 1.0 to capture 100%
# of transactions for tracing.
# see https://docs.sentry.io/platforms/python/configuration/options/#traces_sample_rate for more info
traces_sample_rate=1.0,
# ___PRODUCT_OPTION_END___ performance
# ___PRODUCT_OPTION_START___ profiling
# Enables continuous profiling.
# To collect profiles for all profile sessions,
# set `profile_session_sample_rate` to 1.0.
# see https://docs.sentry.io/platforms/python/configuration/options/#profile_session_sample_rate for more info
profile_session_sample_rate=1.0,
# Profiles will be automatically collected while
# there is an active span.
# see https://docs.sentry.io/platforms/python/configuration/options/#profile_lifecycle for more info
profile_lifecycle="trace",
# ___PRODUCT_OPTION_END___ profiling
# ___PRODUCT_OPTION_START___ logs
# Enable logs to be sent to Sentry
# see https://docs.sentry.io/platforms/python/configuration/options/#enable_logs for more info
enable_logs=True,
# ___PRODUCT_OPTION_END___ logs
)
In async programs, we recommend to initialize the Sentry SDK inside an async function to ensure async code is instrumented properly. If possible, call sentry_sdk.init() at the beginning of the first async function you call:
import asyncio
import sentry_sdk
# ___PRODUCT_OPTION_START___ metrics
from sentry_sdk import metrics
# ___PRODUCT_OPTION_END___ metrics
async def main():
sentry_sdk.init(
... # same as above
)
asyncio.run(main())
import asyncio
import sentry_sdk
# ___PRODUCT_OPTION_START___ metrics
from sentry_sdk import metrics
# ___PRODUCT_OPTION_END___ metrics
async def main():
sentry_sdk.init(
... # same as above
)
asyncio.run(main())
The Sentry SDK automatically enables integrations for many popular libraries, so operations like HTTP requests or database queries made with supported libraries will be captured as spans automatically.
However, spans are only created within an existing transaction. If you're not using a supported framework that creates transactions automatically, you'll need to create them manually using sentry_sdk.start_transaction().
See Custom Instrumentation for more info.
import sentry_sdk
def some_function():
with sentry_sdk.start_transaction(op="task", name="Test Transaction"):
...
import sentry_sdk
def some_function():
with sentry_sdk.start_transaction(op="task", name="Test Transaction"):
...
Let's test your setup and confirm that data reaches your Sentry project.
Errors triggered from a Python shell like IPython will not trigger Sentry's error monitoring. Make sure you're running the examples from a file instead.
To verify that Sentry captures errors and creates issues in your Sentry project, add this intentional error to your application:
import sentry_sdk
division_by_zero = 1 / 0
import sentry_sdk
division_by_zero = 1 / 0
To test your tracing configuration, create a custom transaction and span:
import sentry_sdk
with sentry_sdk.start_transaction(op="task", name="Transaction Name"):
span = sentry_sdk.start_span(name="Custom Span Name")
span.finish()
import sentry_sdk
with sentry_sdk.start_transaction(op="task", name="Transaction Name"):
span = sentry_sdk.start_span(name="Custom Span Name")
span.finish()
To verify that Sentry catches your logs, add some log statements to your application:
import sentry_sdk
sentry_sdk.logger.info("This is an info log message")
sentry_sdk.logger.warning("This is a warning message")
sentry_sdk.logger.error("This is an error message")
import sentry_sdk
sentry_sdk.logger.info("This is an info log message")
sentry_sdk.logger.warning("This is a warning message")
sentry_sdk.logger.error("This is an error message")
Send test metrics from your app to verify metrics are arriving in Sentry:
from sentry_sdk import metrics
metrics.count("checkout.failed", 1)
metrics.gauge("queue.depth", 42)
metrics.distribution("cart.amount_usd", 187.5)
from sentry_sdk import metrics
metrics.count("checkout.failed", 1)
metrics.gauge("queue.depth", 42)
metrics.distribution("cart.amount_usd", 187.5)
Now, head over to your project on Sentry.io to view the collected data (it takes a couple of moments for the data to appear).
At this point, you should have integrated Sentry into your Python application and should already be sending data to your Sentry project.
Now's a good time to customize your setup and look into more advanced topics. Our next recommended steps for you are:
- Explore practical guides on what to monitor, log, track, and investigate after setup
- Continue to customize your configuration
- Learn more about manually capturing errors or messages
- Dive straight into the API with our API docs
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").