Запретить Raven стрелять в указанные исключения для Sentry

Когда моя база данных выходит из строя, Sentry мгновенно оказывается переполненным OperationalError: could not connect to server: Connection refused psycopg2. Поскольку OperationalError может быть брошен в других случаях, кроме недоступных баз данных, я не могу просто игнорировать его, используя RAVEN_CONFIG IGNORE_EXCEPTIONS.

Я пытался написать фильтр для ведения журнала Django, но он просто не не работает. Он правильно перехватывает исключение, но все же каким-то образом всплывает. Вот фильтр:

def skip_unreachable_database(record):
    """Avoid flooding Sentry when the database is down"""
    if record.exc_info:
        print '>>>', record.exc_info
        exc_type, exc_value = record.exc_info[:2]
        if isinstance(exc_value, OperationalError) and exc_value.message.lower().startswith('could not connect to server: connection refused'):
            return False
    return True

Существует билет о том, что фильтрация не работает с Raven, но он был закрыт.

Есть идеи, как я могу это обойти?


person Anto    schedule 18.09.2014    source источник


Ответы (1)


Вот как я это понял (пока):

1 / отфильтровать все OperationalError, используя конфигурацию Raven:

RAVEN_CONFIG = {
    # [...]
    'IGNORE_EXCEPTIONS': [
        'OperationalError',
    ],
}

2 / добавьте специальный фильтр, регистратор и файл журнала для этих исключений, чтобы они не потерялись:

def operational_errors_only(record):
    """Only catch OperationalError exceptions"""
    if record.exc_info:
        exc_type, exc_value = record.exc_info[:2]
        if isinstance(exc_value, OperationalError):
            return True
    return False

LOGGING = {
    # [...]
    'filters': {
        'operational_errors_only': {
            '()': 'django.utils.log.CallbackFilter',
            'callback': operational_errors_only,
        },
    },
    'handlers': {
        'operationalerrors': {
            'mode': 'a',
            'class': 'common_src.logutils.FallbackWatchedFileHandler',
            'filename': '/path/to/operationalerrors.log',
            'formatter': 'verbose',
            'filters': ['operational_errors_only'],
        },
    },
    'loggers': {
        '': {
            'handlers': ['console', 'sentry', 'operationalerrors'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}
person Anto    schedule 22.09.2014