Browse Source

fix(grouping): Do not use system frames in hierarchy if blaming frame is in-app (#27936)

in-app

- If the blaming frame is a sentinel frame found via classification, we
  assume in-app doesn't contribute much to grouping quality and ignore it.

  Nothing is changed here.

- If the blaming frame is in-app, likely all the interesting information
  in the stack is.

  This cuts away a lot of noise in tree_labels since preceding non-app
  frames are not added on every level.

- If the blaming frame is some random frame, we add surrounding frames
  as usual.
Markus Unterwaditzer 3 years ago
parent
commit
ccd69a72b3

+ 58 - 21
src/sentry/grouping/strategies/hierarchical.py

@@ -1,4 +1,4 @@
-from typing import Iterable
+from typing import Iterable, Optional
 
 from sentry.grouping.component import GroupingComponent
 
@@ -85,9 +85,11 @@ def get_stacktrace_hierarchy(main_variant, components, frames, inverted_hierarch
         )
 
     if not all_variants:
+        # In case we haven't found any sentinel frames, start grouping by
+        # application frames.
         all_variants = _build_fallback_tree(main_variant, components, frames, inverted_hierarchy)
-
-    all_variants["app-depth-max"] = main_variant
+    else:
+        all_variants["app-depth-max"] = main_variant
 
     main_variant.update(tree_label=_compute_tree_label(main_variant.values))
 
@@ -141,55 +143,90 @@ def _build_fallback_tree(main_variant, components, frames, inverted_hierarchy):
 
     blaming_frame_component = components[blaming_frame_idx]
 
+    # If the blaming frame is in-app, only add in-app frames going forward
+    # (otherwise add any frame).
+    #
+    # This cuts away a lot of noise from tree_labels, and for e.g. Android ANRs
+    # it still kind of works since either we find the view's onCreate function,
+    # or some sentinel frame first.
+    needs_in_app = frames[blaming_frame_idx]["in_app"]
+
     prev_variant = GroupingComponent(id="stacktrace", values=[])
     all_variants = {}
 
+    def _assemble_level(depth):
+        pre_frames = _accumulate_frame_levels(
+            frames, components, blaming_frame_idx, depth, -1, needs_in_app
+        )
+        post_frames = _accumulate_frame_levels(
+            frames, components, blaming_frame_idx, depth, 1, needs_in_app
+        )
+
+        rv = pre_frames
+        rv.reverse()
+        rv.append(blaming_frame_component)
+        rv.extend(post_frames)
+        return rv
+
     while len(all_variants) < MAX_LAYERS:
         depth = len(all_variants) + 1
         key = f"app-depth-{depth}"
         assert key not in all_variants
-        pre_frames = _accumulate_frame_levels(components, blaming_frame_idx, depth, -1)
-        post_frames = _accumulate_frame_levels(components, blaming_frame_idx, depth, 1)
-
-        frames = pre_frames
-        frames.reverse()
-        frames.append(blaming_frame_component)
-        frames.extend(post_frames)
+        level_frames = _assemble_level(depth)
 
-        if len(prev_variant.values) == len(frames):
+        if len(prev_variant.values) == len(level_frames):
             break
 
-        tree_label = _compute_tree_label(frames)
+        tree_label = _compute_tree_label(level_frames)
 
         all_variants[key] = prev_variant = GroupingComponent(
             id="stacktrace",
-            values=pre_frames,
+            values=level_frames,
             tree_label=tree_label,
         )
 
+    level_frames = _assemble_level(None)
+    tree_label = _compute_tree_label(level_frames)
+
+    all_variants["app-depth-max"] = GroupingComponent(
+        id="stacktrace", values=level_frames, tree_label=tree_label
+    )
+
     return all_variants
 
 
-def _accumulate_frame_levels(values, blaming_frame_idx, depth, direction):
+def _accumulate_frame_levels(
+    frames, values, blaming_frame_idx, depth: Optional[int], direction, needs_in_app
+):
     rv = []
 
     # subtract depth by one to count blaming frame
-    depth -= 1
-
-    start = blaming_frame_idx + direction
-    if start < 0:
-        return rv
+    if depth is not None:
+        depth -= 1
 
     added = 0
     prev_was_prefix = values[blaming_frame_idx].is_prefix_frame
-    for component in values[start:None:direction]:
+    idx = blaming_frame_idx + direction
+
+    while 0 <= idx < len(values):
+        component = values[idx]
+        frame = frames[idx]
+        idx += direction
+
         if not component.contributes:
             continue
 
+        if needs_in_app and not frame["in_app"]:
+            # XXX: At this and any other break/continue we should actually add
+            # a non-contributing component to the tree, but that'd involve a
+            # deepcopy and people can debug grouping via the system component
+            # anyway.
+            continue
+
         if prev_was_prefix:
             rv.append(component)
         else:
-            if added == depth:
+            if depth is not None and added == depth:
                 break
             rv.append(component)
             added += 1

File diff suppressed because it is too large
+ 9 - 70
tests/sentry/grouping/snapshots/test_variants/test_event_hash_variant/mobile@2021_02_12/actix.pysnap


+ 1 - 757
tests/sentry/grouping/snapshots/test_variants/test_event_hash_variant/mobile@2021_02_12/android_anr.pysnap

@@ -1,5 +1,5 @@
 ---
-created: '2021-08-03T16:33:07.432285Z'
+created: '2021-08-04T15:53:49.350178Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -38,699 +38,6 @@ app-depth-max:
     app-depth-max*
       exception*
         stacktrace*
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "com.android.internal.os.ZygoteInit"
-            filename (module takes precedence)
-              "zygoteinit.java"
-            function*
-              "main"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "com.android.internal.os.ZygoteInit$MethodAndArgsCaller"
-            filename (module takes precedence)
-              "zygoteinit.java"
-            function*
-              "run"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "java.lang.reflect.Method"
-            filename (module takes precedence)
-              "method.java"
-            function*
-              "invoke"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "java.lang.reflect.Method"
-            filename (module takes precedence)
-              "method.java"
-            function*
-              "invoke"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.app.ActivityThread"
-            filename (module takes precedence)
-              "activitythread.java"
-            function*
-              "main"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.os.Looper"
-            filename (module takes precedence)
-              "looper.java"
-            function*
-              "loop"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.os.Handler"
-            filename (module takes precedence)
-              "handler.java"
-            function*
-              "dispatchMessage"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.os.Handler"
-            filename (module takes precedence)
-              "handler.java"
-            function*
-              "handleCallback"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.Choreographer$FrameDisplayEventReceiver"
-            filename (module takes precedence)
-              "choreographer.java"
-            function*
-              "run"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.Choreographer"
-            filename (module takes precedence)
-              "choreographer.java"
-            function*
-              "doFrame"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.Choreographer"
-            filename (module takes precedence)
-              "choreographer.java"
-            function*
-              "doCallbacks"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.Choreographer$CallbackRecord"
-            filename (module takes precedence)
-              "choreographer.java"
-            function*
-              "run"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewRootImpl$TraversalRunnable"
-            filename (module takes precedence)
-              "viewrootimpl.java"
-            function*
-              "run"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewRootImpl"
-            filename (module takes precedence)
-              "viewrootimpl.java"
-            function*
-              "doTraversal"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewRootImpl"
-            filename (module takes precedence)
-              "viewrootimpl.java"
-            function*
-              "performTraversals"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewRootImpl"
-            filename (module takes precedence)
-              "viewrootimpl.java"
-            function*
-              "performLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "layoutVertical"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "setChildFrame"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "layoutVertical"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "setChildFrame"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "layoutVertical"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "setChildFrame"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "layoutVertical"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "setChildFrame"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "layoutVertical"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.LinearLayout"
-            filename (module takes precedence)
-              "linearlayout.java"
-            function*
-              "setChildFrame"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "onLayout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.widget.FrameLayout"
-            filename (module takes precedence)
-              "framelayout.java"
-            function*
-              "layoutChildren"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.ViewGroup"
-            filename (module takes precedence)
-              "viewgroup.java"
-            function*
-              "layout"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            module*
-              "android.view.View"
-            filename (module takes precedence)
-              "view.java"
-            function*
-              "layout"
           frame* (marked as prefix frame by stack trace rule (category:ui +sentinel +prefix))
             module*
               "androidx.recyclerview.widget.RecyclerView"
@@ -738,62 +45,6 @@ app-depth-max:
               "sourcefile"
             function*
               "onLayout"
-          frame (ignored by stack trace rule (category:internals -group))
-            module*
-              "androidx.recyclerview.widget.RecyclerView"
-            filename (module takes precedence)
-              "sourcefile"
-            function*
-              "dispatchLayout"
-          frame (ignored by stack trace rule (category:internals -group))
-            module*
-              "androidx.recyclerview.widget.RecyclerView"
-            filename (module takes precedence)
-              "sourcefile"
-            function*
-              "dispatchLayoutStep1"
-          frame (ignored by stack trace rule (category:internals -group))
-            module*
-              "androidx.recyclerview.widget.RecyclerView"
-            filename (module takes precedence)
-              "sourcefile"
-            function*
-              "processAdapterUpdatesAndSetAnimationFlags"
-          frame (ignored by stack trace rule (category:internals -group))
-            module*
-              "androidx.recyclerview.widget.AdapterHelper"
-            filename (module takes precedence)
-              "sourcefile"
-            function*
-              "consumeUpdatesInOnePass"
-          frame (ignored by stack trace rule (category:internals -group))
-            module*
-              "androidx.recyclerview.widget.RecyclerView$6"
-            filename (module takes precedence)
-              "sourcefile"
-            function*
-              "offsetPositionsForAdd"
-          frame (ignored by stack trace rule (category:internals -group))
-            module*
-              "androidx.recyclerview.widget.RecyclerView"
-            filename (module takes precedence)
-              "sourcefile"
-            function*
-              "offsetPositionRecordsForInsert"
-          frame (ignored by stack trace rule (category:internals -group))
-            module*
-              "androidx.recyclerview.widget.ChildHelper"
-            filename (module takes precedence)
-              "sourcefile"
-            function*
-              "getUnfilteredChildAt"
-          frame (ignored by stack trace rule (category:internals -group))
-            module*
-              "androidx.recyclerview.widget.RecyclerView$5"
-            filename (module takes precedence)
-              "sourcefile"
-            function*
-              "getChildAt"
         type*
           "ApplicationNotResponding"
         value (ignored because stacktrace takes precedence)
@@ -807,13 +58,6 @@ app-depth-max:
               "thread.java"
             function*
               "getStackTrace"
-          frame (ignored by stack trace rule (category:internals -group))
-            module*
-              "dalvik.system.VMStack"
-            filename (module takes precedence)
-              "vmstack.java"
-            function*
-              "getThreadStackTrace"
 --------------------------------------------------------------------------
 system:
   hash: "2552498cfe69a6ddf1dcdde5440ce9c3"

+ 5 - 252
tests/sentry/grouping/snapshots/test_variants/test_event_hash_variant/mobile@2021_02_12/aspnetcore.pysnap

@@ -1,5 +1,5 @@
 ---
-created: '2021-06-30T16:44:00.441129Z'
+created: '2021-08-04T15:53:47.104225Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -46,260 +46,13 @@ app-depth-2:
         value (ignored because stacktrace takes precedence)
           "sync exception"
 --------------------------------------------------------------------------
-app-depth-3:
-  hash: "1a74c747b5cea2b8c2ac2f5753a03116"
-  tree_label: "Get | lambda_method | Execute"
-  component:
-    app-depth-3*
-      exception*
-        stacktrace*
-          frame*
-            module*
-              "Microsoft.Extensions.Internal.ObjectMethodExecutor"
-            function*
-              "Execute"
-          frame*
-            module*
-              "(unknown)"
-            function*
-              "lambda_method"
-          frame*
-            module*
-              "SentryTest2.Controllers.ValuesController"
-            filename (module takes precedence)
-              "valuescontroller.cs"
-            function*
-              "Get"
-        type*
-          "System.Exception"
-        value (ignored because stacktrace takes precedence)
-          "sync exception"
---------------------------------------------------------------------------
-app-depth-4:
-  hash: "14a57462092f01a0042382359f958006"
-  tree_label: "Get | lambda_method | Execute | Execute"
-  component:
-    app-depth-4*
-      exception*
-        stacktrace*
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor+SyncObjectResultExecutor"
-            function*
-              "Execute"
-          frame*
-            module*
-              "Microsoft.Extensions.Internal.ObjectMethodExecutor"
-            function*
-              "Execute"
-          frame*
-            module*
-              "(unknown)"
-            function*
-              "lambda_method"
-          frame*
-            module*
-              "SentryTest2.Controllers.ValuesController"
-            filename (module takes precedence)
-              "valuescontroller.cs"
-            function*
-              "Get"
-        type*
-          "System.Exception"
-        value (ignored because stacktrace takes precedence)
-          "sync exception"
---------------------------------------------------------------------------
-app-depth-5:
-  hash: "8bd7d4553a8f5d58ad65bea951793080"
-  tree_label: "Get | lambda_method | Execute | Execute | InvokeActionMethodAsync"
-  component:
-    app-depth-5*
-      exception*
-        stacktrace*
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker"
-            function*
-              "InvokeActionMethodAsync"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor+SyncObjectResultExecutor"
-            function*
-              "Execute"
-          frame*
-            module*
-              "Microsoft.Extensions.Internal.ObjectMethodExecutor"
-            function*
-              "Execute"
-          frame*
-            module*
-              "(unknown)"
-            function*
-              "lambda_method"
-          frame*
-            module*
-              "SentryTest2.Controllers.ValuesController"
-            filename (module takes precedence)
-              "valuescontroller.cs"
-            function*
-              "Get"
-        type*
-          "System.Exception"
-        value (ignored because stacktrace takes precedence)
-          "sync exception"
---------------------------------------------------------------------------
 app-depth-max:
-  hash: "4ccd0f1953483581ba360c7518f90332"
-  tree_label: "Get | lambda_method | Execute | Execute | InvokeActionMethodAsync | Throw | HandleNonSuccessAndDebuggerNotification | InvokeNextActionFilterAsync | Throw | Rethrow | Next | InvokeInnerFilterAsync | Throw | HandleNonSuccessAndDebuggerNotification | InvokeNextResourceFilter | Throw | Rethrow | Next | InvokeFilterPipelineAsync | Throw | HandleNonSuccessAndDebuggerNotification | InvokeAsync | Throw | HandleNonSuccessAndDebuggerNotification | Invoke | Throw | HandleNonSuccessAndDebuggerNotification | Invoke | Throw | HandleNonSuccessAndDebuggerNotification | Invoke"
+  hash: "228c649a3aa0901622c0a0e66ab0522c"
+  tree_label: "Get | lambda_method"
   component:
     app-depth-max*
       exception*
         stacktrace*
-          frame*
-            module*
-              "Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware"
-            function*
-              "Invoke"
-          frame*
-            module*
-              "System.Runtime.CompilerServices.TaskAwaiter"
-            function*
-              "HandleNonSuccessAndDebuggerNotification"
-          frame*
-            module*
-              "System.Runtime.ExceptionServices.ExceptionDispatchInfo"
-            function*
-              "Throw"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware"
-            function*
-              "Invoke"
-          frame*
-            module*
-              "System.Runtime.CompilerServices.TaskAwaiter"
-            function*
-              "HandleNonSuccessAndDebuggerNotification"
-          frame*
-            module*
-              "System.Runtime.ExceptionServices.ExceptionDispatchInfo"
-            function*
-              "Throw"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Routing.EndpointMiddleware"
-            function*
-              "Invoke"
-          frame*
-            module*
-              "System.Runtime.CompilerServices.TaskAwaiter"
-            function*
-              "HandleNonSuccessAndDebuggerNotification"
-          frame*
-            module*
-              "System.Runtime.ExceptionServices.ExceptionDispatchInfo"
-            function*
-              "Throw"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker"
-            function*
-              "InvokeAsync"
-          frame*
-            module*
-              "System.Runtime.CompilerServices.TaskAwaiter"
-            function*
-              "HandleNonSuccessAndDebuggerNotification"
-          frame*
-            module*
-              "System.Runtime.ExceptionServices.ExceptionDispatchInfo"
-            function*
-              "Throw"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker"
-            function*
-              "InvokeFilterPipelineAsync"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker"
-            function*
-              "Next"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker"
-            function*
-              "Rethrow"
-          frame*
-            module*
-              "System.Runtime.ExceptionServices.ExceptionDispatchInfo"
-            function*
-              "Throw"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker"
-            function*
-              "InvokeNextResourceFilter"
-          frame*
-            module*
-              "System.Runtime.CompilerServices.TaskAwaiter"
-            function*
-              "HandleNonSuccessAndDebuggerNotification"
-          frame*
-            module*
-              "System.Runtime.ExceptionServices.ExceptionDispatchInfo"
-            function*
-              "Throw"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker"
-            function*
-              "InvokeInnerFilterAsync"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker"
-            function*
-              "Next"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker"
-            function*
-              "Rethrow"
-          frame*
-            module*
-              "System.Runtime.ExceptionServices.ExceptionDispatchInfo"
-            function*
-              "Throw"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker"
-            function*
-              "InvokeNextActionFilterAsync"
-          frame*
-            module*
-              "System.Runtime.CompilerServices.TaskAwaiter"
-            function*
-              "HandleNonSuccessAndDebuggerNotification"
-          frame*
-            module*
-              "System.Runtime.ExceptionServices.ExceptionDispatchInfo"
-            function*
-              "Throw"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker"
-            function*
-              "InvokeActionMethodAsync"
-          frame*
-            module*
-              "Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor+SyncObjectResultExecutor"
-            function*
-              "Execute"
-          frame*
-            module*
-              "Microsoft.Extensions.Internal.ObjectMethodExecutor"
-            function*
-              "Execute"
           frame*
             module*
               "(unknown)"
@@ -320,8 +73,8 @@ app-depth-max:
 default:
   hash: null
   component:
-    default (exception of app-depth-1/app-depth-2/app-depth-3/app-depth-4/app-depth-5/app-depth-max/system takes precedence)
-      message (exception of app-depth-1/app-depth-2/app-depth-3/app-depth-4/app-depth-5/app-depth-max/system takes precedence)
+    default (exception of app-depth-1/app-depth-2/app-depth-max/system takes precedence)
+      message (exception of app-depth-1/app-depth-2/app-depth-max/system takes precedence)
         "An unhandled exception has occurred while executing the request."
 --------------------------------------------------------------------------
 system:

+ 1 - 14
tests/sentry/grouping/snapshots/test_variants/test_event_hash_variant/mobile@2021_02_12/bugly.pysnap

@@ -1,5 +1,5 @@
 ---
-created: '2021-07-14T12:39:40.877390Z'
+created: '2021-08-04T15:53:48.110339Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -74,13 +74,6 @@ app-depth-max:
     app-depth-max*
       exception*
         stacktrace*
-          frame
-          frame (ignored by stack trace rule (category:internals -group))
-            package* (used as fallback because function name is not available)
-              "libc.so"
-          frame (ignored due to recursion)
-            package* (used as fallback because function name is not available)
-              "libc.so"
           frame*
             function*
               "stripped_application_code"
@@ -89,12 +82,6 @@ app-depth-max:
               "__kernel_rt_sigreturn"
             package (ignored because function takes precedence)
               "[vdso]"
-          frame (ignored by stack trace rule (category:internals -group))
-            package* (used as fallback because function name is not available)
-              "app_process64"
-          frame (ignored by stack trace rule (category:telemetry -group))
-            package* (used as fallback because function name is not available)
-              "libbugly.so"
           frame*
             function*
               "kill"

+ 3 - 130
tests/sentry/grouping/snapshots/test_variants/test_event_hash_variant/mobile@2021_02_12/callee_guaranteed.pysnap

@@ -1,5 +1,5 @@
 ---
-created: '2021-07-08T10:36:06.730608Z'
+created: '2021-08-04T15:53:48.970948Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -60,149 +60,22 @@ app-depth-3:
           "<redacted>"
           2
 --------------------------------------------------------------------------
-app-depth-4:
-  hash: "0211daaed35e19ba74b4d6f08cd00fef"
-  tree_label: "stripped_application_code | stripped_application_code | stripped_application_code | stripped_application_code"
-  component:
-    app-depth-4*
-      exception*
-        stacktrace*
-          frame*
-            function*
-              "stripped_application_code"
-          frame*
-            function*
-              "stripped_application_code"
-          frame*
-            function*
-              "stripped_application_code"
-          frame*
-            function*
-              "stripped_application_code"
-        type*
-          "<redacted>"
-        ns-error*
-          "<redacted>"
-          2
---------------------------------------------------------------------------
 app-depth-max:
-  hash: "0211daaed35e19ba74b4d6f08cd00fef"
-  tree_label: "stripped_application_code | stripped_application_code | stripped_application_code | stripped_application_code"
+  hash: "4ef1fb44d656c3be2a146971f2a222dc"
+  tree_label: "stripped_application_code | stripped_application_code | stripped_application_code"
   component:
     app-depth-max*
       exception*
         stacktrace*
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "start"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "stripped_application_code"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "UIApplicationMain"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "-[UIApplication _run]"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "GSEventRunModal"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "CFRunLoopRunSpecific"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "__CFRunLoopRun"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "_dispatch_main_queue_callback_4CF"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "_dispatch_client_callout"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "_dispatch_call_block_and_release"
-          frame (ignored by stack trace rule (category:internals -group))
-            filename (discarded native filename for grouping stability)
-              "<compiler-generated>"
-            function*
-              "@callee_guaranteed"
           frame*
             function*
               "stripped_application_code"
-          frame (ignored due to recursion)
-            function*
-              "stripped_application_code"
-          frame (ignored due to recursion)
-            function*
-              "stripped_application_code"
-          frame (ignored by stack trace rule (category:internals -group))
-            filename (discarded native filename for grouping stability)
-              "<compiler-generated>"
-            function*
-              "@callee_guaranteed"
-          frame (ignored due to recursion)
-            filename (discarded native filename for grouping stability)
-              "<compiler-generated>"
-            function*
-              "@callee_guaranteed"
           frame*
             function*
               "stripped_application_code"
-          frame (ignored by stack trace rule (category:internals -group))
-            filename (discarded native filename for grouping stability)
-              "<compiler-generated>"
-            function*
-              "@callee_guaranteed"
-          frame*
-            function*
-              "stripped_application_code"
-          frame (ignored due to recursion)
-            function*
-              "stripped_application_code"
-          frame (ignored by stack trace rule (category:internals -group))
-            filename (discarded native filename for grouping stability)
-              "<compiler-generated>"
-            function*
-              "@callee_guaranteed"
-          frame (ignored due to recursion)
-            filename (discarded native filename for grouping stability)
-              "<compiler-generated>"
-            function*
-              "@callee_guaranteed"
-          frame (ignored due to recursion)
-            filename (discarded native filename for grouping stability)
-              "<compiler-generated>"
-            function*
-              "@callee_guaranteed"
-          frame (ignored due to recursion)
-            filename (discarded native filename for grouping stability)
-              "<compiler-generated>"
-            function*
-              "@callee_guaranteed"
-          frame (ignored due to recursion)
-            filename (discarded native filename for grouping stability)
-              "<compiler-generated>"
-            function*
-              "@callee_guaranteed"
           frame*
             function*
               "stripped_application_code"
-          frame (ignored due to recursion)
-            function*
-              "stripped_application_code"
-          frame (ignored due to recursion)
-            function*
-              "stripped_application_code"
-          frame (ignored due to recursion)
-            function*
-              "stripped_application_code"
-          frame (ignored due to recursion)
-            function*
-              "stripped_application_code"
         type*
           "<redacted>"
         ns-error*

+ 11 - 155
tests/sentry/grouping/snapshots/test_variants/test_event_hash_variant/mobile@2021_02_12/connection_error.pysnap

@@ -1,5 +1,5 @@
 ---
-created: '2021-06-30T16:44:00.405354Z'
+created: '2021-08-04T15:53:48.075437Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -25,8 +25,8 @@ app-depth-1:
           "Error while reading from socket: ('Connection closed by server.',)"
 --------------------------------------------------------------------------
 app-depth-2:
-  hash: "ac1a85601e0656df67b159e882145099"
-  tree_label: "__call__ | call_script | is_rate_limited"
+  hash: "1266d500012e00a6c5ffd30faea2b43a"
+  tree_label: "call_script | is_rate_limited"
   component:
     app-depth-2*
       exception*
@@ -49,23 +49,14 @@ app-depth-2:
               "call_script"
             context-line*
               "return script(keys, args, client)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "__call__"
-            context-line*
-              "return client.evalsha(self.sha, len(keys), *args)"
         type*
           "ConnectionError"
         value (ignored because stacktrace takes precedence)
           "Error while reading from socket: ('Connection closed by server.',)"
 --------------------------------------------------------------------------
 app-depth-3:
-  hash: "8538e8eb15b0b93e3355cf9d08268131"
-  tree_label: "evalsha | __call__ | call_script | is_rate_limited | is_rate_limited"
+  hash: "b4f26653d1931cbad5820cdcae76f44f"
+  tree_label: "call_script | is_rate_limited | is_rate_limited"
   component:
     app-depth-3*
       exception*
@@ -97,32 +88,14 @@ app-depth-3:
               "call_script"
             context-line*
               "return script(keys, args, client)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "__call__"
-            context-line*
-              "return client.evalsha(self.sha, len(keys), *args)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "evalsha"
-            context-line*
-              "return self.execute_command('EVALSHA', sha, numkeys, *keys_and_args)"
         type*
           "ConnectionError"
         value (ignored because stacktrace takes precedence)
           "Error while reading from socket: ('Connection closed by server.',)"
 --------------------------------------------------------------------------
 app-depth-4:
-  hash: "a4f739f3240d6c4fc5ed50428442abc1"
-  tree_label: "execute_command | evalsha | __call__ | call_script | is_rate_limited | is_rate_limited | <lambda>"
+  hash: "a1e0d912554c02ca099f24e2f208b2ed"
+  tree_label: "call_script | is_rate_limited | is_rate_limited | <lambda>"
   component:
     app-depth-4*
       exception*
@@ -163,41 +136,14 @@ app-depth-4:
               "call_script"
             context-line*
               "return script(keys, args, client)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "__call__"
-            context-line*
-              "return client.evalsha(self.sha, len(keys), *args)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "evalsha"
-            context-line*
-              "return self.execute_command('EVALSHA', sha, numkeys, *keys_and_args)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "execute_command"
-            context-line*
-              "return self.parse_response(connection, command_name, **options)"
         type*
           "ConnectionError"
         value (ignored because stacktrace takes precedence)
           "Error while reading from socket: ('Connection closed by server.',)"
 --------------------------------------------------------------------------
 app-depth-5:
-  hash: "acb23d293e6a73416ad00df1bb35d8a8"
-  tree_label: "parse_response | execute_command | evalsha | __call__ | call_script | is_rate_limited | is_rate_limited | <lambda> | safe_execute"
+  hash: "6b059b9febc815ac18ac4d2082e38a9b"
+  tree_label: "call_script | is_rate_limited | is_rate_limited | <lambda> | safe_execute"
   component:
     app-depth-5*
       exception*
@@ -247,50 +193,14 @@ app-depth-5:
               "call_script"
             context-line*
               "return script(keys, args, client)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "__call__"
-            context-line*
-              "return client.evalsha(self.sha, len(keys), *args)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "evalsha"
-            context-line*
-              "return self.execute_command('EVALSHA', sha, numkeys, *keys_and_args)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "execute_command"
-            context-line*
-              "return self.parse_response(connection, command_name, **options)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "parse_response"
-            context-line*
-              "response = connection.read_response()"
         type*
           "ConnectionError"
         value (ignored because stacktrace takes precedence)
           "Error while reading from socket: ('Connection closed by server.',)"
 --------------------------------------------------------------------------
 app-depth-max:
-  hash: "013d3477a774fe20c468dc8accd516f1"
-  tree_label: "read_response | read_response | parse_response | execute_command | evalsha | __call__ | call_script | is_rate_limited | is_rate_limited | <lambda> | safe_execute"
+  hash: "6b059b9febc815ac18ac4d2082e38a9b"
+  tree_label: "call_script | is_rate_limited | is_rate_limited | <lambda> | safe_execute"
   component:
     app-depth-max*
       exception*
@@ -340,60 +250,6 @@ app-depth-max:
               "call_script"
             context-line*
               "return script(keys, args, client)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "__call__"
-            context-line*
-              "return client.evalsha(self.sha, len(keys), *args)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "evalsha"
-            context-line*
-              "return self.execute_command('EVALSHA', sha, numkeys, *keys_and_args)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "execute_command"
-            context-line*
-              "return self.parse_response(connection, command_name, **options)"
-          frame*
-            module*
-              "redis.client"
-            filename (module takes precedence)
-              "client.py"
-            function*
-              "parse_response"
-            context-line*
-              "response = connection.read_response()"
-          frame*
-            module*
-              "redis.connection"
-            filename (module takes precedence)
-              "connection.py"
-            function*
-              "read_response"
-            context-line*
-              "response = self._parser.read_response()"
-          frame*
-            module*
-              "redis.connection"
-            filename (module takes precedence)
-              "connection.py"
-            function*
-              "read_response"
-            context-line*
-              "(e.args,))"
         type*
           "ConnectionError"
         value (ignored because stacktrace takes precedence)

+ 6 - 141
tests/sentry/grouping/snapshots/test_variants/test_event_hash_variant/mobile@2021_02_12/custom_fingerprint.pysnap

@@ -1,5 +1,5 @@
 ---
-created: '2021-06-30T16:44:00.537160Z'
+created: '2021-08-04T15:53:48.163399Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -26,7 +26,7 @@ app-depth-1:
 --------------------------------------------------------------------------
 app-depth-2:
   hash: null
-  tree_label: "__exit__ | _prefetch | __init__"
+  tree_label: "_prefetch | __init__"
   component:
     app-depth-2 (custom fingerprint takes precedence)
       exception*
@@ -49,15 +49,6 @@ app-depth-2:
               "_prefetch"
             context-line*
               "exe.submit(fetch_file, idx.offset, idx.blob.getfile)"
-          frame*
-            module*
-              "concurrent.futures._base"
-            filename (module takes precedence)
-              "_base.py"
-            function*
-              "__exit__"
-            context-line*
-              "self.shutdown(wait=True)"
         type*
           "SoftTimeLimitExceeded"
         value (ignored because stacktrace takes precedence)
@@ -65,7 +56,7 @@ app-depth-2:
 --------------------------------------------------------------------------
 app-depth-3:
   hash: null
-  tree_label: "shutdown | __exit__ | _prefetch | __init__ | _get_chunked_blob"
+  tree_label: "_prefetch | __init__ | _get_chunked_blob"
   component:
     app-depth-3 (custom fingerprint takes precedence)
       exception*
@@ -97,24 +88,6 @@ app-depth-3:
               "_prefetch"
             context-line*
               "exe.submit(fetch_file, idx.offset, idx.blob.getfile)"
-          frame*
-            module*
-              "concurrent.futures._base"
-            filename (module takes precedence)
-              "_base.py"
-            function*
-              "__exit__"
-            context-line*
-              "self.shutdown(wait=True)"
-          frame*
-            module*
-              "concurrent.futures.thread"
-            filename (module takes precedence)
-              "thread.py"
-            function*
-              "shutdown"
-            context-line*
-              "t.join(sys.maxint)"
         type*
           "SoftTimeLimitExceeded"
         value (ignored because stacktrace takes precedence)
@@ -122,7 +95,7 @@ app-depth-3:
 --------------------------------------------------------------------------
 app-depth-4:
   hash: null
-  tree_label: "join | shutdown | __exit__ | _prefetch | __init__ | _get_chunked_blob | save_to"
+  tree_label: "_prefetch | __init__ | _get_chunked_blob | save_to"
   component:
     app-depth-4 (custom fingerprint takes precedence)
       exception*
@@ -163,33 +136,6 @@ app-depth-4:
               "_prefetch"
             context-line*
               "exe.submit(fetch_file, idx.offset, idx.blob.getfile)"
-          frame*
-            module*
-              "concurrent.futures._base"
-            filename (module takes precedence)
-              "_base.py"
-            function*
-              "__exit__"
-            context-line*
-              "self.shutdown(wait=True)"
-          frame*
-            module*
-              "concurrent.futures.thread"
-            filename (module takes precedence)
-              "thread.py"
-            function*
-              "shutdown"
-            context-line*
-              "t.join(sys.maxint)"
-          frame*
-            module*
-              "threading"
-            filename (module takes precedence)
-              "threading.py"
-            function*
-              "join"
-            context-line*
-              "self.__block.wait(delay)"
         type*
           "SoftTimeLimitExceeded"
         value (ignored because stacktrace takes precedence)
@@ -197,7 +143,7 @@ app-depth-4:
 --------------------------------------------------------------------------
 app-depth-5:
   hash: null
-  tree_label: "wait | join | shutdown | __exit__ | _prefetch | __init__ | _get_chunked_blob | save_to | _load_cachefiles_via_fs"
+  tree_label: "_prefetch | __init__ | _get_chunked_blob | save_to | _load_cachefiles_via_fs"
   component:
     app-depth-5 (custom fingerprint takes precedence)
       exception*
@@ -247,42 +193,6 @@ app-depth-5:
               "_prefetch"
             context-line*
               "exe.submit(fetch_file, idx.offset, idx.blob.getfile)"
-          frame*
-            module*
-              "concurrent.futures._base"
-            filename (module takes precedence)
-              "_base.py"
-            function*
-              "__exit__"
-            context-line*
-              "self.shutdown(wait=True)"
-          frame*
-            module*
-              "concurrent.futures.thread"
-            filename (module takes precedence)
-              "thread.py"
-            function*
-              "shutdown"
-            context-line*
-              "t.join(sys.maxint)"
-          frame*
-            module*
-              "threading"
-            filename (module takes precedence)
-              "threading.py"
-            function*
-              "join"
-            context-line*
-              "self.__block.wait(delay)"
-          frame*
-            module*
-              "threading"
-            filename (module takes precedence)
-              "threading.py"
-            function*
-              "wait"
-            context-line*
-              "_sleep(delay)"
         type*
           "SoftTimeLimitExceeded"
         value (ignored because stacktrace takes precedence)
@@ -290,7 +200,7 @@ app-depth-5:
 --------------------------------------------------------------------------
 app-depth-max:
   hash: null
-  tree_label: "soft_timeout_sighandler | wait | join | shutdown | __exit__ | _prefetch | __init__ | _get_chunked_blob | save_to | _load_cachefiles_via_fs | get_symcaches | __init__ | preprocess_step | process_stacktraces | _do_process_event | process_event | _wrapped"
+  tree_label: "_prefetch | __init__ | _get_chunked_blob | save_to | _load_cachefiles_via_fs | get_symcaches | __init__ | preprocess_step | process_stacktraces | _do_process_event | process_event | _wrapped"
   component:
     app-depth-max (custom fingerprint takes precedence)
       exception*
@@ -403,51 +313,6 @@ app-depth-max:
               "_prefetch"
             context-line*
               "exe.submit(fetch_file, idx.offset, idx.blob.getfile)"
-          frame*
-            module*
-              "concurrent.futures._base"
-            filename (module takes precedence)
-              "_base.py"
-            function*
-              "__exit__"
-            context-line*
-              "self.shutdown(wait=True)"
-          frame*
-            module*
-              "concurrent.futures.thread"
-            filename (module takes precedence)
-              "thread.py"
-            function*
-              "shutdown"
-            context-line*
-              "t.join(sys.maxint)"
-          frame*
-            module*
-              "threading"
-            filename (module takes precedence)
-              "threading.py"
-            function*
-              "join"
-            context-line*
-              "self.__block.wait(delay)"
-          frame*
-            module*
-              "threading"
-            filename (module takes precedence)
-              "threading.py"
-            function*
-              "wait"
-            context-line*
-              "_sleep(delay)"
-          frame*
-            module*
-              "billiard.pool"
-            filename (module takes precedence)
-              "pool.py"
-            function*
-              "soft_timeout_sighandler"
-            context-line*
-              "raise SoftTimeLimitExceeded()"
         type*
           "SoftTimeLimitExceeded"
         value (ignored because stacktrace takes precedence)

+ 1 - 80
tests/sentry/grouping/snapshots/test_variants/test_event_hash_variant/mobile@2021_02_12/exception_cocoa_nserror.pysnap

@@ -1,5 +1,5 @@
 ---
-created: '2021-08-03T17:19:31.007227Z'
+created: '2021-08-04T15:51:32.427414Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -26,94 +26,15 @@ app-depth-1:
             function*
               "ViewController.captureError"
 --------------------------------------------------------------------------
-app-depth-2:
-  hash: null
-  component:
-    app-depth-2 (exception of app takes precedence)
-      threads (exception of app takes precedence)
-        stacktrace*
-          frame* (marked as prefix frame by stack trace rule (category:ui +sentinel +prefix))
-            function*
-              "-[UIApplication _run]"
-          frame*
-            function*
-              "ViewController.captureError"
---------------------------------------------------------------------------
 app-depth-max:
   hash: null
   component:
     app-depth-max (exception of app takes precedence)
       threads (exception of app takes precedence)
         stacktrace*
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "start"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "main"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "UIApplicationMain"
-          frame* (marked as prefix frame by stack trace rule (category:ui +sentinel +prefix))
-            function*
-              "-[UIApplication _run]"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "GSEventRunModal"
-          frame (ignored by stack trace rule (category:indirection -group))
-            function*
-              "CFRunLoopRunSpecific"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "__CFRunLoopRun"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "__CFRunLoopDoSources0"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "__CFRunLoopDoSource0"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "__eventFetcherSourceCallback"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "__processEventQueue"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "-[UIApplicationAccessibility sendEvent:]"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "-[UIApplication sendEvent:]"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "-[UIWindow sendEvent:]"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "-[UIWindow _sendTouchesForEvent:]"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "-[UIControl touchesEnded:withEvent:]"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "-[UIControl _sendActionsForEvents:withEvent:]"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "-[UIControl sendAction:to:forEvent:]"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "__44-[SentryBreadcrumbTracker swizzleSendAction]_block_invoke_2"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "-[UIApplication sendAction:to:from:forEvent:]"
           frame*
             function*
               "ViewController.captureError"
-          frame (ignored due to recursion)
-            function*
-              "ViewController.captureError"
 --------------------------------------------------------------------------
 system:
   hash: null

+ 1 - 13
tests/sentry/grouping/snapshots/test_variants/test_event_hash_variant/mobile@2021_02_12/fallback_prefix_level_1.pysnap

@@ -1,5 +1,5 @@
 ---
-created: '2021-07-30T14:13:52.088912Z'
+created: '2021-08-04T15:53:48.551274Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -26,21 +26,9 @@ app-depth-max:
     app-depth-max*
       exception*
         stacktrace*
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "start"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "stripped_application_code"
-          frame (ignored by stack trace rule (category:threadbase -group v-group))
-            function*
-              "UIApplicationMain"
           frame* (marked as prefix frame by stack trace rule (category:ui +sentinel +prefix))
             function*
               "-[UIApplication _run]"
-          frame (ignored by stack trace rule (category:internals -group))
-            function*
-              "GSEventRunModal"
           frame* (marked as prefix frame by stack trace rule (category:free +prefix))
             function*
               "objc_release"

Some files were not shown because too many files changed in this diff