Projet

Général

Profil

0001-make-it-possible-to-send-crashes-to-sentry-3527.patch

Frédéric Péters, 04 septembre 2013 11:53

Télécharger (3,77 ko)

Voir les différences:

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(-)
wcs/qommon/admin/settings.ptl
131 131
                            (str('html'), _('Display as HTML')) ])
132 132
        form.add(CheckboxWidget, 'logger', title = _('Logger'),
133 133
                value = debug_cfg.get('logger', False))
134
        if get_publisher().can_sentry():
135
            form.add(StringWidget, 'sentry_dsn', title=_('Sentry DSN'),
136
                    value=debug_cfg.get('sentry_dsn', ''))
134 137
        form.add(CheckboxWidget, 'debug_mode', title = _('Enable debug mode'),
135 138
                value = debug_cfg.get('debug_mode', False))
136 139
        form.add(StringWidget, 'mail_redirection', title = _('Mail redirection'),
......
149 152
            form.render()
150 153
        else:
151 154
            cfg_submit(form, 'debug', ('error_email', 'display_exceptions',
152
                                       'logger', 'debug_mode', 'mail_redirection'))
155
                                       'logger', 'debug_mode',
156
                                       'mail_redirection', 'sentry_dsn'))
153 157
            redirect('.')
wcs/qommon/publisher.py
46 46
    except ImportError:
47 47
        ET = None
48 48

  
49
try:
50
    import raven
51
except ImportError:
52
    raven = None
53

  
49 54
from quixote.publish import Publisher, get_request, get_response, get_publisher, redirect
50 55
from http_request import HTTPRequest
51 56
from http_response import HTTPResponse, AfterJob
......
235 240
                        exc_type, exc_value,
236 241
                        tb)
237 242

  
243
        self.notify_sentry(exc_tuple, request=self.get_request(),
244
                context=context)
245

  
238 246
        try:
239 247
            self.logger.log_internal_error(error_summary, plain_error_msg)
240 248
        except socket.error:
......
245 253
            # this could happen on file descriptor exhaustion
246 254
            pass
247 255

  
256
    def can_sentry(self):
257
        return (raven is not None)
258

  
259
    def notify_sentry(self, exc_tuple, request=None, context=None):
260
        if not self.can_sentry:
261
            return
262

  
263
        debug_cfg = self.cfg.get('debug', {})
264
        sentry_dsn = debug_cfg.get('sentry_dsn')
265
        if not sentry_dsn:
266
            return
267

  
268
        client = raven.Client(sentry_dsn)
269
        extra = {}
270
        tags = {}
271
        if context:
272
            extra['context'] = context
273
        if request:
274
            extra['request'] = request.dump()
275
            tags['url'] = request.get_url()
276

  
277
        client.captureException(exc_tuple, extra=extra, tags=tags)
278

  
248 279
    def finish_successful_request(self):
249 280
        Publisher.finish_successful_request(self)
250 281
        self.statsd.increment('successful-request')
......
260 291

  
261 292
        (exc_type, exc_value, tb) = sys.exc_info()
262 293

  
294
        self.notify_sentry((exc_type, exc_value, tb), request)
295

  
263 296
        if exc_type is NotImplementedError:
264 297
            get_response().set_header('Content-Type', 'text/html') # set back content-type
265 298
            return template.error_page(
266
-