From 0c50ec3a1aa1b1d05d1fa197913fac5f5d6ed4e3 Mon Sep 17 00:00:00 2001 From: Naglis Jonaitis Date: Fri, 30 Jun 2017 11:25:27 +0300 Subject: [PATCH] [FIX] sentry: fixes missing `raven` library preventing loading of modules Related: #761 #879 #881 --- sentry/README.rst | 2 +- sentry/__init__.py | 39 +++++++++++++------------ sentry/const.py | 57 ++++++++++++++++++++----------------- sentry/logutils.py | 2 ++ sentry/tests/test_client.py | 2 +- 5 files changed, 56 insertions(+), 46 deletions(-) diff --git a/sentry/README.rst b/sentry/README.rst index 4c41dfb0f..f7f61e14d 100644 --- a/sentry/README.rst +++ b/sentry/README.rst @@ -37,7 +37,7 @@ configuration file: *https://:@sentry.example.com/* This is the only required option in order to use the module. -``sentry_enabled`` Whether or not Sentry logging is enabled. ``True`` +``sentry_enabled`` Whether or not Sentry logging is enabled. ``False`` ``sentry_logging_level`` The minimal logging level for which to send reports to Sentry. ``warn`` Possible values: *notset*, *debug*, *info*, *warn*, *error*, diff --git a/sentry/__init__.py b/sentry/__init__.py index 0d2f0a4c2..fe841dc4a 100644 --- a/sentry/__init__.py +++ b/sentry/__init__.py @@ -11,10 +11,12 @@ from . import const from .logutils import LoggerNameFilter, OdooSentryHandler _logger = logging.getLogger(__name__) +HAS_RAVEN = True try: import raven from raven.middleware import Sentry except ImportError: + HAS_RAVEN = False _logger.debug('Cannot import "raven". Please make sure it is installed.') @@ -29,25 +31,25 @@ def get_odoo_commit(odoo_dir): u'Odoo directory: "%s" not a valid git repository', odoo_dir) -def initialize_raven(config, client_cls=raven.Client): +def initialize_raven(config, client_cls=None): ''' Setup an instance of :class:`raven.Client`. :param config: Sentry configuration :param client: class used to instantiate the raven client. ''' + enabled = config.get('sentry_enabled', False) + if not (HAS_RAVEN and enabled): + return options = { 'release': get_odoo_commit(config.get('sentry_odoo_dir')), } - for option in const.SENTRY_OPTIONS: + for option in const.get_sentry_options(): value = config.get('sentry_%s' % option.key, option.default) if callable(option.converter): value = option.converter(value) options[option.key] = value - client = client_cls(**options) - - enabled = config.get('sentry_enabled', True) level = config.get('sentry_logging_level', const.DEFAULT_LOG_LEVEL) exclude_loggers = const.split_multiple( config.get('sentry_exclude_loggers', const.DEFAULT_EXCLUDE_LOGGERS) @@ -55,21 +57,22 @@ def initialize_raven(config, client_cls=raven.Client): if level not in const.LOG_LEVEL_MAP: level = const.DEFAULT_LOG_LEVEL - if enabled: - handler = OdooSentryHandler( - config.get('sentry_include_context', True), - client=client, - level=const.LOG_LEVEL_MAP[level], - ) - if exclude_loggers: - handler.addFilter(LoggerNameFilter( - exclude_loggers, name='sentry.logger.filter')) - raven.conf.setup_logging(handler) - wsgi_server.application = Sentry( - wsgi_server.application, client=client) + client_cls = client_cls or raven.Client + client = client_cls(**options) + handler = OdooSentryHandler( + config.get('sentry_include_context', True), + client=client, + level=const.LOG_LEVEL_MAP[level], + ) + if exclude_loggers: + handler.addFilter(LoggerNameFilter( + exclude_loggers, name='sentry.logger.filter')) + raven.conf.setup_logging(handler) + wsgi_server.application = Sentry( + wsgi_server.application, client=client) + client.captureMessage('Starting Odoo Server') return client sentry_client = initialize_raven(odoo_config) -sentry_client.captureMessage('Starting Odoo Server') diff --git a/sentry/const.py b/sentry/const.py index 26c141170..5ceb3e2f2 100644 --- a/sentry/const.py +++ b/sentry/const.py @@ -32,14 +32,6 @@ LOG_LEVEL_MAP = dict([ ]) DEFAULT_LOG_LEVEL = 'warn' -DEFAULT_TRANSPORT = 'threaded' -TRANSPORT_CLASS_MAP = { - 'requests_synchronous': raven.transport.RequestsHTTPTransport, - 'requests_threaded': raven.transport.ThreadedRequestsHTTPTransport, - 'synchronous': raven.transport.HTTPTransport, - 'threaded': raven.transport.ThreadedHTTPTransport, -} - ODOO_USER_EXCEPTIONS = [ 'odoo.exceptions.AccessDenied', 'odoo.exceptions.AccessError', @@ -64,21 +56,34 @@ EXCLUDE_LOGGERS = ( ) DEFAULT_EXCLUDE_LOGGERS = ','.join(EXCLUDE_LOGGERS) -SENTRY_OPTIONS = [ - SentryOption('dsn', '', str.strip), - SentryOption('install_sys_hook', False, None), - SentryOption('transport', DEFAULT_TRANSPORT, TRANSPORT_CLASS_MAP.get), - SentryOption('include_paths', '', split_multiple), - SentryOption('exclude_paths', '', split_multiple), - SentryOption('machine', defaults.NAME, None), - SentryOption('auto_log_stacks', defaults.AUTO_LOG_STACKS, None), - SentryOption('capture_locals', defaults.CAPTURE_LOCALS, None), - SentryOption('string_max_length', defaults.MAX_LENGTH_STRING, None), - SentryOption('list_max_length', defaults.MAX_LENGTH_LIST, None), - SentryOption('site', None, None), - SentryOption('include_versions', True, None), - SentryOption( - 'ignore_exceptions', DEFAULT_IGNORED_EXCEPTIONS, split_multiple), - SentryOption('processors', DEFAULT_PROCESSORS, split_multiple), - SentryOption('environment', None, None), -] +DEFAULT_TRANSPORT = 'threaded' + + +def select_transport(name=DEFAULT_TRANSPORT): + return { + 'requests_synchronous': raven.transport.RequestsHTTPTransport, + 'requests_threaded': raven.transport.ThreadedRequestsHTTPTransport, + 'synchronous': raven.transport.HTTPTransport, + 'threaded': raven.transport.ThreadedHTTPTransport, + }.get(name, DEFAULT_TRANSPORT) + + +def get_sentry_options(): + return [ + SentryOption('dsn', '', str.strip), + SentryOption('install_sys_hook', False, None), + SentryOption('transport', DEFAULT_TRANSPORT, select_transport), + SentryOption('include_paths', '', split_multiple), + SentryOption('exclude_paths', '', split_multiple), + SentryOption('machine', defaults.NAME, None), + SentryOption('auto_log_stacks', defaults.AUTO_LOG_STACKS, None), + SentryOption('capture_locals', defaults.CAPTURE_LOCALS, None), + SentryOption('string_max_length', defaults.MAX_LENGTH_STRING, None), + SentryOption('list_max_length', defaults.MAX_LENGTH_LIST, None), + SentryOption('site', None, None), + SentryOption('include_versions', True, None), + SentryOption( + 'ignore_exceptions', DEFAULT_IGNORED_EXCEPTIONS, split_multiple), + SentryOption('processors', DEFAULT_PROCESSORS, split_multiple), + SentryOption('environment', None, None), + ] diff --git a/sentry/logutils.py b/sentry/logutils.py index ad9f65efd..178a518db 100644 --- a/sentry/logutils.py +++ b/sentry/logutils.py @@ -14,6 +14,8 @@ try: from raven.utils.wsgi import get_environ, get_headers except ImportError: _logger.debug('Cannot import "raven". Please make sure it is installed.') + SentryHandler = object + SanitizePasswordsProcessor = object def get_request_info(request): diff --git a/sentry/tests/test_client.py b/sentry/tests/test_client.py index 64b952ec0..69bc1819f 100644 --- a/sentry/tests/test_client.py +++ b/sentry/tests/test_client.py @@ -85,7 +85,7 @@ class TestClientSetup(unittest.TestCase): def test_initialize_raven_sets_dsn(self): config = { - 'sentry_enabled': False, + 'sentry_enabled': True, 'sentry_dsn': 'http://public:secret@example.com/1', } client = initialize_raven(config, client_cls=InMemoryClient)