def matches_frame(self, frame_data, platform): # Path matches are always case insensitive if self.key in ('path', 'package'): if self.key == 'package': value = frame_data.get('package') or '' else: value = frame_data.get('abs_path') or frame_data.get('filename') or '' if glob_match(value, self.pattern, ignorecase=True, doublestar=True, path_normalize=True): return True if not value.startswith('/') and glob_match('/' + value, self.pattern, ignorecase=True, doublestar=True, path_normalize=True): return True return False # families need custom handling as well if self.key == 'family': flags = self.pattern.split(',') if 'all' in flags: return True family = get_behavior_family_for_platform(frame_data.get('platform') or platform) return family in flags # all other matches are case sensitive if self.key == 'function': from sentry.stacktraces.functions import get_function_name_for_frame value = get_function_name_for_frame(frame_data, platform) or '<unknown>' elif self.key == 'module': value = frame_data.get('module') or '<unknown>' else: # should not happen :) value = '<unknown>' return glob_match(value, self.pattern)
def _positive_frame_match(self, frame_data, platform, exception_data): # Path matches are always case insensitive if self.key in ("path", "package"): if self.key == "package": value = frame_data.get("package") or "" else: value = frame_data.get("abs_path") or frame_data.get( "filename") or "" if glob_match(value, self.pattern, ignorecase=True, doublestar=True, path_normalize=True): return True if not value.startswith("/") and glob_match("/" + value, self.pattern, ignorecase=True, doublestar=True, path_normalize=True): return True return False # families need custom handling as well if self.key == "family": flags = self.pattern.split(",") if "all" in flags: return True family = get_behavior_family_for_platform( frame_data.get("platform") or platform) return family in flags # in-app matching is just a bool if self.key == "app": ref_val = get_rule_bool(self.pattern) return ref_val is not None and ref_val == frame_data.get("in_app") # all other matches are case sensitive if self.key == "function": from sentry.stacktraces.functions import get_function_name_for_frame value = get_function_name_for_frame(frame_data, platform) or "<unknown>" elif self.key == "module": value = frame_data.get("module") or "<unknown>" elif self.key == "type": value = get_path(exception_data, "type") or "<unknown>" elif self.key == "value": value = get_path(exception_data, "value") or "<unknown>" elif self.key == "mechanism": value = get_path(exception_data, "mechanism", "type") or "<unknown>" elif self.key == "category": value = get_path(frame_data, "data", "category") or "<unknown>" else: # should not happen :) value = "<unknown>" return glob_match(value, self.pattern)
def get_api_context(self, is_public=False, pad_addr=None, platform=None): from sentry.stacktraces.functions import get_function_name_for_frame function = get_function_name_for_frame(self, platform) data = { "filename": self.filename, "absPath": self.abs_path, "module": self.module, "package": self.package, "platform": self.platform, "instructionAddr": pad_hex_addr(self.instruction_addr, pad_addr), "symbolAddr": pad_hex_addr(self.symbol_addr, pad_addr), "function": function, "rawFunction": self.raw_function, "symbol": self.symbol, "context": get_context( lineno=self.lineno, context_line=self.context_line, pre_context=self.pre_context, post_context=self.post_context, ), "lineNo": self.lineno, "colNo": self.colno, "inApp": self.in_app, "trust": self.trust, "errors": self.errors, } if not is_public: data["vars"] = self.vars # TODO(dcramer): abstract out this API if self.data and "sourcemap" in data: data.update({ "map": self.data["sourcemap"].rsplit("/", 1)[-1], "origFunction": self.data.get("orig_function", "?"), "origAbsPath": self.data.get("orig_abs_path", "?"), "origFilename": self.data.get("orig_filename", "?"), "origLineNo": self.data.get("orig_lineno", "?"), "origColNo": self.data.get("orig_colno", "?"), }) if is_url(self.data["sourcemap"]): data["mapUrl"] = self.data["sourcemap"] return data
def get_crash_location(data): from sentry.stacktraces.processing import get_crash_frame_from_event_data frame = get_crash_frame_from_event_data( data, frame_filter=lambda x: x.get('filename') or x.get('abs_path')) if frame is not None: from sentry.stacktraces.functions import get_function_name_for_frame func = get_function_name_for_frame(frame, data.get('platform')) return frame.get('filename') or frame.get('abs_path'), func
def get_api_context(self, is_public=False, pad_addr=None, platform=None): from sentry.stacktraces.functions import get_function_name_for_frame function = get_function_name_for_frame(self, platform) data = { 'filename': self.filename, 'absPath': self.abs_path, 'module': self.module, 'package': self.package, 'platform': self.platform, 'instructionAddr': pad_hex_addr(self.instruction_addr, pad_addr), 'symbolAddr': pad_hex_addr(self.symbol_addr, pad_addr), 'function': function, 'rawFunction': self.raw_function, 'symbol': self.symbol, 'context': get_context( lineno=self.lineno, context_line=self.context_line, pre_context=self.pre_context, post_context=self.post_context, ), 'lineNo': self.lineno, 'colNo': self.colno, 'inApp': self.in_app, 'trust': self.trust, 'errors': self.errors, } if not is_public: data['vars'] = self.vars # TODO(dcramer): abstract out this API if self.data and 'sourcemap' in data: data.update({ 'map': self.data['sourcemap'].rsplit('/', 1)[-1], 'origFunction': self.data.get('orig_function', '?'), 'origAbsPath': self.data.get('orig_abs_path', '?'), 'origFilename': self.data.get('orig_filename', '?'), 'origLineNo': self.data.get('orig_lineno', '?'), 'origColNo': self.data.get('orig_colno', '?'), }) if is_url(self.data['sourcemap']): data['mapUrl'] = self.data['sourcemap'] return data
def _push_frame(frame): platform = frame.get('platform') or self.event.get('platform') func = get_function_name_for_frame(frame, platform) self._frames.append({ 'function': func or '<unknown>', 'path': frame.get('abs_path') or frame.get('filename'), 'module': frame.get('module'), 'family': get_behavior_family_for_platform(platform), 'package': frame.get('package'), })
def get_crash_location(data): from sentry.stacktraces.processing import get_crash_frame_from_event_data frame = get_crash_frame_from_event_data( data, frame_filter=lambda x: x.get("function") not in (None, "<redacted>", "<unknown>") ) if frame is not None: from sentry.stacktraces.functions import get_function_name_for_frame func = get_function_name_for_frame(frame, data.get("platform")) return frame.get("filename") or frame.get("abs_path"), func
def get_crash_location(exception, platform=None): default = None for frame in reversed(get_path(exception, 'stacktrace', 'frames', filter=True) or ()): fn = frame.get('filename') or frame.get('abs_path') if fn: from sentry.stacktraces.functions import get_function_name_for_frame func = get_function_name_for_frame(frame, platform) if frame.get('in_app'): return fn, func if default is None: default = fn, func return default
def _push_frame(frame): platform = frame.get("platform") or self.event.get("platform") func = get_function_name_for_frame(frame, platform) self._frames.append( { "function": func or "<unknown>", "abs_path": frame.get("abs_path") or frame.get("filename"), "filename": frame.get("filename"), "module": frame.get("module"), "family": get_behavior_family_for_platform(platform), "package": frame.get("package"), "app": frame.get("in_app"), } )
def _push_frame(frame): platform = frame.get('platform') or self.event.get('platform') func = get_function_name_for_frame(frame, platform) self._frames.append({ 'function': func or '<unknown>', 'path': frame.get('abs_path') or frame.get('filename'), 'module': frame.get('module'), 'family': get_behavior_family_for_platform(platform), 'package': frame.get('package'), })
def matches_frame(self, frame_data, platform): # Path matches are always case insensitive if self.key in ('path', 'package'): if self.key == 'package': value = frame_data.get('package') or '' else: value = frame_data.get('abs_path') or frame_data.get( 'filename') or '' if glob_match(value, self.pattern, ignorecase=True, doublestar=True, path_normalize=True): return True if not value.startswith('/') and glob_match('/' + value, self.pattern, ignorecase=True, doublestar=True, path_normalize=True): return True return False # families need custom handling as well if self.key == 'family': flags = self.pattern.split(',') if 'all' in flags: return True family = get_behavior_family_for_platform( frame_data.get('platform') or platform) return family in flags # in-app matching is just a bool if self.key == 'app': ref_val = get_rule_bool(self.pattern) return ref_val is not None and ref_val == frame_data.get('in_app') # all other matches are case sensitive if self.key == 'function': from sentry.stacktraces.functions import get_function_name_for_frame value = get_function_name_for_frame(frame_data, platform) or '<unknown>' elif self.key == 'module': value = frame_data.get('module') or '<unknown>' else: # should not happen :) value = '<unknown>' return glob_match(value, self.pattern)
def get_api_context(self, is_public=False, pad_addr=None, platform=None): from sentry.stacktraces.functions import get_function_name_for_frame function = get_function_name_for_frame(self, platform) data = { 'filename': self.filename, 'absPath': self.abs_path, 'module': self.module, 'package': self.package, 'platform': self.platform, 'instructionAddr': pad_hex_addr(self.instruction_addr, pad_addr), 'symbolAddr': pad_hex_addr(self.symbol_addr, pad_addr), 'function': function, 'rawFunction': self.raw_function, 'symbol': self.symbol, 'context': get_context( lineno=self.lineno, context_line=self.context_line, pre_context=self.pre_context, post_context=self.post_context, ), 'lineNo': self.lineno, 'colNo': self.colno, 'inApp': self.in_app, 'trust': self.trust, 'errors': self.errors, } if not is_public: data['vars'] = self.vars # TODO(dcramer): abstract out this API if self.data and 'sourcemap' in data: data.update( { 'map': self.data['sourcemap'].rsplit('/', 1)[-1], 'origFunction': self.data.get('orig_function', '?'), 'origAbsPath': self.data.get('orig_abs_path', '?'), 'origFilename': self.data.get('orig_filename', '?'), 'origLineNo': self.data.get('orig_lineno', '?'), 'origColNo': self.data.get('orig_colno', '?'), } ) if is_url(self.data['sourcemap']): data['mapUrl'] = self.data['sourcemap'] return data
def _get_function_name(frame_data: dict, platform: Optional[str]): function_name = get_function_name_for_frame(frame_data, platform) return function_name or "<unknown>"