def trace_exception(e): try: exc_info = sys.exc_info() frames = iter_traceback_frames(exc_info[-1]) trace(type_=EventType.exception, exc=str(e), stack=get_stack_info(frames)) except Exception: pass
def capture(self, exc_info=None, **kwargs): if not exc_info or exc_info is True: exc_info = sys.exc_info() if not exc_info: raise ValueError("No exception found") exc_type, exc_value, exc_traceback = exc_info try: frames = get_stack_info(iter_traceback_frames(exc_traceback), transformer=self.transform) exc_module = getattr(exc_type, "__module__", None) if exc_module: exc_module = str(exc_module) exc_type = getattr(exc_type, "__name__", "<unknown>") return { "level": logging.ERROR, "sentry.interfaces.Exception": { "value": to_unicode(exc_value), "type": str(exc_type), "module": to_unicode(exc_module), }, "sentry.interfaces.Stacktrace": {"frames": frames}, } finally: try: del exc_type, exc_value, exc_traceback except Exception as e: self.logger.exception(e)
def capture(self, exc_info=None, **kwargs): new_exc_info = False if not exc_info or exc_info is True: new_exc_info = True exc_info = sys.exc_info() if not exc_info: raise ValueError('No exception found') try: exc_type, exc_value, exc_traceback = exc_info frames = varmap( lambda k, v: shorten(v, string_length=self.client. string_max_length, list_length=self.client.list_max_length), get_stack_info( iter_traceback_frames(exc_traceback), list_max_length=self.client.list_max_length, string_max_length=self.client.string_max_length)) exc_module = getattr(exc_type, '__module__', None) if exc_module: exc_module = str(exc_module) exc_type = getattr(exc_type, '__name__', '<unknown>') finally: if new_exc_info: try: del exc_info del exc_traceback except Exception, e: self.logger.exception(e)
def capture(self, exc_info=None, **kwargs): new_exc_info = False if not exc_info or exc_info is True: new_exc_info = True exc_info = sys.exc_info() if not exc_info: raise ValueError('No exception found') try: exc_type, exc_value, exc_traceback = exc_info frames = varmap(lambda k, v: shorten(v, string_length=self.client.string_max_length, list_length=self.client.list_max_length), get_stack_info(iter_traceback_frames(exc_traceback))) culprit = get_culprit(frames, self.client.include_paths, self.client.exclude_paths) exc_module = getattr(exc_type, '__module__', None) exc_type = getattr(exc_type, '__name__', '<unknown>') finally: if new_exc_info: try: del exc_info del exc_traceback except Exception, e: self.logger.exception(e)
def capture(self, exc_info=None, **kwargs): new_exc_info = False if not exc_info or exc_info is True: new_exc_info = True exc_info = sys.exc_info() if not exc_info: raise ValueError("No exception found") try: exc_type, exc_value, exc_traceback = exc_info frames = varmap( lambda k, v: shorten( v, string_length=self.client.string_max_length, list_length=self.client.list_max_length ), get_stack_info( iter_traceback_frames(exc_traceback), list_max_length=self.client.list_max_length, string_max_length=self.client.string_max_length, ), ) exc_module = getattr(exc_type, "__module__", None) if exc_module: exc_module = str(exc_module) exc_type = getattr(exc_type, "__name__", "<unknown>") finally: if new_exc_info: try: del exc_info del exc_traceback except Exception, e: self.logger.exception(e)
def capture(self, exc_info=None, **kwargs): if not exc_info or exc_info is True: exc_info = sys.exc_info() if not exc_info: raise ValueError('No exception found') exc_type, exc_value, exc_traceback = exc_info try: frames = get_stack_info(iter_traceback_frames(exc_traceback), transformer=self.transform) exc_module = getattr(exc_type, '__module__', None) if exc_module: exc_module = str(exc_module) exc_type = getattr(exc_type, '__name__', '<unknown>') return { 'level': kwargs.get('level', logging.ERROR), 'sentry.interfaces.Exception': { 'value': to_unicode(exc_value), 'type': str(exc_type), 'module': to_unicode(exc_module), }, 'sentry.interfaces.Stacktrace': { 'frames': frames }, } finally: try: del exc_type, exc_value, exc_traceback except Exception as e: self.logger.exception(e)
def capture(self, exc_info=None, **kwargs): if not exc_info or exc_info is True: exc_info = sys.exc_info() if not exc_info: raise ValueError('No exception found') exc_type, exc_value, exc_traceback = exc_info try: frames = get_stack_info( iter_traceback_frames(exc_traceback), transformer=self.transform) exc_module = getattr(exc_type, '__module__', None) if exc_module: exc_module = str(exc_module) exc_type = getattr(exc_type, '__name__', '<unknown>') return { 'level': kwargs.get('level', logging.ERROR), 'sentry.interfaces.Exception': { 'value': to_unicode(exc_value), 'type': str(exc_type), 'module': to_unicode(exc_module), }, 'sentry.interfaces.Stacktrace': { 'frames': frames }, } finally: try: del exc_type, exc_value, exc_traceback except Exception as e: self.logger.exception(e)
def capture(self, exc_info=None, **kwargs): new_exc_info = False if not exc_info or exc_info is True: new_exc_info = True exc_info = sys.exc_info() try: exc_type, exc_value, exc_traceback = exc_info frames = varmap(lambda k, v: shorten(v), get_stack_info(iter_traceback_frames(exc_traceback))) culprit = get_culprit(frames, self.client.include_paths, self.client.exclude_paths) if hasattr(exc_type, '__module__'): exc_module = exc_type.__module__ exc_type = exc_type.__name__ else: exc_module = None exc_type = exc_type.__name__ finally: if new_exc_info: try: del exc_info del exc_traceback except Exception, e: self.logger.exception(e)
def trace_exception(e): try: exc_info = sys.exc_info() frames = iter_traceback_frames(exc_info[-1]) trace(type_=EventType.exception, exc=str(e), stack=get_stack_info(frames)) except Exception: pass
def metlog_call(self, *args, **kwargs): if self.kwargs is None: self.kwargs = {} str_length = self.kwargs.pop('str_length', 200) list_length = self.kwargs.pop('list_length', 50) try: result = self._fn(*args, **kwargs) return result except Exception, e: exc_info = sys.exc_info() exc_type, exc_value, exc_traceback = exc_info frames = varmap(lambda k, v: shorten(v, string_length=str_length, list_length=list_length), get_stack_info(iter_traceback_frames(exc_traceback))) culprit = get_culprit(frames) metlog_blob = {'culprit': culprit, 'frames': frames} CLIENT_WRAPPER.client.metlog('stacktrace', logger=self._fn_fq_name, fields=metlog_blob) # re-raise the exception so that callers up the call stack # have a chance to do the right thing raise
def create_from_exception(self, exc_info=None, **kwargs): """ Creates an event from an exception. >>> try: >>> exc_info = sys.exc_info() >>> client.create_from_exception(exc_info) >>> finally: >>> del exc_info If exc_info is not provided, or is set to True, then this method will perform the ``exc_info = sys.exc_info()`` and the requisite clean-up for you. """ new_exc = False if not exc_info or exc_info is True: new_exc = True exc_info = sys.exc_info() data = kwargs.pop('data', {}) or {} try: exc_type, exc_value, exc_traceback = exc_info frames = varmap(shorten, get_stack_info(iter_traceback_frames(exc_traceback))) if hasattr(exc_type, '__class__'): exc_module = exc_type.__class__.__module__ else: exc_module = None data['__sentry__'] = {} data['__sentry__']['frames'] = frames data['__sentry__']['exception'] = [exc_module, exc_value.args] tb_message = '\n'.join(traceback.format_exception(exc_type, exc_value, exc_traceback)) kwargs.setdefault('message', transform(force_unicode(exc_value))) return self.process( class_name=exc_type.__name__, traceback=tb_message, data=data, **kwargs ) finally: # It's important that we cleanup the frames object (specifically exc_info[2]) # to ensure that GC can happen properly. if new_exc: try: del exc_info del exc_traceback except Exception, e: logger.exception(e)
def create_from_exception(self, exc_info=None, **kwargs): """ Creates an event from an exception. >>> try: >>> exc_info = sys.exc_info() >>> client.create_from_exception(exc_info) >>> finally: >>> del exc_info If exc_info is not provided, or is set to True, then this method will perform the ``exc_info = sys.exc_info()`` and the requisite clean-up for you. """ new_exc = False if not exc_info or exc_info is True: new_exc = True exc_info = sys.exc_info() data = kwargs.pop('data', {}) or {} try: exc_type, exc_value, exc_traceback = exc_info frames = varmap( shorten, get_stack_info(iter_traceback_frames(exc_traceback))) if hasattr(exc_type, '__class__'): exc_module = exc_type.__class__.__module__ else: exc_module = None data['__sentry__'] = {} data['__sentry__']['frames'] = frames data['__sentry__']['exception'] = [exc_module, exc_value.args] tb_message = '\n'.join( traceback.format_exception(exc_type, exc_value, exc_traceback)) kwargs.setdefault('message', transform(force_unicode(exc_value))) return self.process(class_name=exc_type.__name__, traceback=tb_message, data=data, **kwargs) finally: # It's important that we cleanup the frames object (specifically exc_info[2]) # to ensure that GC can happen properly. if new_exc: try: del exc_info del exc_traceback except Exception, e: logger.exception(e)
def _get_value(self, exc_type, exc_value, exc_traceback): stack_info = get_stack_info(iter_traceback_frames(exc_traceback), transformer=self.transform, capture_locals=self.client.capture_locals) exc_module = getattr(exc_type, '__module__', None) if exc_module: exc_module = str(exc_module) exc_type = getattr(exc_type, '__name__', '<unknown>') return { 'value': to_unicode(exc_value), 'type': str(exc_type), 'module': to_unicode(exc_module), 'stacktrace': stack_info }
def create_from_exception(self, exc_info=None, **kwargs): """ Creates an event from an exception. >>> try: >>> exc_info = sys.exc_info() >>> client.create_from_exception(exc_info) >>> finally: >>> del exc_info """ new_exc = bool(exc_info) if not exc_info or exc_info is True: exc_info = sys.exc_info() data = kwargs.pop('data', {}) or {} try: exc_type, exc_value, exc_traceback = exc_info frames = varmap(shorten, get_stack_info(iter_traceback_frames(exc_traceback))) if hasattr(exc_type, '__class__'): exc_module = exc_type.__class__.__module__ else: exc_module = None data['__sentry__'] = {} data['__sentry__']['frames'] = frames data['__sentry__']['exception'] = [exc_module, exc_value.args] tb_message = '\n'.join(traceback.format_exception(exc_type, exc_value, exc_traceback)) kwargs.setdefault('message', transform(force_unicode(exc_value))) return self.process( class_name=exc_type.__name__, traceback=tb_message, data=data, **kwargs ) finally: if new_exc: try: del exc_info except Exception, e: logger.exception(e)
def capture(self, exc_info=None, **kwargs): new_exc_info = False if not exc_info or exc_info is True: new_exc_info = True exc_info = sys.exc_info() if not exc_info: raise ValueError('No exception found') try: exc_type, exc_value, exc_traceback = exc_info frames = varmap( lambda k, v: shorten(v, string_length=self.client. string_max_length, list_length=self.client.list_max_length), get_stack_info(iter_traceback_frames(exc_traceback))) culprit = get_culprit(frames, self.client.include_paths, self.client.exclude_paths) exc_module = getattr(exc_type, '__module__', None) exc_type = getattr(exc_type, '__name__', '<unknown>') finally: if new_exc_info: try: del exc_info del exc_traceback except Exception as e: self.logger.exception(e) return { 'level': logging.ERROR, 'culprit': culprit, 'sentry.interfaces.Exception': { 'value': to_unicode(exc_value), 'type': str(exc_type), 'module': str(exc_module), }, 'sentry.interfaces.Stacktrace': { 'frames': frames }, }
def capture(self, exc_info=None, **kwargs): new_exc_info = False if not exc_info or exc_info is True: new_exc_info = True exc_info = sys.exc_info() if not exc_info: raise ValueError('No exception found') try: exc_type, exc_value, exc_traceback = exc_info frames = varmap(lambda k, v: shorten(v, string_length=self.client.string_max_length, list_length=self.client.list_max_length), get_stack_info(iter_traceback_frames(exc_traceback), list_max_length=self.client.list_max_length, string_max_length=self.client.string_max_length)) exc_module = getattr(exc_type, '__module__', None) if exc_module: exc_module = str(exc_module) exc_type = getattr(exc_type, '__name__', '<unknown>') finally: if new_exc_info: try: del exc_info del exc_traceback except Exception as e: self.logger.exception(e) return { 'level': logging.ERROR, 'sentry.interfaces.Exception': { 'value': to_unicode(exc_value), 'type': str(exc_type), 'module': exc_module, }, 'sentry.interfaces.Stacktrace': { 'frames': frames }, }
def inspect_error(self, task_context, exc_info): """Called when an exception has been raised in the code run by ZeroRPC""" # Hide the zerorpc internal frames for readability, frames to hide are: # - core.ServerBase._async_task # - core.Pattern*.process_call # - context.Context.middleware_call_procedure # - core.DecoratorBase.__call__ if self._hide_zerorpc_frames: exc_traceback = exc_info[2] for zerorpc_frame, tb_lineno in iter_traceback_frames( exc_traceback): zerorpc_frame.f_locals['__traceback_hide__'] = True frame_info = inspect.getframeinfo(zerorpc_frame) # Is there a better way than this (or looking up the filenames or # hardcoding the number of frames to skip) to know when we are out # of zerorpc? if frame_info.function == '__call__': break self._sentry_client.captureException(exc_info, extra=task_context)
def _get_value(self, exc_type, exc_value, exc_traceback): """ Convert exception info to a value for the values list. """ stack_info = get_stack_info( iter_traceback_frames(exc_traceback), transformer=self.transform, capture_locals=self.client.capture_locals, ) exc_module = getattr(exc_type, '__module__', None) if exc_module: exc_module = str(exc_module) exc_type = getattr(exc_type, '__name__', '<unknown>') return { 'value': to_unicode(exc_value), 'type': str(exc_type), 'module': to_unicode(exc_module), 'stacktrace': stack_info, }
def metlog_exceptor(self, logger=default_str_length, msg=default_msg, str_length=default_str_length, list_length=default_list_length, exc_info=None): if exc_info is None: exc_info = sys.exc_info() exc_type, exc_value, exc_traceback = exc_info frames = varmap(lambda k, v: shorten(v, string_length=str_length, list_length=list_length), get_stack_info(iter_traceback_frames(exc_traceback))) culprit = get_culprit(frames) metlog_blob = {'culprit': culprit, 'frames': frames} self.metlog(type='stacktrace', logger=logger, fields=metlog_blob)
def inspect_error(self, task_context, exc_info): """Called when an exception has been raised in the code run by ZeroRPC""" # Hide the zerorpc internal frames for readability, frames to hide are: # - core.ServerBase._async_task # - core.Pattern*.process_call # - context.Context.middleware_call_procedure # - core.DecoratorBase.__call__ if self._hide_zerorpc_frames: exc_traceback = exc_info[2] for zerorpc_frame, tb_lineno in iter_traceback_frames(exc_traceback): zerorpc_frame.f_locals['__traceback_hide__'] = True frame_info = inspect.getframeinfo(zerorpc_frame) # Is there a better way than this (or looking up the filenames or # hardcoding the number of frames to skip) to know when we are out # of zerorpc? if frame_info.function == '__call__': break self._sentry_client.captureException( exc_info, extra=task_context )