mirror of
https://github.com/cookiecutter/cookiecutter-django.git
synced 2025-07-05 21:03:09 +03:00
Migrate to unified Sentry SDK (#1820)
The raven library is deprecated. Replace it by the new sentry-sdk library: https://docs.sentry.io/error-reporting/quickstart/?platform=python fixes #1818
This commit is contained in:
parent
997b22e4ce
commit
7d1e90bdf5
|
@ -45,7 +45,6 @@ DJANGO_AWS_ACCESS_KEY_ID AWS_ACCESS_KEY_ID n/a
|
||||||
DJANGO_AWS_SECRET_ACCESS_KEY AWS_SECRET_ACCESS_KEY n/a raises error
|
DJANGO_AWS_SECRET_ACCESS_KEY AWS_SECRET_ACCESS_KEY n/a raises error
|
||||||
DJANGO_AWS_STORAGE_BUCKET_NAME AWS_STORAGE_BUCKET_NAME n/a raises error
|
DJANGO_AWS_STORAGE_BUCKET_NAME AWS_STORAGE_BUCKET_NAME n/a raises error
|
||||||
SENTRY_DSN SENTRY_DSN n/a raises error
|
SENTRY_DSN SENTRY_DSN n/a raises error
|
||||||
DJANGO_SENTRY_CLIENT SENTRY_CLIENT n/a raven.contrib.django.raven_compat.DjangoClient
|
|
||||||
DJANGO_SENTRY_LOG_LEVEL SENTRY_LOG_LEVEL n/a logging.INFO
|
DJANGO_SENTRY_LOG_LEVEL SENTRY_LOG_LEVEL n/a logging.INFO
|
||||||
MAILGUN_API_KEY MAILGUN_ACCESS_KEY n/a raises error
|
MAILGUN_API_KEY MAILGUN_ACCESS_KEY n/a raises error
|
||||||
MAILGUN_DOMAIN MAILGUN_SENDER_DOMAIN n/a raises error
|
MAILGUN_DOMAIN MAILGUN_SENDER_DOMAIN n/a raises error
|
||||||
|
|
|
@ -1,6 +1,14 @@
|
||||||
{% if cookiecutter.use_sentry == 'y' -%}
|
{% if cookiecutter.use_sentry == 'y' -%}
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
import sentry_sdk
|
||||||
|
|
||||||
|
from sentry_sdk.integrations.django import DjangoIntegration
|
||||||
|
from sentry_sdk.integrations.logging import LoggingIntegration
|
||||||
|
{%- if cookiecutter.use_celery == 'y' %}
|
||||||
|
from sentry_sdk.integrations.celery import CeleryIntegration
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% endif -%}
|
{% endif -%}
|
||||||
from .base import * # noqa
|
from .base import * # noqa
|
||||||
from .base import env
|
from .base import env
|
||||||
|
@ -175,7 +183,6 @@ COMPRESS_ENABLED = env.bool("COMPRESS_ENABLED", default=True)
|
||||||
COMPRESS_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
|
COMPRESS_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
|
||||||
# https://django-compressor.readthedocs.io/en/latest/settings/#django.conf.settings.COMPRESS_URL
|
# https://django-compressor.readthedocs.io/en/latest/settings/#django.conf.settings.COMPRESS_URL
|
||||||
COMPRESS_URL = STATIC_URL
|
COMPRESS_URL = STATIC_URL
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{%- if cookiecutter.use_whitenoise == 'n' -%}
|
{%- if cookiecutter.use_whitenoise == 'n' -%}
|
||||||
# Collectfast
|
# Collectfast
|
||||||
|
@ -183,81 +190,16 @@ COMPRESS_URL = STATIC_URL
|
||||||
# https://github.com/antonagestam/collectfast#installation
|
# https://github.com/antonagestam/collectfast#installation
|
||||||
INSTALLED_APPS = ["collectfast"] + INSTALLED_APPS # noqa F405
|
INSTALLED_APPS = ["collectfast"] + INSTALLED_APPS # noqa F405
|
||||||
AWS_PRELOAD_METADATA = True
|
AWS_PRELOAD_METADATA = True
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{%- if cookiecutter.use_sentry == 'y' -%}
|
|
||||||
# raven
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
# https://docs.sentry.io/clients/python/integrations/django/
|
|
||||||
INSTALLED_APPS += ["raven.contrib.django.raven_compat"] # noqa F405
|
|
||||||
MIDDLEWARE = ["raven.contrib.django.raven_compat.middleware.SentryResponseErrorIdMiddleware"] + MIDDLEWARE
|
|
||||||
|
|
||||||
# Sentry
|
|
||||||
# ------------------------------------------------------------------------------
|
|
||||||
SENTRY_DSN = env("SENTRY_DSN")
|
|
||||||
SENTRY_CLIENT = env("DJANGO_SENTRY_CLIENT", default="raven.contrib.django.raven_compat.DjangoClient")
|
|
||||||
LOGGING = {
|
|
||||||
"version": 1,
|
|
||||||
"disable_existing_loggers": True,
|
|
||||||
"root": {
|
|
||||||
"level": "WARNING",
|
|
||||||
"handlers": ["sentry"],
|
|
||||||
},
|
|
||||||
"formatters": {
|
|
||||||
"verbose": {
|
|
||||||
"format": "%(levelname)s %(asctime)s %(module)s "
|
|
||||||
"%(process)d %(thread)d %(message)s"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"handlers": {
|
|
||||||
"sentry": {
|
|
||||||
"level": "ERROR",
|
|
||||||
"class": "raven.contrib.django.raven_compat.handlers.SentryHandler",
|
|
||||||
},
|
|
||||||
"console": {
|
|
||||||
"level": "DEBUG",
|
|
||||||
"class": "logging.StreamHandler",
|
|
||||||
"formatter": "verbose",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"loggers": {
|
|
||||||
"django.db.backends": {
|
|
||||||
"level": "ERROR",
|
|
||||||
"handlers": ["console"],
|
|
||||||
"propagate": False,
|
|
||||||
},
|
|
||||||
"raven": {
|
|
||||||
"level": "DEBUG",
|
|
||||||
"handlers": ["console"],
|
|
||||||
"propagate": False,
|
|
||||||
},
|
|
||||||
"sentry.errors": {
|
|
||||||
"level": "DEBUG",
|
|
||||||
"handlers": ["console"],
|
|
||||||
"propagate": False,
|
|
||||||
},
|
|
||||||
"django.security.DisallowedHost": {
|
|
||||||
"level": "ERROR",
|
|
||||||
"handlers": ["console", "sentry"],
|
|
||||||
"propagate": False,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
SENTRY_CELERY_LOGLEVEL = env.int("DJANGO_SENTRY_LOG_LEVEL", logging.INFO)
|
|
||||||
RAVEN_CONFIG = {
|
|
||||||
"dsn": SENTRY_DSN
|
|
||||||
}
|
|
||||||
|
|
||||||
{%- else %}
|
|
||||||
# LOGGING
|
# LOGGING
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#logging
|
# https://docs.djangoproject.com/en/dev/ref/settings/#logging
|
||||||
|
# See https://docs.djangoproject.com/en/dev/topics/logging for
|
||||||
|
# more details on how to customize your logging configuration.
|
||||||
|
{% if cookiecutter.use_sentry == 'n' -%}
|
||||||
# A sample logging configuration. The only tangible logging
|
# A sample logging configuration. The only tangible logging
|
||||||
# performed by this configuration is to send an email to
|
# performed by this configuration is to send an email to
|
||||||
# the site admins on every HTTP 500 error when DEBUG=False.
|
# the site admins on every HTTP 500 error when DEBUG=False.
|
||||||
# See https://docs.djangoproject.com/en/dev/topics/logging for
|
|
||||||
# more details on how to customize your logging configuration.
|
|
||||||
LOGGING = {
|
LOGGING = {
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"disable_existing_loggers": False,
|
"disable_existing_loggers": False,
|
||||||
|
@ -293,7 +235,57 @@ LOGGING = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
{% else %}
|
||||||
|
LOGGING = {
|
||||||
|
"version": 1,
|
||||||
|
"disable_existing_loggers": True,
|
||||||
|
"formatters": {
|
||||||
|
"verbose": {
|
||||||
|
"format": "%(levelname)s %(asctime)s %(module)s "
|
||||||
|
"%(process)d %(thread)d %(message)s"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"handlers": {
|
||||||
|
"console": {
|
||||||
|
"level": "DEBUG",
|
||||||
|
"class": "logging.StreamHandler",
|
||||||
|
"formatter": "verbose",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"loggers": {
|
||||||
|
"django.db.backends": {
|
||||||
|
"level": "ERROR",
|
||||||
|
"handlers": ["console"],
|
||||||
|
"propagate": False,
|
||||||
|
},
|
||||||
|
# Errors logged by the SDK itself
|
||||||
|
"sentry_sdk": {"level": "ERROR", "handlers": ["console"], "propagate": False},
|
||||||
|
"django.security.DisallowedHost": {
|
||||||
|
"level": "ERROR",
|
||||||
|
"handlers": ["console"],
|
||||||
|
"propagate": False,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# Sentry
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
SENTRY_DSN = env("SENTRY_DSN")
|
||||||
|
SENTRY_LOG_LEVEL = env.int("DJANGO_SENTRY_LOG_LEVEL", logging.INFO)
|
||||||
|
|
||||||
|
sentry_logging = LoggingIntegration(
|
||||||
|
level=SENTRY_LOG_LEVEL, # Capture info and above as breadcrumbs
|
||||||
|
event_level=None, # Send no events from log messages
|
||||||
|
)
|
||||||
|
|
||||||
|
{%- if cookiecutter.use_celery == 'y' %}
|
||||||
|
sentry_sdk.init(
|
||||||
|
dsn=SENTRY_DSN,
|
||||||
|
integrations=[sentry_logging, DjangoIntegration(), CeleryIntegration()],
|
||||||
|
)
|
||||||
|
{% else %}
|
||||||
|
sentry_sdk.init(dsn=SENTRY_DSN, integrations=[sentry_logging, DjangoIntegration()])
|
||||||
|
{% endif -%}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
# Your stuff...
|
# Your stuff...
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
|
@ -24,10 +24,6 @@ app_path = os.path.abspath(
|
||||||
os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir)
|
os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir)
|
||||||
)
|
)
|
||||||
sys.path.append(os.path.join(app_path, "{{ cookiecutter.project_slug }}"))
|
sys.path.append(os.path.join(app_path, "{{ cookiecutter.project_slug }}"))
|
||||||
{% if cookiecutter.use_sentry == 'y' -%}
|
|
||||||
if os.environ.get("DJANGO_SETTINGS_MODULE") == "config.settings.production":
|
|
||||||
from raven.contrib.django.raven_compat.middleware.wsgi import Sentry
|
|
||||||
{%- endif %}
|
|
||||||
# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
|
# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
|
||||||
# if running multiple sites in the same mod_wsgi process. To fix this, use
|
# if running multiple sites in the same mod_wsgi process. To fix this, use
|
||||||
# mod_wsgi daemon mode with each site in its own daemon process, or use
|
# mod_wsgi daemon mode with each site in its own daemon process, or use
|
||||||
|
@ -38,10 +34,6 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
|
||||||
# file. This includes Django's development server, if the WSGI_APPLICATION
|
# file. This includes Django's development server, if the WSGI_APPLICATION
|
||||||
# setting points here.
|
# setting points here.
|
||||||
application = get_wsgi_application()
|
application = get_wsgi_application()
|
||||||
{% if cookiecutter.use_sentry == 'y' -%}
|
|
||||||
if os.environ.get("DJANGO_SETTINGS_MODULE") == "config.settings.production":
|
|
||||||
application = Sentry(application)
|
|
||||||
{%- endif %}
|
|
||||||
# Apply WSGI middleware here.
|
# Apply WSGI middleware here.
|
||||||
# from helloworld.wsgi import HelloWorldApplication
|
# from helloworld.wsgi import HelloWorldApplication
|
||||||
# application = HelloWorldApplication(application)
|
# application = HelloWorldApplication(application)
|
||||||
|
|
|
@ -8,10 +8,10 @@ psycopg2==2.7.4 --no-binary psycopg2 # https://github.com/psycopg/psycopg2
|
||||||
Collectfast==0.6.2 # https://github.com/antonagestam/collectfast
|
Collectfast==0.6.2 # https://github.com/antonagestam/collectfast
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{%- if cookiecutter.use_sentry == "y" %}
|
{%- if cookiecutter.use_sentry == "y" %}
|
||||||
raven==6.10.0 # https://github.com/getsentry/raven-python
|
sentry-sdk==0.7.6 # https://github.com/getsentry/sentry-python
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
# Django
|
# Django
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
django-storages[boto3]==1.7.1 # https://github.com/jschneier/django-storages
|
django-storages[boto3]==1.7.1 # https://github.com/jschneier/django-storages
|
||||||
django-anymail[mailgun]==5.0 # https://github.com/anymail/django-anymail
|
django-anymail[mailgun]==5.0 # https://github.com/anymail/django-anymail
|
||||||
|
|
|
@ -27,28 +27,6 @@ class CeleryAppConfig(AppConfig):
|
||||||
def ready(self):
|
def ready(self):
|
||||||
installed_apps = [app_config.name for app_config in apps.get_app_configs()]
|
installed_apps = [app_config.name for app_config in apps.get_app_configs()]
|
||||||
app.autodiscover_tasks(lambda: installed_apps, force=True)
|
app.autodiscover_tasks(lambda: installed_apps, force=True)
|
||||||
{%- if cookiecutter.use_sentry == 'y' %}
|
|
||||||
|
|
||||||
if hasattr(settings, 'RAVEN_CONFIG'):
|
|
||||||
# Celery signal registration
|
|
||||||
{% if cookiecutter.use_pycharm == 'y' -%}
|
|
||||||
# Since raven is required in production only,
|
|
||||||
# imports might (most surely will) be wiped out
|
|
||||||
# during PyCharm code clean up started
|
|
||||||
# in other environments.
|
|
||||||
# @formatter:off
|
|
||||||
{%- endif %}
|
|
||||||
from raven import Client as RavenClient
|
|
||||||
from raven.contrib.celery import register_signal as raven_register_signal
|
|
||||||
from raven.contrib.celery import register_logger_signal as raven_register_logger_signal
|
|
||||||
{% if cookiecutter.use_pycharm == 'y' -%}
|
|
||||||
# @formatter:on
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
raven_client = RavenClient(dsn=settings.RAVEN_CONFIG['dsn'])
|
|
||||||
raven_register_logger_signal(raven_client)
|
|
||||||
raven_register_signal(raven_client)
|
|
||||||
{%- endif %}
|
|
||||||
|
|
||||||
|
|
||||||
@app.task(bind=True)
|
@app.task(bind=True)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user