예제 #1
0
    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)
예제 #2
0
파일: enhancer.py 프로젝트: talrasha/sentry
    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)
예제 #3
0
파일: stacktrace.py 프로젝트: zvrr/sentry
    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
예제 #4
0
파일: error.py 프로젝트: webZW/sentry
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
예제 #5
0
    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
예제 #6
0
 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'),
     })
예제 #7
0
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
예제 #8
0
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
예제 #9
0
 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"),
         }
     )
예제 #10
0
 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'),
     })
예제 #11
0
    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)
예제 #12
0
    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
예제 #13
0
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>"