def process(self, **kwargs): "Processes the message before passing it on to the server" from sentry.utils import get_filters if kwargs.get('data'): # Ensure we're not changing the original data which was passed # to Sentry kwargs['data'] = kwargs['data'].copy() request = kwargs.pop('request', None) if request: if not kwargs.get('data'): kwargs['data'] = {} if not request.POST and request.raw_post_data: post_data = request.raw_post_data else: post_data = request.POST kwargs['data'].update(dict( META=request.META, POST=post_data, GET=request.GET, COOKIES=request.COOKIES, )) if not kwargs.get('url'): kwargs['url'] = request.build_absolute_uri() kwargs.setdefault('level', logging.ERROR) kwargs.setdefault('server_name', settings.NAME) # save versions of all installed apps if 'data' not in kwargs or '__sentry__' not in (kwargs['data'] or {}): if kwargs.get('data') is None: kwargs['data'] = {} kwargs['data']['__sentry__'] = {} versions = get_versions() kwargs['data']['__sentry__']['versions'] = versions # Shorten lists/strings for k, v in kwargs['data'].iteritems(): if k == '__sentry__': continue kwargs['data'][k] = shorten(v) if kwargs.get('view'): # get list of modules from right to left parts = kwargs['view'].split('.') module_list = ['.'.join(parts[:idx]) for idx in xrange(1, len(parts)+1)][::-1] version = None module = None for m in module_list: if m in versions: module = m version = versions[m] # store our "best guess" for application version if version: kwargs['data']['__sentry__'].update({ 'version': version, 'module': module, }) if 'checksum' not in kwargs: checksum = construct_checksum(**kwargs) else: checksum = kwargs['checksum'] (is_thrashing, message_id) = self.check_throttle(checksum) if is_thrashing: if request and message_id: # attach the sentry object to the request request.sentry = { 'id': message_id, 'thrashed': True, } return message_id for filter_ in get_filters(): kwargs = filter_(None).process(kwargs) or kwargs # create ID client-side so that it can be passed to application message_id = uuid.uuid4().hex kwargs['message_id'] = message_id # Make sure all data is coerced kwargs['data'] = transform(kwargs['data']) if 'timestamp' not in kwargs: kwargs['timestamp'] = datetime.datetime.now() self.send(**kwargs) if request: # attach the sentry object to the request request.sentry = { 'id': message_id, 'trashed': False, } # store the last message_id incase we hit thrashing limits self.set_last_message_id(checksum, message_id) return message_id
def process(self, **kwargs): "Processes the message before passing it on to the server" from sentry.utils import get_filters if kwargs.get('data'): # Ensure we're not changing the original data which was passed # to Sentry kwargs['data'] = kwargs['data'].copy() else: kwargs['data'] = {} if '__sentry__' not in kwargs['data']: kwargs['data']['__sentry__'] = {} request = kwargs.pop('request', None) if isinstance(request, HttpRequest): try: post_data = not request.POST and request.raw_post_data or request.POST except: post_data = request.POST kwargs['data'].update(dict( META=request.META, POST=post_data, GET=request.GET, COOKIES=request.COOKIES, )) if hasattr(request, 'user'): if request.user.is_authenticated(): user_info = { 'is_authenticated': True, 'id': request.user.pk, 'username': request.user.username, 'email': request.user.email, } else: user_info = { 'is_authenticated': False, } kwargs['data']['__sentry__']['user'] = user_info if not kwargs.get('url'): kwargs['url'] = request.build_absolute_uri() kwargs.setdefault('level', logging.ERROR) kwargs.setdefault('server_name', settings.NAME) versions = get_versions() kwargs['data']['__sentry__']['versions'] = versions # Shorten lists/strings for k, v in kwargs['data'].iteritems(): if k == '__sentry__': continue kwargs['data'][k] = shorten(v) # if we've passed frames, lets try to fetch the culprit if not kwargs.get('view') and kwargs['data']['__sentry__'].get('frames'): # This should be cached modules = get_installed_apps() if settings.INCLUDE_PATHS: modules = set(list(modules) + settings.INCLUDE_PATHS) def contains(iterator, value): for k in iterator: if value.startswith(k): return True return False # We iterate through each frame looking for an app in INSTALLED_APPS # When one is found, we mark it as last "best guess" (best_guess) and then # check it against SENTRY_EXCLUDE_PATHS. If it isnt listed, then we # use this option. If nothing is found, we use the "best guess". best_guess = None view = None for frame in kwargs['data']['__sentry__']['frames']: try: view = '.'.join([frame['module'], frame['function']]) except: continue if contains(modules, view): if not (contains(settings.EXCLUDE_PATHS, view) and best_guess): best_guess = view elif best_guess: break if best_guess: view = best_guess if view: kwargs['view'] = view # try to fetch the current version if kwargs.get('view'): # get list of modules from right to left parts = kwargs['view'].split('.') module_list = ['.'.join(parts[:idx]) for idx in xrange(1, len(parts) + 1)][::-1] version = None module = None for m in module_list: if m in versions: module = m version = versions[m] # store our "best guess" for application version if version: kwargs['data']['__sentry__'].update({ 'version': version, 'module': module, }) if 'checksum' not in kwargs: checksum = construct_checksum(**kwargs) else: checksum = kwargs['checksum'] (is_thrashing, message_id) = self.check_throttle(checksum) if is_thrashing: if request and message_id: # attach the sentry object to the request request.sentry = { 'id': '%s$%s' % (message_id, checksum), 'thrashed': True, } return message_id for filter_ in get_filters(): kwargs = filter_(None).process(kwargs) or kwargs # create ID client-side so that it can be passed to application message_id = uuid.uuid4().hex kwargs['message_id'] = message_id # Make sure all data is coerced kwargs['data'] = transform(kwargs['data']) if 'timestamp' not in kwargs: kwargs['timestamp'] = datetime.datetime.now() self.send(**kwargs) if request: # attach the sentry object to the request request.sentry = { 'id': '%s$%s' % (message_id, checksum), 'thrashed': False, } # store the last message_id incase we hit thrashing limits self.set_last_message_id(checksum, message_id) return message_id
def process(self, **kwargs): "Processes the message before passing it on to the server" from sentry.utils import get_filters if kwargs.get('data'): # Ensure we're not changing the original data which was passed # to Sentry kwargs['data'] = kwargs['data'].copy() else: kwargs['data'] = {} if '__sentry__' not in kwargs['data']: kwargs['data']['__sentry__'] = {} request = kwargs.pop('request', None) if isinstance(request, HttpRequest): try: post_data = not request.POST and request.raw_post_data or request.POST except: post_data = request.POST kwargs['data'].update( dict( META=request.META, POST=post_data, GET=request.GET, COOKIES=request.COOKIES, )) if hasattr(request, 'user'): if request.user.is_authenticated(): user_info = { 'is_authenticated': True, 'id': request.user.pk, 'username': request.user.username, 'email': request.user.email, } else: user_info = { 'is_authenticated': False, } kwargs['data']['__sentry__']['user'] = user_info if not kwargs.get('url'): kwargs['url'] = request.build_absolute_uri() kwargs.setdefault('level', logging.ERROR) kwargs.setdefault('server_name', settings.NAME) versions = get_versions() kwargs['data']['__sentry__']['versions'] = versions # Shorten lists/strings for k, v in kwargs['data'].iteritems(): if k == '__sentry__': continue kwargs['data'][k] = shorten(v) # if we've passed frames, lets try to fetch the culprit if not kwargs.get('view') and kwargs['data']['__sentry__'].get( 'frames'): # This should be cached modules = get_installed_apps() if settings.INCLUDE_PATHS: modules = set(list(modules) + settings.INCLUDE_PATHS) def contains(iterator, value): for k in iterator: if value.startswith(k): return True return False # We iterate through each frame looking for an app in INSTALLED_APPS # When one is found, we mark it as last "best guess" (best_guess) and then # check it against SENTRY_EXCLUDE_PATHS. If it isnt listed, then we # use this option. If nothing is found, we use the "best guess". best_guess = None view = None for frame in kwargs['data']['__sentry__']['frames']: try: view = '.'.join([frame['module'], frame['function']]) except: continue if contains(modules, view): if not (contains(settings.EXCLUDE_PATHS, view) and best_guess): best_guess = view elif best_guess: break if best_guess: view = best_guess if view: kwargs['view'] = view # try to fetch the current version if kwargs.get('view'): # get list of modules from right to left parts = kwargs['view'].split('.') module_list = [ '.'.join(parts[:idx]) for idx in xrange(1, len(parts) + 1) ][::-1] version = None module = None for m in module_list: if m in versions: module = m version = versions[m] # store our "best guess" for application version if version: kwargs['data']['__sentry__'].update({ 'version': version, 'module': module, }) if 'checksum' not in kwargs: checksum = construct_checksum(**kwargs) else: checksum = kwargs['checksum'] (is_thrashing, message_id) = self.check_throttle(checksum) if is_thrashing: if request and message_id: # attach the sentry object to the request request.sentry = { 'id': '%s$%s' % (message_id, checksum), 'thrashed': True, } return message_id for filter_ in get_filters(): kwargs = filter_(None).process(kwargs) or kwargs # create ID client-side so that it can be passed to application message_id = uuid.uuid4().hex kwargs['message_id'] = message_id # Make sure all data is coerced kwargs['data'] = transform(kwargs['data']) if 'timestamp' not in kwargs: kwargs['timestamp'] = datetime.datetime.now() self.send(**kwargs) if request: # attach the sentry object to the request request.sentry = { 'id': '%s$%s' % (message_id, checksum), 'thrashed': False, } # store the last message_id incase we hit thrashing limits self.set_last_message_id(checksum, message_id) return message_id
def process(self, **kwargs): "Processes the message before passing it on to the server" from sentry.utils import get_filters if kwargs.get('data'): # Ensure we're not changing the original data which was passed # to Sentry kwargs['data'] = kwargs['data'].copy() request = kwargs.pop('request', None) if request: if not kwargs.get('data'): kwargs['data'] = {} if not request.POST and request.raw_post_data: post_data = request.raw_post_data else: post_data = request.POST kwargs['data'].update( dict( META=request.META, POST=post_data, GET=request.GET, COOKIES=request.COOKIES, )) if not kwargs.get('url'): kwargs['url'] = request.build_absolute_uri() kwargs.setdefault('level', logging.ERROR) kwargs.setdefault('server_name', settings.NAME) # save versions of all installed apps if 'data' not in kwargs or '__sentry__' not in (kwargs['data'] or {}): if kwargs.get('data') is None: kwargs['data'] = {} kwargs['data']['__sentry__'] = {} versions = get_versions() kwargs['data']['__sentry__']['versions'] = versions # Shorten lists/strings for k, v in kwargs['data'].iteritems(): if k == '__sentry__': continue kwargs['data'][k] = shorten(v) if kwargs.get('view'): # get list of modules from right to left parts = kwargs['view'].split('.') module_list = [ '.'.join(parts[:idx]) for idx in xrange(1, len(parts) + 1) ][::-1] version = None module = None for m in module_list: if m in versions: module = m version = versions[m] # store our "best guess" for application version if version: kwargs['data']['__sentry__'].update({ 'version': version, 'module': module, }) if 'checksum' not in kwargs: checksum = construct_checksum(**kwargs) else: checksum = kwargs['checksum'] (is_thrashing, message_id) = self.check_throttle(checksum) if is_thrashing: if request and message_id: # attach the sentry object to the request request.sentry = { 'id': message_id, 'thrashed': True, } return message_id for filter_ in get_filters(): kwargs = filter_(None).process(kwargs) or kwargs # create ID client-side so that it can be passed to application message_id = uuid.uuid4().hex kwargs['message_id'] = message_id # Make sure all data is coerced kwargs['data'] = transform(kwargs['data']) if 'timestamp' not in kwargs: kwargs['timestamp'] = datetime.datetime.now() self.send(**kwargs) if request: # attach the sentry object to the request request.sentry = { 'id': message_id, 'trashed': False, } # store the last message_id incase we hit thrashing limits self.set_last_message_id(checksum, message_id) return message_id
def process(self, **kwargs): "Processes the message before passing it on to the server" from sentry.utils import get_filters if kwargs.get("data"): # Ensure we're not changing the original data which was passed # to Sentry kwargs["data"] = kwargs["data"].copy() else: kwargs["data"] = {} if "__sentry__" not in kwargs["data"]: kwargs["data"]["__sentry__"] = {} request = kwargs.pop("request", None) if isinstance(request, HttpRequest): if not request.POST and request.body: post_data = request.body else: post_data = request.POST kwargs["data"].update(dict(META=request.META, POST=post_data, GET=request.GET, COOKIES=request.COOKIES)) if hasattr(request, "user"): if request.user.is_authenticated(): user_info = { "is_authenticated": True, "id": request.user.pk, "username": request.user.username, "email": request.user.email, } else: user_info = {"is_authenticated": False} kwargs["data"]["__sentry__"]["user"] = user_info if not kwargs.get("url"): kwargs["url"] = request.build_absolute_uri() kwargs.setdefault("level", logging.ERROR) kwargs.setdefault("server_name", settings.NAME) versions = get_versions() kwargs["data"]["__sentry__"]["versions"] = versions # Shorten lists/strings for k, v in kwargs["data"].iteritems(): if k == "__sentry__": continue kwargs["data"][k] = shorten(v) # if we've passed frames, lets try to fetch the culprit if not kwargs.get("view") and kwargs["data"]["__sentry__"].get("frames"): # This should be cached modules = get_installed_apps() if settings.INCLUDE_PATHS: modules = set(list(modules) + settings.INCLUDE_PATHS) def contains(iterator, value): for k in iterator: if value.startswith(k): return True return False # We iterate through each frame looking for an app in INSTALLED_APPS # When one is found, we mark it as last "best guess" (best_guess) and then # check it against SENTRY_EXCLUDE_PATHS. If it isnt listed, then we # use this option. If nothing is found, we use the "best guess". best_guess = None view = None for frame in kwargs["data"]["__sentry__"]["frames"]: try: view = ".".join([frame["module"], frame["function"]]) except: continue if contains(modules, view): if not (contains(settings.EXCLUDE_PATHS, view) and best_guess): best_guess = view elif best_guess: break if best_guess: view = best_guess if view: kwargs["view"] = view # try to fetch the current version if kwargs.get("view"): # get list of modules from right to left parts = kwargs["view"].split(".") module_list = [".".join(parts[:idx]) for idx in xrange(1, len(parts) + 1)][::-1] version = None module = None for m in module_list: if m in versions: module = m version = versions[m] # store our "best guess" for application version if version: kwargs["data"]["__sentry__"].update({"version": version, "module": module}) if "checksum" not in kwargs: checksum = construct_checksum(**kwargs) else: checksum = kwargs["checksum"] (is_thrashing, message_id) = self.check_throttle(checksum) if is_thrashing: if request and message_id: # attach the sentry object to the request request.sentry = {"id": message_id, "thrashed": True} return message_id for filter_ in get_filters(): kwargs = filter_(None).process(kwargs) or kwargs # create ID client-side so that it can be passed to application message_id = uuid.uuid4().hex kwargs["message_id"] = message_id # Make sure all data is coerced kwargs["data"] = transform(kwargs["data"]) if "timestamp" not in kwargs: kwargs["timestamp"] = now_with_tz_if_supported() self.send(**kwargs) if request: # attach the sentry object to the request request.sentry = {"id": message_id, "thrashed": False} # store the last message_id incase we hit thrashing limits self.set_last_message_id(checksum, message_id) return message_id