clay/sentry.py (40 lines of code) (raw):
from __future__ import absolute_import
import raven.utils.wsgi
import raven
from clay import config
log = config.get_logger('clay.sentry')
client = None
def get_sentry_client():
global client
if client:
return client
dsn = config.get('sentry.url', None)
if not dsn:
return
client = raven.Client(dsn=dsn)
return client
def exception(exc_info, request=None, event_id=None, **extra):
try:
_exception(exc_info, request=request, event_id=event_id, **extra)
except:
log.exception('Unable to send event to sentry')
def _exception(exc_info, request=None, event_id=None, **extra):
client = get_sentry_client()
if not client:
# return silently if sentry isn't configured
return
if request is not None:
environ = request.environ
client.capture('Exception', data={
'sentry.interfaces.Http': {
'method': request.method,
'url': request.base_url,
'data': request.data,
'query_string': environ.get('QUERY_STRING', ''),
'headers': dict(raven.utils.wsgi.get_headers(environ)),
'env': dict(raven.utils.wsgi.get_environ(environ)),
},
'logger': extra.get("logger", "sentry"),
}, extra=extra, exc_info=exc_info, event_id=event_id)
else:
client.captureException(exc_info, extra=extra,
event_id=event_id)