from django.conf import settings
|
|
|
def event_processor(event, hint):
|
# skip all transactions without exceptions, unless it's a log record
|
if 'exc_info' not in hint:
|
# special flag inside of logger.error(..., extra={'sentry_force': True}) to force sentry to log the error
|
if 'log_record' in hint and event.get('extra', {}).get('sentry_force', False):
|
return event
|
|
return None
|
|
# skip specified exceptions
|
exceptions = event.get('exception', {}).get('values', [{}])
|
last = exceptions[-1]
|
if last.get('type') in settings.SENTRY_IGNORED_EXCEPTIONS:
|
return None
|
|
# sentry ignored factory class
|
if 'SentryIgnored' in last.get('type'):
|
return None
|
|
if last.get('type') == 'OperationalError':
|
value = last.get('value')
|
messages = [
|
'sorry, too many clients already',
|
'Name or service not known',
|
'could not connect to server',
|
'the database system is shutting down',
|
'remaining connection slots are reserved for non-replication superuser connections',
|
'unable to open database file',
|
]
|
for message in messages:
|
if message in value:
|
return None
|
|
if last.get('type') == 'OSError':
|
value = last.get('value')
|
messages = [
|
'Too many open files: ',
|
]
|
for message in messages:
|
if message in value:
|
return None
|
|
# special flag inside of logger.error(..., extra={'sentry_skip': True}) to skip error message
|
if event.get('extra', {}).get('sentry_skip', False):
|
return None
|
|
# skip transactions by urls
|
if event.get('transaction') in [
|
'/static/{path}',
|
'/dm/{path}',
|
'/react-app/{path}',
|
'/label-studio-frontend/{path}',
|
'/favicon.ico',
|
'/health',
|
]:
|
return None
|
|
return event # to return all other events
|
|
|
def init_sentry(release_name, release_version):
|
if settings.SENTRY_DSN:
|
import sentry_sdk
|
from sentry_sdk.integrations.django import DjangoIntegration
|
|
if settings.SENTRY_REDIS_ENABLED:
|
from sentry_sdk.integrations.redis import RedisIntegration
|
from sentry_sdk.integrations.rq import RqIntegration
|
|
advanced = [RedisIntegration(), RqIntegration()]
|
else:
|
advanced = []
|
|
# define the event processor, this runs before before_send if enabled
|
sentry_sdk.scope.add_global_event_processor(event_processor)
|
|
sentry_sdk.init(
|
dsn=settings.SENTRY_DSN,
|
integrations=[DjangoIntegration()] + advanced,
|
traces_sample_rate=settings.SENTRY_RATE,
|
send_default_pii=True,
|
environment=settings.SENTRY_ENVIRONMENT,
|
release=release_name + '@' + str(release_version),
|
)
|