def _emit(self, record, **kwargs): data = {} extra = getattr(record, 'data', None) if not isinstance(extra, dict): if extra: extra = {'data': extra} else: extra = {} for k, v in iteritems(vars(record)): if k in RESERVED: continue if k.startswith('_'): continue if '.' not in k and k not in ('culprit', 'server_name', 'fingerprint'): 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'] = text_type(record.msg) except UnicodeDecodeError: handler_kwargs['message'] = repr(record.msg)[1:-1] try: handler_kwargs['formatted'] = text_type(record.message) except UnicodeDecodeError: handler_kwargs['formatted'] = repr(record.message)[1:-1] if record.exc_info and all(record.exc_info): 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} 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 if hasattr(record, 'tags'): kwargs['tags'] = record.tags elif self.tags: kwargs['tags'] = self.tags 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 = {} 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', 'fingerprint'): 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 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} # 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 if hasattr(record, 'tags'): kwargs['tags'] = record.tags elif self.tags: kwargs['tags'] = self.tags 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 = {} 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',): 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) date = datetime.datetime.utcfromtimestamp(record.created) event_type = 'raven.events.Message' handler_kwargs = { 'message': record.msg, 'params': record.args, 'formatted': record.message, } # 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 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} # HACK: discover a culprit when we normally couldn't elif not (data.get('sentry.interfaces.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 if hasattr(record, 'tags'): kwargs['tags'] = record.tags 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 = {} for k, v in record.__dict__.iteritems(): if '.' not in k and k not in ('culprit', ): continue data[k] = v stack = getattr(record, 'stack', None) if stack is True: stack = iter_stack_frames() if stack: # we might need to traverse this multiple times, so coerce it to a list stack = list(stack) frames = [] started = False last_mod = '' for item in stack: if isinstance(item, (list, tuple)): frame, lineno = item else: frame, lineno = item, item.f_lineno if not started: f_globals = getattr(frame, 'f_globals', {}) module_name = f_globals.get('__name__', '') if (last_mod and last_mod.startswith('logging')) \ and not module_name.startswith('logging'): started = True else: last_mod = module_name continue frames.append((frame, lineno)) # We must've not found a starting point if not frames: frames = stack stack = frames extra = getattr(record, 'data', None) if not isinstance(extra, dict): if extra: extra = {'data': extra} else: extra = {} # Add in all of the data from the record that we aren't already capturing for k in record.__dict__.keys(): if k in RESERVED: continue if k.startswith('_'): continue extra[k] = record.__dict__[k] date = datetime.datetime.utcfromtimestamp(record.created) event_type = 'raven.events.Message' handler_kwargs = {'message': record.msg, 'params': record.args} # 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 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)) # ensure message is propagated, otherwise the exception will overwrite it data['message'] = handler.to_string(data) event_type = 'raven.events.Exception' handler_kwargs = {'exc_info': record.exc_info} # HACK: discover a culprit when we normally couldn't elif not (data.get('sentry.interfaces.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 if hasattr(record, 'tags'): kwargs['tags'] = record.tags 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 = {} for k, v in record.__dict__.iteritems(): if '.' not in k and k not in ('culprit',): continue data[k] = v stack = getattr(record, 'stack', None) if stack is True: stack = iter_stack_frames() if stack: # we might need to traverse this multiple times, so coerce it to a list stack = list(stack) frames = [] started = False last_mod = '' for item in stack: if isinstance(item, (list, tuple)): frame, lineno = item else: frame, lineno = item, item.f_lineno if not started: f_globals = getattr(frame, 'f_globals', {}) module_name = f_globals.get('__name__', '') if (last_mod and last_mod.startswith('logging')) \ and not module_name.startswith('logging'): started = True else: last_mod = module_name continue frames.append((frame, lineno)) # We must've not found a starting point if not frames: frames = stack stack = frames extra = getattr(record, 'data', None) if not isinstance(extra, dict): if extra: extra = {'data': extra} else: extra = {} # Add in all of the data from the record that we aren't already capturing for k in record.__dict__.keys(): if k in RESERVED: continue if k.startswith('_'): continue extra[k] = record.__dict__[k] date = datetime.datetime.utcfromtimestamp(record.created) event_type = 'raven.events.Message' handler_kwargs = {'message': record.msg, 'params': record.args} # 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 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)) # ensure message is propagated, otherwise the exception will overwrite it data['message'] = record.message event_type = 'raven.events.Exception' handler_kwargs = {'exc_info': record.exc_info} # HACK: discover a culprit when we normally couldn't elif not (data.get('sentry.interfaces.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 if hasattr(record, 'tags'): kwargs['tags'] = record.tags 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 = {} 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 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} # 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 if hasattr(record, "tags"): kwargs["tags"] = record.tags 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 )