Browse Source

fix(grouping): Deduplicate hashes before using them (#25887)

* fix(grouping): Deduplicate hashes before inserting them into Snuba

Previously we would try to deduplicate hashes from within the grouping
strategy. That turns out to be buggy and annoying to code. For example,
at some point I accidentally removed the final hierarchical hash that
used the entire stacktrace (app-depth-max).

Instead we now just deduplicate hashes after they have been computed and
don't worry about creating many variants from within grouping.

* Update src/sentry/eventstore/models.py

Co-authored-by: Joris Bayer <joris.bayer@sentry.io>

Co-authored-by: Joris Bayer <joris.bayer@sentry.io>
Markus Unterwaditzer 3 years ago
parent
commit
e268a612e4

+ 12 - 3
src/sentry/eventstore/models.py

@@ -381,9 +381,18 @@ class Event:
 
     @staticmethod
     def _hashes_from_sorted_grouping_variants(variants):
-        """ Create hashes from variants and filter out None values """
-        hashes = (variant.get_hash() for variant in variants)
-        return [hash_ for hash_ in hashes if hash_ is not None]
+        """ Create hashes from variants and filter out duplicates and None values """
+        filtered_hashes = []
+        seen_hashes = set()
+        for variant in variants:
+            hash_ = variant.get_hash()
+            if hash_ is None or hash_ in seen_hashes:
+                continue
+
+            seen_hashes.add(hash_)
+            filtered_hashes.append(hash_)
+
+        return filtered_hashes
 
     def get_grouping_variants(self, force_config=None, normalize_stacktraces=False):
         """

+ 3 - 5
src/sentry/grouping/strategies/hierarchical.py

@@ -59,13 +59,14 @@ def get_stacktrace_hierarchy(main_variant, components, frames, inverted_hierarch
         all_variants[key] = prev_variant = GroupingComponent(
             id="stacktrace", values=layer, tree_label=tree_label
         )
-    else:
-        all_variants["app-depth-max"] = main_variant
 
     if not all_variants:
         all_variants.update(
             _build_fallback_tree(main_variant, components, frames, inverted_hierarchy)
         )
+
+    all_variants["app-depth-max"] = main_variant
+
     return all_variants
 
 
@@ -130,9 +131,6 @@ def _build_fallback_tree(main_variant, components, frames, inverted_hierarchy):
             tree_label=tree_label,
         )
 
-    else:
-        all_variants["app-depth-max"] = main_variant
-
     return all_variants
 
 

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

@@ -1,5 +1,5 @@
 ---
-created: '2021-04-30T12:13:36.876582Z'
+created: '2021-05-05T18:04:41.142702Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -35,7 +35,7 @@ app-depth-1:
           "ApplicationNotResponding"
         value (ignored because stacktrace takes precedence)
           "Application Not Responding for at least <int> ms."
-      threads (exception of app-depth-1/system takes precedence)
+      threads (exception of app-depth-1/app-depth-max/system takes precedence)
         stacktrace*
           frame*
             module*
@@ -45,6 +45,790 @@ app-depth-1:
             function*
               "getThreadStackTrace"
 --------------------------------------------------------------------------
+app-depth-max:
+  hash: "81103d430ba24ccad51cdbf81de2297a"
+  tree_label: "<entire stacktrace>"
+  component:
+    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*
+            module*
+              "android.os.Looper"
+            filename (module takes precedence)
+              "looper.java"
+            function*
+              "loop"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.os.Handler"
+            filename (module takes precedence)
+              "handler.java"
+            function*
+              "dispatchMessage"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.os.Handler"
+            filename (module takes precedence)
+              "handler.java"
+            function*
+              "handleCallback"
+          frame (ignored by stack trace rule (category:indirection -group))
+            module*
+              "android.view.Choreographer$FrameDisplayEventReceiver"
+            filename (module takes precedence)
+              "choreographer.java"
+            function*
+              "run"
+          frame* (marked as prefix frame by stack trace rule (category:ui +sentinel +prefix))
+            module*
+              "android.view.Choreographer"
+            filename (module takes precedence)
+              "choreographer.java"
+            function*
+              "doFrame"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.Choreographer"
+            filename (module takes precedence)
+              "choreographer.java"
+            function*
+              "doCallbacks"
+          frame (ignored by stack trace rule (category:indirection -group))
+            module*
+              "android.view.Choreographer$CallbackRecord"
+            filename (module takes precedence)
+              "choreographer.java"
+            function*
+              "run"
+          frame (ignored by stack trace rule (category:indirection -group))
+            module*
+              "android.view.ViewRootImpl$TraversalRunnable"
+            filename (module takes precedence)
+              "viewrootimpl.java"
+            function*
+              "run"
+          frame* (marked as prefix frame by stack trace rule (category:ui +sentinel +prefix))
+            module*
+              "android.view.ViewRootImpl"
+            filename (module takes precedence)
+              "viewrootimpl.java"
+            function*
+              "doTraversal"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewRootImpl"
+            filename (module takes precedence)
+              "viewrootimpl.java"
+            function*
+              "performTraversals"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewRootImpl"
+            filename (module takes precedence)
+              "viewrootimpl.java"
+            function*
+              "performLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "layoutVertical"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "setChildFrame"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "layoutVertical"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "setChildFrame"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "layoutVertical"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "setChildFrame"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "layoutVertical"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "setChildFrame"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "layoutVertical"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.LinearLayout"
+            filename (module takes precedence)
+              "linearlayout.java"
+            function*
+              "setChildFrame"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "onLayout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.widget.FrameLayout"
+            filename (module takes precedence)
+              "framelayout.java"
+            function*
+              "layoutChildren"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.ViewGroup"
+            filename (module takes precedence)
+              "viewgroup.java"
+            function*
+              "layout"
+          frame (ignored by stack trace rule (category:internals -group))
+            module*
+              "android.view.View"
+            filename (module takes precedence)
+              "view.java"
+            function*
+              "layout"
+          frame*
+            module*
+              "androidx.recyclerview.widget.RecyclerView"
+            filename (module takes precedence)
+              "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)
+          "Application Not Responding for at least <int> ms."
+      threads (exception of app-depth-1/app-depth-max/system takes precedence)
+        stacktrace*
+          frame (ignored by stack trace rule (category:threadbase -group v-group))
+            module*
+              "java.lang.Thread"
+            filename (module takes precedence)
+              "thread.java"
+            function*
+              "getStackTrace"
+          frame*
+            module*
+              "dalvik.system.VMStack"
+            filename (module takes precedence)
+              "vmstack.java"
+            function*
+              "getThreadStackTrace"
+--------------------------------------------------------------------------
 system:
   hash: "81103d430ba24ccad51cdbf81de2297a"
   tree_label: "<entire stacktrace>"
@@ -812,7 +1596,7 @@ system:
           "ApplicationNotResponding"
         value (ignored because stacktrace takes precedence)
           "Application Not Responding for at least <int> ms."
-      threads (exception of app-depth-1/system takes precedence)
+      threads (exception of app-depth-1/app-depth-max/system takes precedence)
         stacktrace*
           frame (ignored by stack trace rule (category:threadbase -group v-group))
             module*

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

@@ -1,5 +1,5 @@
 ---
-created: '2021-04-22T14:32:55.424993Z'
+created: '2021-05-05T18:04:39.852089Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -73,6 +73,82 @@ app-depth-3:
             function*
               "main"
 --------------------------------------------------------------------------
+app-depth-max:
+  hash: null
+  component:
+    app-depth-max (exception of app takes precedence)
+      threads (exception of app takes precedence)
+        stacktrace*
+          frame*
+            function*
+              "start"
+          frame*
+            function*
+              "main"
+          frame* (marked as prefix frame by stack trace rule (category:ui +sentinel +prefix))
+            function*
+              "UIApplicationMain"
+          frame (ignored by stack trace rule (category:internals -group))
+            function*
+              "-[UIApplication _run]"
+          frame*
+            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* (marked as prefix frame by stack trace rule (category:ui +sentinel +prefix))
+            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*
+            function*
+              "__44-[SentryBreadcrumbTracker swizzleSendAction]_block_invoke_2"
+          frame* (marked as prefix frame by stack trace rule (category:ui +sentinel +prefix))
+            function*
+              "-[UIApplication sendAction:to:from:forEvent:]"
+          frame*
+            function*
+              "ViewController.captureError"
+          frame (ignored due to recursion)
+            function*
+              "ViewController.captureError"
+--------------------------------------------------------------------------
 system:
   hash: null
   component:

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

@@ -1,5 +1,5 @@
 ---
-created: '2021-04-30T12:13:38.862512Z'
+created: '2021-05-05T18:04:39.600300Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -17,6 +17,21 @@ app-depth-1:
         value (ignored because stacktrace takes precedence)
           "hello world"
 --------------------------------------------------------------------------
+app-depth-max:
+  hash: "9509e122c6175606d52862fa4f64853c"
+  tree_label: "<entire stacktrace>"
+  component:
+    app-depth-max*
+      exception*
+        stacktrace*
+          frame*
+            filename*
+              "baz.py"
+        type*
+          "ValueError"
+        value (ignored because stacktrace takes precedence)
+          "hello world"
+--------------------------------------------------------------------------
 system:
   hash: "9509e122c6175606d52862fa4f64853c"
   tree_label: "<entire stacktrace>"

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

@@ -1,5 +1,5 @@
 ---
-created: '2021-04-30T12:13:37.621130Z'
+created: '2021-05-05T18:04:39.161561Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -17,6 +17,21 @@ app-depth-1:
         value (ignored because stacktrace takes precedence)
           "hello world"
 --------------------------------------------------------------------------
+app-depth-max:
+  hash: "9509e122c6175606d52862fa4f64853c"
+  tree_label: "<entire stacktrace>"
+  component:
+    app-depth-max*
+      exception*
+        stacktrace*
+          frame*
+            filename*
+              "baz.py"
+        type*
+          "ValueError"
+        value (ignored because stacktrace takes precedence)
+          "hello world"
+--------------------------------------------------------------------------
 system:
   hash: "9509e122c6175606d52862fa4f64853c"
   tree_label: "<entire stacktrace>"

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

@@ -1,5 +1,5 @@
 ---
-created: '2021-04-30T12:13:37.357811Z'
+created: '2021-05-05T18:04:38.716500Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -27,6 +27,31 @@ app-depth-1:
           value (ignored because stacktrace takes precedence)
             "hello world"
 --------------------------------------------------------------------------
+app-depth-max:
+  hash: "669cb6664e0f5fed38665da04e464f7e"
+  tree_label: "<entire stacktrace>"
+  component:
+    app-depth-max*
+      chained-exception*
+        exception*
+          stacktrace*
+            frame*
+              filename*
+                "baz.py"
+          type*
+            "ValueError"
+          value (ignored because stacktrace takes precedence)
+            "hello world"
+        exception*
+          stacktrace*
+            frame*
+              filename*
+                "baz.py"
+          type*
+            "ValueError"
+          value (ignored because stacktrace takes precedence)
+            "hello world"
+--------------------------------------------------------------------------
 system:
   hash: "669cb6664e0f5fed38665da04e464f7e"
   tree_label: "<entire stacktrace>"

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

@@ -1,5 +1,5 @@
 ---
-created: '2021-04-30T12:13:37.514797Z'
+created: '2021-05-05T18:04:39.059761Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -51,6 +51,34 @@ app-depth-2:
         value (ignored because stacktrace takes precedence)
           "Cannot read property 'submitError' of null"
 --------------------------------------------------------------------------
+app-depth-max:
+  hash: "26552f86ca2368e708afa1df6effc1c5"
+  tree_label: "<entire stacktrace>"
+  component:
+    app-depth-max*
+      exception*
+        stacktrace*
+          frame*
+            module*
+              "app/components/modals/createTeamModal"
+            filename (module takes precedence)
+              "createteammodal.jsx"
+            context-line*
+              "onError(err);"
+          frame*
+            module*
+              "app/views/settings/components/forms/form"
+            filename (module takes precedence)
+              "form.jsx"
+            function (ignored because sourcemap used and context line available)
+              "onError"
+            context-line*
+              "this.model.submitError(error);"
+        type*
+          "TypeError"
+        value (ignored because stacktrace takes precedence)
+          "Cannot read property 'submitError' of null"
+--------------------------------------------------------------------------
 system:
   hash: "26552f86ca2368e708afa1df6effc1c5"
   tree_label: "<entire stacktrace>"

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

@@ -1,5 +1,5 @@
 ---
-created: '2021-04-30T12:13:37.795803Z'
+created: '2021-05-05T18:04:39.559305Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -15,6 +15,18 @@ app-depth-1:
           function*
             "invoke"
 --------------------------------------------------------------------------
+app-depth-max:
+  hash: "526b64456c48836a46ec1a89544fd412"
+  tree_label: "<entire stacktrace>"
+  component:
+    app-depth-max*
+      stacktrace*
+        frame*
+          module* (removed codegen marker)
+            "sentry_clojure_example.core$_main$fn__<auto>"
+          function*
+            "invoke"
+--------------------------------------------------------------------------
 system:
   hash: "526b64456c48836a46ec1a89544fd412"
   tree_label: "<entire stacktrace>"

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

@@ -1,5 +1,5 @@
 ---
-created: '2021-04-30T12:13:37.994609Z'
+created: '2021-05-05T18:04:40.027133Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
@@ -15,6 +15,18 @@ app-depth-1:
           function*
             "jipJipManagementApplication"
 --------------------------------------------------------------------------
+app-depth-max:
+  hash: "45c0b0a8c777e7a7040d7c39233a08a5"
+  tree_label: "<entire stacktrace>"
+  component:
+    app-depth-max*
+      stacktrace*
+        frame*
+          module* (removed codegen marker)
+            "invalid.gruml.talkytalkyhub.common.config.JipJipConfig$$EnhancerBySpringCGLIB$$<auto>"
+          function*
+            "jipJipManagementApplication"
+--------------------------------------------------------------------------
 system:
   hash: "45c0b0a8c777e7a7040d7c39233a08a5"
   tree_label: "<entire stacktrace>"

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