def from_exc_info(self, exc_info=None): if exc_info is None: # Retrieve `exc_info` of last exception exc_info = sys.exc_info() # Create exception exception = self.model( type=ErrorHasher.exc_type(exc_info[0]), message=ErrorHasher.exc_message(exc_info[1]), traceback=ErrorHasher.exc_traceback(exc_info[2]), timestamp=datetime.utcnow(), version_base=VERSION_BASE, version_branch=VERSION_BRANCH ) # Calculate exception hash exception.hash = ErrorHasher.hash(exception) # Create/Lookup message for exception exception.error = MessageManager.get.from_exception(exception) # Save exception details exception.save() return exception, exception.error
def from_message(self, message): match = RE_TRACEBACK.match(message) if match is None: return # Create exception exception = self.model(type=match.group('type'), message=match.group('message'), traceback=self.strip_traceback( match.group('traceback')), timestamp=datetime.utcnow(), version_base=VERSION_BASE, version_branch=VERSION_BRANCH) # Calculate exception hash exception.hash = ErrorHasher.hash(exception) # Create/Lookup message for exception exception.error = MessageManager.get.from_exception(exception) # Save exception details exception.save() return exception, exception.error
def from_message(self, message): match = RE_TRACEBACK.match(message) if match is None: return # Create exception exception = self.model( type=match.group('type'), message=match.group('message'), traceback=self.strip_traceback(match.group('traceback')), timestamp=datetime.utcnow(), version_base=VERSION_BASE, version_branch=VERSION_BRANCH ) # Calculate exception hash exception.hash = ErrorHasher.hash(exception) # Create/Lookup message for exception exception.error = MessageManager.get.from_exception(exception) # Save exception details exception.save() return exception, exception.error
def from_exc_info(self, exc_info=None): if exc_info is None: # Retrieve `exc_info` of last exception exc_info = sys.exc_info() # Parse exception message_type = Message.Type.Exception try: message_type, exc_info = self._parse_exception(exc_info) except Exception as ex: log.warn('Unable to parse exception: %s', ex, exc_info=True) # Create exception exception = self.model( type=ErrorHasher.exc_type(exc_info[0]), message=ErrorHasher.exc_message(exc_info[1]), traceback=ErrorHasher.exc_traceback(exc_info[2]), timestamp=datetime.utcnow(), version_base=VERSION_BASE, version_branch=VERSION_BRANCH ) # Calculate exception hash exception.hash = ErrorHasher.hash( exception, include_traceback=message_type == Message.Type.Exception ) # Create/Lookup message for exception exception.error = MessageManager.get.from_exception( exception, message_type=message_type ) # Save exception details exception.save() return exception, exception.error
def from_exc_info(self, exc_info=None): if exc_info is None: # Retrieve `exc_info` of last exception exc_info = sys.exc_info() # Create exception exception = self.model(type=ErrorHasher.exc_type(exc_info[0]), message=ErrorHasher.exc_message(exc_info[1]), traceback=ErrorHasher.exc_traceback( exc_info[2]), timestamp=datetime.utcnow(), version_base=VERSION_BASE, version_branch=VERSION_BRANCH) # Calculate exception hash exception.hash = ErrorHasher.hash(exception) # Create/Lookup message for exception exception.error = MessageManager.get.from_exception(exception) # Save exception details exception.save() return exception, exception.error
def _emit(self, record, **kwargs): data, extra = extract_extra(record) # Use client name as default user id data.setdefault('user', {'id': self.client.name}) # Retrieve stack stack = getattr(record, 'stack', None) if stack is True: stack = iter_stack_frames() if stack: stack = self._get_targetted_stack(stack, record) # Build message date = datetime.datetime.utcfromtimestamp(record.created) event_type = 'raven.events.Message' handler_kwargs = { 'params': record.args, } try: handler_kwargs['message'] = text_type(record.msg) except UnicodeDecodeError: # Handle binary strings where it should be unicode... handler_kwargs['message'] = repr(record.msg)[1:-1] try: handler_kwargs['formatted'] = text_type(record.message) except UnicodeDecodeError: # Handle binary strings where it should be unicode... handler_kwargs['formatted'] = repr(record.message)[1:-1] # Retrieve exception information from record try: exc_info = self._exc_info(record) except Exception as ex: log.info('Unable to retrieve exception info - %s', ex, exc_info=True) exc_info = None # Parse exception information exception_hash = None # If there's no exception being processed, exc_info may be a 3-tuple of None # http://docs.python.org/library/sys.html#sys.exc_info if exc_info and len(exc_info) == 3 and all(exc_info): message = handler_kwargs.get('formatted') # Replace exception messages with more helpful details if not record.exc_info and message and RE_TRACEBACK_HEADER.match(message): # Generate new record title handler_kwargs['formatted'] = '%s\n\n%s' % ( self._generate_title(record, exc_info), message ) elif not record.exc_info: log.debug("Message %r doesn't match traceback header", message) # capture the standard message first so that we ensure # the event is recorded as an exception, in addition to having our # message interface attached handler = self.client.get_handler(event_type) data.update(handler.capture(**handler_kwargs)) event_type = 'raven.events.Exception' handler_kwargs = {'exc_info': exc_info} # Calculate exception hash exception_hash = ErrorHasher.hash(exc_info=exc_info) # HACK: discover a culprit when we normally couldn't elif not (data.get('stacktrace') or data.get('culprit')) and (record.name or record.funcName): culprit = self._label_from_frame({'module': record.name, 'function': record.funcName}) if culprit: data['culprit'] = culprit data['level'] = record.levelno data['logger'] = record.name # Store record `tags` in message if hasattr(record, 'tags'): kwargs['tags'] = record.tags elif self.tags: kwargs['tags'] = self.tags # Store `exception_hash` in message (if defined) if exception_hash: if 'tags' not in kwargs: kwargs['tags'] = {} kwargs['tags']['exception.hash'] = exception_hash kwargs.update(handler_kwargs) return self.client.capture( event_type, stack=stack, data=data, extra=extra, date=date, **kwargs )
def _emit(self, record, **kwargs): data = { 'user': {'id': self.client.name} } extra = getattr(record, 'data', None) if not isinstance(extra, dict): if extra: extra = {'data': extra} else: extra = {} for k, v in six.iteritems(vars(record)): if k in RESERVED: continue if k.startswith('_'): continue if '.' not in k and k not in ('culprit', 'server_name'): extra[k] = v else: data[k] = v stack = getattr(record, 'stack', None) if stack is True: stack = iter_stack_frames() if stack: stack = self._get_targetted_stack(stack, record) date = datetime.datetime.utcfromtimestamp(record.created) event_type = 'raven.events.Message' handler_kwargs = { 'params': record.args, } try: handler_kwargs['message'] = six.text_type(record.msg) except UnicodeDecodeError: # Handle binary strings where it should be unicode... handler_kwargs['message'] = repr(record.msg)[1:-1] try: handler_kwargs['formatted'] = six.text_type(record.message) except UnicodeDecodeError: # Handle binary strings where it should be unicode... handler_kwargs['formatted'] = repr(record.message)[1:-1] # If there's no exception being processed, exc_info may be a 3-tuple of None # http://docs.python.org/library/sys.html#sys.exc_info exception_hash = None if record.exc_info and all(record.exc_info): # capture the standard message first so that we ensure # the event is recorded as an exception, in addition to having our # message interface attached handler = self.client.get_handler(event_type) data.update(handler.capture(**handler_kwargs)) event_type = 'raven.events.Exception' handler_kwargs = {'exc_info': record.exc_info} # Calculate exception hash exception_hash = ErrorHasher.hash(exc_info=record.exc_info) # HACK: discover a culprit when we normally couldn't elif not (data.get('stacktrace') or data.get('culprit')) and (record.name or record.funcName): culprit = label_from_frame({'module': record.name, 'function': record.funcName}) if culprit: data['culprit'] = culprit data['level'] = record.levelno data['logger'] = record.name # Store record `tags` in message if hasattr(record, 'tags'): kwargs['tags'] = record.tags if exception_hash: # Store `exception_hash` in message if 'tags' not in kwargs: kwargs['tags'] = {} kwargs['tags']['exception.hash'] = exception_hash kwargs.update(handler_kwargs) return self.client.capture( event_type, stack=stack, data=data, extra=extra, date=date, **kwargs )
class ErrorReporterHandler(SentryHandler): def _emit(self, record, **kwargs): data = { 'user': {'id': self.client.name} } extra = getattr(record, 'data', None) if not isinstance(extra, dict): if extra: extra = {'data': extra} else: extra = {} for k, v in six.iteritems(vars(record)): if k in RESERVED: continue if k.startswith('_'): continue if '.' not in k and k not in ('culprit', 'server_name'): extra[k] = v else: data[k] = v stack = getattr(record, 'stack', None) if stack is True: stack = iter_stack_frames() if stack: stack = self._get_targetted_stack(stack, record) date = datetime.datetime.utcfromtimestamp(record.created) event_type = 'raven.events.Message' handler_kwargs = { 'params': record.args, } try: handler_kwargs['message'] = six.text_type(record.msg) except UnicodeDecodeError: # Handle binary strings where it should be unicode... handler_kwargs['message'] = repr(record.msg)[1:-1] try: handler_kwargs['formatted'] = six.text_type(record.message) except UnicodeDecodeError: # Handle binary strings where it should be unicode... handler_kwargs['formatted'] = repr(record.message)[1:-1] # If there's no exception being processed, exc_info may be a 3-tuple of None # http://docs.python.org/library/sys.html#sys.exc_info try: exc_info = self._exc_info(record) except Exception, ex: log.info('Unable to retrieve exception info - %s', ex, exc_info=True) exc_info = None exception_hash = None if exc_info and len(exc_info) == 3 and all(exc_info): message = handler_kwargs.get('formatted') # Replace exception messages with more helpful details if not record.exc_info and message and RE_TRACEBACK_HEADER.match(message): # Generate new record title handler_kwargs['formatted'] = '%s\n\n%s' % ( self._generate_title(record, exc_info), message ) elif not record.exc_info: log.debug("Message %r doesn't match traceback header", message) # capture the standard message first so that we ensure # the event is recorded as an exception, in addition to having our # message interface attached handler = self.client.get_handler(event_type) data.update(handler.capture(**handler_kwargs)) event_type = 'raven.events.Exception' handler_kwargs = {'exc_info': exc_info} # Calculate exception hash exception_hash = ErrorHasher.hash(exc_info=exc_info) # HACK: discover a culprit when we normally couldn't elif not (data.get('stacktrace') or data.get('culprit')) and (record.name or record.funcName): culprit = label_from_frame({'module': record.name, 'function': record.funcName}) if culprit: data['culprit'] = culprit data['level'] = record.levelno data['logger'] = record.name # Store record `tags` in message if hasattr(record, 'tags'): kwargs['tags'] = record.tags if exception_hash: # Store `exception_hash` in message if 'tags' not in kwargs: kwargs['tags'] = {} kwargs['tags']['exception.hash'] = exception_hash kwargs.update(handler_kwargs) return self.client.capture( event_type, stack=stack, data=data, extra=extra, date=date, **kwargs )