From 78a756fca9ae483cb58c5e3438c4f3207939951d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 3 Sep 2013 17:50:34 +0200 Subject: [PATCH] make it possible to send crashes to sentry (#3527) --- wcs/qommon/admin/settings.ptl | 6 +++++- wcs/qommon/publisher.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/wcs/qommon/admin/settings.ptl b/wcs/qommon/admin/settings.ptl index 009cfc3..fb025b3 100644 --- a/wcs/qommon/admin/settings.ptl +++ b/wcs/qommon/admin/settings.ptl @@ -131,6 +131,9 @@ class SettingsDirectory(AccessControlled, Directory): (str('html'), _('Display as HTML')) ]) form.add(CheckboxWidget, 'logger', title = _('Logger'), value = debug_cfg.get('logger', False)) + if get_publisher().can_sentry(): + form.add(StringWidget, 'sentry_dsn', title=_('Sentry DSN'), + value=debug_cfg.get('sentry_dsn', '')) form.add(CheckboxWidget, 'debug_mode', title = _('Enable debug mode'), value = debug_cfg.get('debug_mode', False)) form.add(StringWidget, 'mail_redirection', title = _('Mail redirection'), @@ -149,5 +152,6 @@ class SettingsDirectory(AccessControlled, Directory): form.render() else: cfg_submit(form, 'debug', ('error_email', 'display_exceptions', - 'logger', 'debug_mode', 'mail_redirection')) + 'logger', 'debug_mode', + 'mail_redirection', 'sentry_dsn')) redirect('.') diff --git a/wcs/qommon/publisher.py b/wcs/qommon/publisher.py index ed7cc4b..83456ef 100644 --- a/wcs/qommon/publisher.py +++ b/wcs/qommon/publisher.py @@ -46,6 +46,11 @@ except ImportError: except ImportError: ET = None +try: + import raven +except ImportError: + raven = None + from quixote.publish import Publisher, get_request, get_response, get_publisher, redirect from http_request import HTTPRequest from http_response import HTTPResponse, AfterJob @@ -235,6 +240,9 @@ class QommonPublisher(Publisher): exc_type, exc_value, tb) + self.notify_sentry(exc_tuple, request=self.get_request(), + context=context) + try: self.logger.log_internal_error(error_summary, plain_error_msg) except socket.error: @@ -245,6 +253,29 @@ class QommonPublisher(Publisher): # this could happen on file descriptor exhaustion pass + def can_sentry(self): + return (raven is not None) + + def notify_sentry(self, exc_tuple, request=None, context=None): + if not self.can_sentry: + return + + debug_cfg = self.cfg.get('debug', {}) + sentry_dsn = debug_cfg.get('sentry_dsn') + if not sentry_dsn: + return + + client = raven.Client(sentry_dsn) + extra = {} + tags = {} + if context: + extra['context'] = context + if request: + extra['request'] = request.dump() + tags['url'] = request.get_url() + + client.captureException(exc_tuple, extra=extra, tags=tags) + def finish_successful_request(self): Publisher.finish_successful_request(self) self.statsd.increment('successful-request') @@ -260,6 +291,8 @@ class QommonPublisher(Publisher): (exc_type, exc_value, tb) = sys.exc_info() + self.notify_sentry((exc_type, exc_value, tb), request) + if exc_type is NotImplementedError: get_response().set_header('Content-Type', 'text/html') # set back content-type return template.error_page( -- 1.8.4.rc3