Browse Source

fix(grouping): Show some tree labels even though context line is used (#28242)

Co-authored-by: Priscila Oliveira <priscila.oliveira@sentry.io>
Markus Unterwaditzer 3 years ago
parent
commit
2279847460

+ 1 - 1
src/sentry/eventtypes/base.py

@@ -16,7 +16,7 @@ def get_tree_label_part_details(part):
         # 2021-06-09. Same for frontend version.
         return part
 
-    label = part.get("function") or part.get("package") or part.get("type")
+    label = part.get("function") or part.get("package") or part.get("filebase") or part.get("type")
 
     classbase = part.get("classbase")
 

+ 26 - 3
src/sentry/grouping/strategies/newstyle.py

@@ -50,7 +50,9 @@ RECURSION_COMPARISON_FIELDS = [
 
 
 def is_recursion_v1(frame1, frame2):
-    "Returns a boolean indicating whether frames are recursive calls."
+    """
+    Returns a boolean indicating whether frames are recursive calls.
+    """
     if frame2 is None:
         return False
 
@@ -61,11 +63,18 @@ def is_recursion_v1(frame1, frame2):
     return True
 
 
+def get_basename(string):
+    """
+    Returns best-effort basename of a string irrespective of platform.
+    """
+    return _basename_re.split(string)[-1]
+
+
 def get_package_component(package, platform):
     if package is None or platform != "native":
         return GroupingComponent(id="package")
 
-    package = _basename_re.split(package)[-1].lower()
+    package = get_basename(package).lower()
     package_component = GroupingComponent(
         id="package", values=[package], similarity_encoder=ident_encoder
     )
@@ -96,6 +105,12 @@ def get_filename_component(abs_path, filename, platform, allow_file_origin=False
         new_filename = _java_assist_enhancer_re.sub(r"\1<auto>", filename)
         if new_filename != filename:
             filename_component.update(values=[new_filename], hint="cleaned javassist parts")
+            filename = new_filename
+
+    # Best-effort to show a very short filename in the title. We truncate it to
+    # basename so technically there can be two issues that differ in filename
+    # paths but end up having the same title.
+    filename_component.update(tree_label={"filebase": get_basename(filename)})
 
     return filename_component
 
@@ -299,6 +314,11 @@ def frame(frame, event, context, **meta):
 
     values = [module_component, filename_component, function_component]
     if context_line_component is not None:
+        # Typically we want to add whichever frame component contributes to
+        # the title. In JS, frames are hashed by source context, which we
+        # cannot show. In that case we want to show something else instead
+        # of hiding the frame from the title as if it didn't contribute.
+        context_line_component.update(tree_label=function_component.tree_label)
         values.append(context_line_component)
 
     if (
@@ -368,8 +388,9 @@ def frame(frame, event, context, **meta):
     if context["is_recursion"]:
         rv.update(contributes=False, hint="ignored due to recursion")
 
-    if rv.tree_label:
+    if rv.contributes:
         tree_label = {}
+
         for value in rv.values:
             if isinstance(value, GroupingComponent) and value.contributes and value.tree_label:
                 tree_label.update(value.tree_label)
@@ -378,6 +399,8 @@ def frame(frame, event, context, **meta):
             tree_label["datapath"] = frame.datapath
             rv.tree_label = tree_label
         else:
+            # The frame contributes (somehow) but we have nothing meaningful to
+            # show.
             rv.tree_label = None
 
     return {context["variant"]: rv}

+ 1 - 0
static/app/types/index.tsx

@@ -378,6 +378,7 @@ export type TreeLabelPart =
       package?: string;
       type?: string;
       classbase?: string;
+      filebase?: string;
       datapath?: (string | number)[];
       is_sentinel?: boolean;
       is_prefix?: boolean;

+ 1 - 1
static/app/utils/events.tsx

@@ -64,7 +64,7 @@ export function getTreeLabelPartDetails(part: TreeLabelPart) {
     };
   }
 
-  let label = part?.function || part?.package || part?.type;
+  let label = part?.function || part?.package || part?.filebase || part?.type;
   const classbase = part?.classbase;
   if (classbase) {
     if (label) {

+ 204 - 0
tests/sentry/grouping/grouping_inputs/javascript_regression_tree_labels.json

@@ -0,0 +1,204 @@
+{
+  "exception": {
+    "values": [
+      {
+        "mechanism": {
+          "handled": true,
+          "type": "generic"
+        },
+        "raw_stacktrace": {
+          "frames": [
+            {
+              "abs_path": "https://s1.sentry-cdn.com/_static/dist/sentry/chunks/app_actionCreators_tags_tsx-app_actions_savedSearchesActions_tsx-app_components_forms_apiForm-0c4c6a.6e2d643981bbe16ce67b.js",
+              "colno": 60702,
+              "context_line": "{snip} ),a.setExtra(\"code\",r.detail.code),s.Tb(new Error(e))})):s.$e((a=>{a.setExtra(\"status\",t.status),a.setExtra(\"detail\",r.detail),s.Tb(new Erro {snip}",
+              "filename": "/_static/dist/sentry/chunks/app_actionCreators_tags_tsx-app_actions_savedSearchesActions_tsx-app_components_forms_apiForm-0c4c6a.6e2d643981bbe16ce67b.js",
+              "lineno": 1,
+              "post_context": [
+                "//# sourceMappingURL=../sourcemaps/app_actionCreators_tags_tsx-app_actions_savedSearchesActions_tsx-app_components_forms_apiForm-0c4c6a.1054 {snip}"
+              ]
+            },
+            {
+              "abs_path": "https://s1.sentry-cdn.com/_static/dist/sentry/chunks/vendors-node_modules_sentry_minimal_esm_index_js.9747c9fc1b116cf91afd.js",
+              "colno": 7337,
+              "context_line": "{snip} i(\"setTag\",t,e)}function _(t){i(\"setUser\",t)}function y(t){i(\"withScope\",t)}function g(t,e){return i(\"startTransaction\",(0,o.pi)({},t),e)}}, {snip}",
+              "filename": "/_static/dist/sentry/chunks/vendors-node_modules_sentry_minimal_esm_index_js.9747c9fc1b116cf91afd.js",
+              "function": "Object.y",
+              "lineno": 1,
+              "post_context": [
+                "//# sourceMappingURL=../sourcemaps/vendors-node_modules_sentry_minimal_esm_index_js.4aaf96781da16f5906bab6ced49c1a24.js.map"
+              ]
+            },
+            {
+              "abs_path": "https://s1.sentry-cdn.com/_static/dist/sentry/chunks/vendors-node_modules_sentry_minimal_esm_index_js.9747c9fc1b116cf91afd.js",
+              "colno": 6508,
+              "context_line": "{snip} [n-1]=arguments[n];var i=(0,r.Gd)();if(i&&i[t])return i[t].apply(i,(0,o.fl)(e));throw new Error(\"No hub defined or \"+t+\" was not found on th {snip}",
+              "filename": "/_static/dist/sentry/chunks/vendors-node_modules_sentry_minimal_esm_index_js.9747c9fc1b116cf91afd.js",
+              "function": "i",
+              "lineno": 1,
+              "post_context": [
+                "//# sourceMappingURL=../sourcemaps/vendors-node_modules_sentry_minimal_esm_index_js.4aaf96781da16f5906bab6ced49c1a24.js.map"
+              ]
+            },
+            {
+              "abs_path": "https://s1.sentry-cdn.com/_static/dist/sentry/chunks/vendors-node_modules_sentry_minimal_esm_index_js.9747c9fc1b116cf91afd.js",
+              "colno": 1257,
+              "context_line": "{snip} prototype.withScope=function(t){var e=this.pushScope();try{t(e)}finally{this.popScope()}},t.prototype.getClient=function(){return this.getSt {snip}",
+              "filename": "/_static/dist/sentry/chunks/vendors-node_modules_sentry_minimal_esm_index_js.9747c9fc1b116cf91afd.js",
+              "function": "t.withScope",
+              "lineno": 1,
+              "post_context": [
+                "//# sourceMappingURL=../sourcemaps/vendors-node_modules_sentry_minimal_esm_index_js.4aaf96781da16f5906bab6ced49c1a24.js.map"
+              ]
+            },
+            {
+              "abs_path": "https://s1.sentry-cdn.com/_static/dist/sentry/chunks/app_actionCreators_tags_tsx-app_actions_savedSearchesActions_tsx-app_components_forms_apiForm-0c4c6a.6e2d643981bbe16ce67b.js",
+              "colno": 60775,
+              "context_line": "{snip} xtra(\"status\",t.status),a.setExtra(\"detail\",r.detail),s.Tb(new Error(e))}))}}},\"./app/utils/withGlobalSelection.tsx\":(e,t,r)=>{r.d(t,{Z:()=> {snip}",
+              "filename": "/_static/dist/sentry/chunks/app_actionCreators_tags_tsx-app_actions_savedSearchesActions_tsx-app_components_forms_apiForm-0c4c6a.6e2d643981bbe16ce67b.js",
+              "lineno": 1,
+              "post_context": [
+                "//# sourceMappingURL=../sourcemaps/app_actionCreators_tags_tsx-app_actions_savedSearchesActions_tsx-app_components_forms_apiForm-0c4c6a.1054 {snip}"
+              ]
+            }
+          ]
+        },
+        "stacktrace": {
+          "frames": [
+            {
+              "abs_path": "webpack:///./app/utils/handleXhrErrorResponse.tsx",
+              "colno": 7,
+              "context_line": "      Sentry.withScope(scope => {",
+              "data": {
+                "sourcemap": "https://s1.sentry-cdn.com/_static/dist/sentry/sourcemaps/app_actionCreators_tags_tsx-app_actions_savedSearchesActions_tsx-app_components_forms_apiF..."
+              },
+              "filename": "./app/utils/handleXhrErrorResponse.tsx",
+              "lineno": 18,
+              "module": "app/utils/handleXhrErrorResponse",
+              "post_context": [
+                "        scope.setExtra('status', resp.status);",
+                "        scope.setExtra('detail', responseJSON.detail);",
+                "        Sentry.captureException(new Error(message));",
+                "      });",
+                "      return;"
+              ],
+              "pre_context": [
+                "",
+                "    const {responseJSON} = resp;",
+                "",
+                "    // If this is a string then just capture it as error",
+                "    if (typeof responseJSON.detail === 'string') {"
+              ]
+            },
+            {
+              "abs_path": "webpack:///../node_modules/@sentry/minimal/esm/index.js",
+              "colno": 5,
+              "context_line": "    callOnHub('withScope', callback);",
+              "data": {
+                "sourcemap": "https://s1.sentry-cdn.com/_static/dist/sentry/sourcemaps/vendors-node_modules_sentry_minimal_esm_index_js.4aaf96781da16f5906bab6ced49c1a24.js.map"
+              },
+              "filename": "../node_modules/@sentry/minimal/esm/index.js",
+              "function": "Sentry",
+              "lineno": 154,
+              "module": "@sentry/minimal/esm/index",
+              "post_context": [
+                "}",
+                "/**",
+                " * Calls a function on the latest client. Use this with caution, it's meant as",
+                " * in \"internal\" helper so we don't need to expose every possible function in",
+                " * the shim. It is not guaranteed that the client actually implements the"
+              ],
+              "pre_context": [
+                " *     popScope();",
+                " *",
+                " * @param callback that will be enclosed into push/popScope.",
+                " */",
+                "export function withScope(callback) {"
+              ]
+            },
+            {
+              "abs_path": "webpack:///../node_modules/@sentry/minimal/esm/index.js",
+              "colno": 28,
+              "context_line": "        return hub[method].apply(hub, __spread(args));",
+              "data": {
+                "sourcemap": "https://s1.sentry-cdn.com/_static/dist/sentry/sourcemaps/vendors-node_modules_sentry_minimal_esm_index_js.4aaf96781da16f5906bab6ced49c1a24.js.map"
+              },
+              "filename": "../node_modules/@sentry/minimal/esm/index.js",
+              "function": "callOnHub",
+              "lineno": 17,
+              "module": "@sentry/minimal/esm/index",
+              "post_context": [
+                "    }",
+                "    throw new Error(\"No hub defined or \" + method + \" was not found on the hub, please open a bug report.\");",
+                "}",
+                "/**",
+                " * Captures an exception event and sends it to Sentry."
+              ],
+              "pre_context": [
+                "        args[_i - 1] = arguments[_i];",
+                "    }",
+                "    var hub = getCurrentHub();",
+                "    if (hub && hub[method]) {",
+                "        // eslint-disable-next-line @typescript-eslint/no-explicit-any"
+              ]
+            },
+            {
+              "abs_path": "webpack:///../node_modules/@sentry/hub/esm/hub.js",
+              "colno": 13,
+              "context_line": "            callback(scope);",
+              "data": {
+                "sourcemap": "https://s1.sentry-cdn.com/_static/dist/sentry/sourcemaps/vendors-node_modules_sentry_minimal_esm_index_js.4aaf96781da16f5906bab6ced49c1a24.js.map"
+              },
+              "filename": "../node_modules/@sentry/hub/esm/hub.js",
+              "function": "apply",
+              "lineno": 86,
+              "module": "@sentry/hub/esm/hub",
+              "post_context": [
+                "        }",
+                "        finally {",
+                "            this.popScope();",
+                "        }",
+                "    };"
+              ],
+              "pre_context": [
+                "     * @inheritDoc",
+                "     */",
+                "    Hub.prototype.withScope = function (callback) {",
+                "        var scope = this.pushScope();",
+                "        try {"
+              ]
+            },
+            {
+              "abs_path": "webpack:///./app/utils/handleXhrErrorResponse.tsx",
+              "colno": 33,
+              "context_line": "        Sentry.captureException(new Error(message));",
+              "data": {
+                "sourcemap": "https://s1.sentry-cdn.com/_static/dist/sentry/sourcemaps/app_actionCreators_tags_tsx-app_actions_savedSearchesActions_tsx-app_components_forms_apiF..."
+              },
+              "filename": "./app/utils/handleXhrErrorResponse.tsx",
+              "function": "callback",
+              "lineno": 21,
+              "module": "app/utils/handleXhrErrorResponse",
+              "post_context": [
+                "      });",
+                "      return;",
+                "    }",
+                "",
+                "    // Ignore sudo-required errors"
+              ],
+              "pre_context": [
+                "    // If this is a string then just capture it as error",
+                "    if (typeof responseJSON.detail === 'string') {",
+                "      Sentry.withScope(scope => {",
+                "        scope.setExtra('status', resp.status);",
+                "        scope.setExtra('detail', responseJSON.detail);"
+              ]
+            }
+          ]
+        },
+        "type": "Error",
+        "value": "Unable to save a recent search"
+      }
+    ]
+  }
+}

+ 36 - 0
tests/sentry/grouping/similarity/snapshots/test_features/test_similarity_extract_grouping_input/javascript_regression_tree_labels.pysnap

@@ -0,0 +1,36 @@
+---
+created: '2021-08-30T07:01:14.796853Z'
+creator: sentry
+source: tests/sentry/grouping/similarity/test_features.py
+---
+similarity:2020-07-23:stacktrace:frames-pairs: [[["filename","handlexhrerrorresponse.tsx"],["module","app/utils/handleXhrErrorResponse"]],[["filename","index.js"],["function","Sentry"],["module","@sentry/minimal/esm/index"]]]
+similarity:2020-07-23:stacktrace:frames-pairs: [[["filename","hub.js"],["function","apply"],["module","@sentry/hub/esm/hub"]],[["filename","handlexhrerrorresponse.tsx"],["function","callback"],["module","app/utils/handleXhrErrorResponse"]]]
+similarity:2020-07-23:stacktrace:frames-pairs: [[["filename","index.js"],["function","Sentry"],["module","@sentry/minimal/esm/index"]],[["filename","index.js"],["function","callOnHub"],["module","@sentry/minimal/esm/index"]]]
+similarity:2020-07-23:stacktrace:frames-pairs: [[["filename","index.js"],["function","callOnHub"],["module","@sentry/minimal/esm/index"]],[["filename","hub.js"],["function","apply"],["module","@sentry/hub/esm/hub"]]]
+similarity:2020-07-23:type:ident-shingle: "Error"
+similarity:2020-07-23:value:character-5-shingle: " a re"
+similarity:2020-07-23:value:character-5-shingle: " rece"
+similarity:2020-07-23:value:character-5-shingle: " save"
+similarity:2020-07-23:value:character-5-shingle: " sear"
+similarity:2020-07-23:value:character-5-shingle: " to s"
+similarity:2020-07-23:value:character-5-shingle: "Unabl"
+similarity:2020-07-23:value:character-5-shingle: "a rec"
+similarity:2020-07-23:value:character-5-shingle: "able "
+similarity:2020-07-23:value:character-5-shingle: "ave a"
+similarity:2020-07-23:value:character-5-shingle: "ble t"
+similarity:2020-07-23:value:character-5-shingle: "cent "
+similarity:2020-07-23:value:character-5-shingle: "e a r"
+similarity:2020-07-23:value:character-5-shingle: "e to "
+similarity:2020-07-23:value:character-5-shingle: "earch"
+similarity:2020-07-23:value:character-5-shingle: "ecent"
+similarity:2020-07-23:value:character-5-shingle: "ent s"
+similarity:2020-07-23:value:character-5-shingle: "le to"
+similarity:2020-07-23:value:character-5-shingle: "nable"
+similarity:2020-07-23:value:character-5-shingle: "nt se"
+similarity:2020-07-23:value:character-5-shingle: "o sav"
+similarity:2020-07-23:value:character-5-shingle: "recen"
+similarity:2020-07-23:value:character-5-shingle: "save "
+similarity:2020-07-23:value:character-5-shingle: "searc"
+similarity:2020-07-23:value:character-5-shingle: "t sea"
+similarity:2020-07-23:value:character-5-shingle: "to sa"
+similarity:2020-07-23:value:character-5-shingle: "ve a "

+ 132 - 0
tests/sentry/grouping/snapshots/test_variants/test_event_hash_variant/legacy@2019_03_12/javascript_regression_tree_labels.pysnap

@@ -0,0 +1,132 @@
+---
+created: '2021-08-27T14:37:11.614632Z'
+creator: sentry
+source: tests/sentry/grouping/test_variants.py
+---
+app:
+  hash: null
+  component:
+    app (exception of system takes precedence)
+      exception (ignored because hash matches system variant)
+        stacktrace*
+          frame* (frame considered in-app because no frame is in-app)
+            module*
+              "app/utils/handleXhrErrorResponse"
+            filename (module takes precedence)
+              "./app/utils/handleXhrErrorResponse.tsx"
+            context-line*
+              "      Sentry.withScope(scope => {"
+            lineno (line number is not used if context-line is available)
+              18
+          frame* (frame considered in-app because no frame is in-app)
+            module*
+              "@sentry/minimal/esm/index"
+            filename (module takes precedence)
+              "../node_modules/@sentry/minimal/esm/index.js"
+            context-line*
+              "    callOnHub('withScope', callback);"
+            function (function name is not used if context-line is available)
+              "Sentry"
+            lineno (line number is not used if context-line is available)
+              154
+          frame* (frame considered in-app because no frame is in-app)
+            module*
+              "@sentry/minimal/esm/index"
+            filename (module takes precedence)
+              "../node_modules/@sentry/minimal/esm/index.js"
+            context-line*
+              "        return hub[method].apply(hub, __spread(args));"
+            function (function name is not used if context-line is available)
+              "callOnHub"
+            lineno (line number is not used if context-line is available)
+              17
+          frame* (frame considered in-app because no frame is in-app)
+            module*
+              "@sentry/hub/esm/hub"
+            filename (module takes precedence)
+              "../node_modules/@sentry/hub/esm/hub.js"
+            context-line*
+              "            callback(scope);"
+            function (function name is not used if context-line is available)
+              "apply"
+            lineno (line number is not used if context-line is available)
+              86
+          frame* (frame considered in-app because no frame is in-app)
+            module*
+              "app/utils/handleXhrErrorResponse"
+            filename (module takes precedence)
+              "./app/utils/handleXhrErrorResponse.tsx"
+            context-line*
+              "        Sentry.captureException(new Error(message));"
+            function (function name is not used if context-line is available)
+              "callback"
+            lineno (line number is not used if context-line is available)
+              21
+        type*
+          "Error"
+        value (stacktrace and type take precedence)
+          "Unable to save a recent search"
+--------------------------------------------------------------------------
+system:
+  hash: "0edbd7ed5321de5d698621b306f6b8e2"
+  component:
+    system*
+      exception*
+        stacktrace*
+          frame*
+            module*
+              "app/utils/handleXhrErrorResponse"
+            filename (module takes precedence)
+              "./app/utils/handleXhrErrorResponse.tsx"
+            context-line*
+              "      Sentry.withScope(scope => {"
+            lineno (line number is not used if context-line is available)
+              18
+          frame*
+            module*
+              "@sentry/minimal/esm/index"
+            filename (module takes precedence)
+              "../node_modules/@sentry/minimal/esm/index.js"
+            context-line*
+              "    callOnHub('withScope', callback);"
+            function (function name is not used if context-line is available)
+              "Sentry"
+            lineno (line number is not used if context-line is available)
+              154
+          frame*
+            module*
+              "@sentry/minimal/esm/index"
+            filename (module takes precedence)
+              "../node_modules/@sentry/minimal/esm/index.js"
+            context-line*
+              "        return hub[method].apply(hub, __spread(args));"
+            function (function name is not used if context-line is available)
+              "callOnHub"
+            lineno (line number is not used if context-line is available)
+              17
+          frame*
+            module*
+              "@sentry/hub/esm/hub"
+            filename (module takes precedence)
+              "../node_modules/@sentry/hub/esm/hub.js"
+            context-line*
+              "            callback(scope);"
+            function (function name is not used if context-line is available)
+              "apply"
+            lineno (line number is not used if context-line is available)
+              86
+          frame*
+            module*
+              "app/utils/handleXhrErrorResponse"
+            filename (module takes precedence)
+              "./app/utils/handleXhrErrorResponse.tsx"
+            context-line*
+              "        Sentry.captureException(new Error(message));"
+            function (function name is not used if context-line is available)
+              "callback"
+            lineno (line number is not used if context-line is available)
+              21
+        type*
+          "Error"
+        value (stacktrace and type take precedence)
+          "Unable to save a recent search"

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

@@ -1,10 +1,11 @@
 ---
-created: '2021-06-30T15:56:05.969550Z'
+created: '2021-08-31T10:25:51.933838Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
 app-depth-1:
   hash: "9509e122c6175606d52862fa4f64853c"
+  tree_label: "baz.py"
   component:
     app-depth-1*
       exception*
@@ -19,6 +20,7 @@ app-depth-1:
 --------------------------------------------------------------------------
 app-depth-max:
   hash: "9509e122c6175606d52862fa4f64853c"
+  tree_label: "baz.py"
   component:
     app-depth-max*
       exception*
@@ -33,6 +35,7 @@ app-depth-max:
 --------------------------------------------------------------------------
 system:
   hash: "9509e122c6175606d52862fa4f64853c"
+  tree_label: "baz.py"
   component:
     system*
       exception*

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

@@ -1,10 +1,11 @@
 ---
-created: '2021-06-30T15:56:05.409452Z'
+created: '2021-08-31T10:25:51.014818Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
 app-depth-1:
   hash: "9509e122c6175606d52862fa4f64853c"
+  tree_label: "baz.py"
   component:
     app-depth-1*
       exception*
@@ -19,6 +20,7 @@ app-depth-1:
 --------------------------------------------------------------------------
 app-depth-max:
   hash: "9509e122c6175606d52862fa4f64853c"
+  tree_label: "baz.py"
   component:
     app-depth-max*
       exception*
@@ -33,6 +35,7 @@ app-depth-max:
 --------------------------------------------------------------------------
 system:
   hash: "9509e122c6175606d52862fa4f64853c"
+  tree_label: "baz.py"
   component:
     system*
       exception*

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

@@ -1,10 +1,11 @@
 ---
-created: '2021-06-30T15:56:04.771739Z'
+created: '2021-08-31T10:25:50.657036Z'
 creator: sentry
 source: tests/sentry/grouping/test_variants.py
 ---
 app-depth-1:
   hash: "669cb6664e0f5fed38665da04e464f7e"
+  tree_label: "baz.py"
   component:
     app-depth-1*
       chained-exception*
@@ -29,6 +30,7 @@ app-depth-1:
 --------------------------------------------------------------------------
 app-depth-max:
   hash: "669cb6664e0f5fed38665da04e464f7e"
+  tree_label: "baz.py"
   component:
     app-depth-max*
       chained-exception*
@@ -53,6 +55,7 @@ app-depth-max:
 --------------------------------------------------------------------------
 system:
   hash: "669cb6664e0f5fed38665da04e464f7e"
+  tree_label: "baz.py"
   component:
     system*
       chained-exception*

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