2014-09-18 2 views
0

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

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

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 

Существует a ticket about filtering not working with Raven, но он был закрыт.

Любая идея, как я мог это решить?

ответ

0

Вот как я понял это (сейчас):

1/отфильтровать все OperationalError с использованием конфигурации Ворона:

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, 
     }, 
    }, 
}