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