{"componentChunkName":"component---src-templates-platform-tsx","path":"/platforms/native/guides/crashpad/data-management/event-grouping/","result":{"data":{"file":{"id":"36ba6522-9c5a-5b22-a16f-e7d88b072787","relativePath":"common/data-management/event-grouping/index.mdx","sourceInstanceName":"platforms","childMarkdownRemark":null,"childMdx":{"body":"function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"title\": \"Issue Grouping\",\n  \"sidebar_order\": 0,\n  \"redirect_from\": [\"/data-management/rollups/\", \"/learn/rollups/\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, [\"components\"]);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"All events have a fingerprint. Events with the same fingerprint are grouped together into an issue. By default, Sentry will run one of our built-in grouping algorithms to generate a fingerprint based on information available within the event such as \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"stacktrace\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"exception\"), \", and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"message\"), \". To extend the default grouping behavior or change it completely, you can use a combination of the following options:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"./sdk-fingerprinting/\"\n  }), \"SDK Fingerprinting\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"./server-side-fingerprinting/\"\n  }), \"Server-side Fingerprinting\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"./grouping-enhancements/\"\n  }), \"Custom Grouping Enhancements\"))), mdx(\"h2\", {\n    \"id\": \"grouping-algorithms\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h2\"\n  }, {\n    \"href\": \"#grouping-algorithms\",\n    \"aria-label\": \"grouping algorithms permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Grouping Algorithms\"), mdx(\"p\", null, \"Each time the default behavior is modified, Sentry releases it as a new version so it does not affect how existing issues are grouped. When you create a Sentry project, the latest and greatest version of the grouping algorithm is automatically selected. This means that the grouping behavior is consistent within a project. If you want to upgrade an existing project to a new grouping algorithm version, you can do so in the project settings. When upgrading you will very likely see new groups being created.\"), mdx(\"p\", null, \"All versions consider the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"stacktrace\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"exception\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"message\"), \".\"), mdx(\"h3\", {\n    \"id\": \"grouping-by-stacktrace\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#grouping-by-stacktrace\",\n    \"aria-label\": \"grouping by stacktrace permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Grouping by Stacktrace\"), mdx(\"p\", null, \"When Sentry detects a stack trace in the event data (either directly or as part of an exception), the grouping is effectively based entirely on the stack trace. This grouping is fairly involved but easy enough to understand.\"), mdx(\"p\", null, \"The first and most important part is that Sentry only groups by stack trace frames reported to be from your application. Not all SDKs report this, but if that information is provided, it\\u2019s used for grouping. This means that if two stack traces differ only in parts of the stack that are not related to the application, they'll still be grouped together.\"), mdx(\"p\", null, \"Depending on the information available, the following data can be used for each stack trace frame:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Module name\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Normalized filename (with revision hashes, etc. removed)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Normalized context line (essentially a cleaned up version of the sourcecode of the affected line, if provided)\")), mdx(\"p\", null, \"This grouping usually works well, but two specific situations can throw it off if not dealt with:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Minimized JavaScript sourcecode will destroy the grouping in really bad ways. Because of this you should ensure that Sentry can access your \", mdx(\"a\", _extends({\n    parentName: \"li\"\n  }, {\n    \"href\": \"/platforms/javascript/sourcemaps/\"\n  }), \"Source Maps\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"If you modify your stack trace by introducing a new level through the use of decorators, your stack trace will change and so will the grouping. To handle this, many SDKs support hiding irrelevant stack trace frames. (For example, the Python SDK will skip all stack frames with a local variable called \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"__traceback_hide__\"), \" set to \", mdx(\"em\", {\n    parentName: \"li\"\n  }, \"True\"), \").\")), mdx(\"h3\", {\n    \"id\": \"grouping-by-exception\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#grouping-by-exception\",\n    \"aria-label\": \"grouping by exception permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Grouping By Exception\"), mdx(\"p\", null, \"If no stack trace is available but exception info is, then the grouping will consider the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"type\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"value\"), \" of the exception, as long as both pieces of data are present on the event. This grouping is a lot less reliable because of changing error messages.\"), mdx(\"h3\", {\n    \"id\": \"fallback-grouping\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", _extends({\n    parentName: \"h3\"\n  }, {\n    \"href\": \"#fallback-grouping\",\n    \"aria-label\": \"fallback grouping permalink\",\n    \"className\": \"anchor before\"\n  }), mdx(\"svg\", _extends({\n    parentName: \"a\"\n  }, {\n    \"viewBox\": \"0 0 24 24\",\n    \"xmlns\": \"http://www.w3.org/2000/svg\"\n  }), mdx(\"path\", _extends({\n    parentName: \"svg\"\n  }, {\n    \"d\": \"M10.879 6.05L15 1.93A5.001 5.001 0 0 1 22.071 9l-4.121 4.121a1 1 0 0 1-1.414-1.414l4.12-4.121a3 3 0 1 0-4.242-4.243l-4.121 4.121a1 1 0 1 1-1.414-1.414zm2.242 11.9L9 22.07A5 5 0 1 1 1.929 15l4.121-4.121a1 1 0 0 1 1.414 1.414l-4.12 4.121a3 3 0 1 0 4.242 4.243l4.121-4.121a1 1 0 1 1 1.414 1.414zm-8.364-.122l13.071-13.07a1 1 0 0 1 1.415 1.414L6.172 19.242a1 1 0 1 1-1.415-1.414z\",\n    \"fill\": \"currentColor\"\n  })))), \"Fallback Grouping\"), mdx(\"p\", null, \"If everything else fails, grouping falls back to messages. In this case the grouping algorithm will try to use the message without any parameters, but if that is not available, it will use the full message attribute.\"));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#grouping-algorithms","title":"Grouping Algorithms","items":[{"url":"#grouping-by-stacktrace","title":"Grouping by Stacktrace"},{"url":"#grouping-by-exception","title":"Grouping By Exception"},{"url":"#fallback-grouping","title":"Fallback Grouping"}]}]},"internal":{"type":"Mdx"}}}},"pageContext":{"excerpt":"All events have a fingerprint. Events with the same fingerprint are grouped together into an issue. By default, Sentry will run one of our built-in grouping algorithms to generate a fingerprint based on information available within the event such as  stacktrace ,  exception , and  message . To extend the default grouping behavior or change it completely, you can use a combination of the following options: SDK Fingerprinting Server-side Fingerprinting Custom Grouping Enhancements Grouping Algorithms Each time the default behavior is modified, Sentry releases it as a new version so it does not affect how existing issues are grouped. When you create a Sentry project, the latest and greatest version of the grouping algorithm is automatically selected. This means that the grouping behavior is consistent within a project. If you want to upgrade an existing project to a new grouping algorithm version, you can do so in the project settings. When upgrading you will very likely see new groups being created. All versions consider the  stacktrace ,  exception  and  message . Grouping by Stacktrace When Sentry detects a stack trace in the event data (either directly or as part of an exception), the grouping is effectively based entirely on the stack trace. This grouping is fairly involved but easy enough to understand. The first and most important part is that Sentry only groups by stack trace frames reported to be from your application. Not all SDKs report this, but if that information is provided, it’s used for grouping. This means that if two stack traces differ only in parts of the stack that are not related to the application, they'll still be grouped together. Depending on the information available, the following data can be used for each stack trace frame: Module name Normalized filename (with revision hashes, etc. removed) Normalized context line (essentially a cleaned up version of the sourcecode of the affected line, if provided) This grouping usually works well, but two specific situations can throw it off if not dealt with: Minimized JavaScript sourcecode will destroy the grouping in really bad ways. Because of this you should ensure that Sentry can access your  Source Maps . If you modify your stack trace by introducing a new level through the use of decorators, your stack trace will change and so will the grouping. To handle this, many SDKs support hiding irrelevant stack trace frames. (For example, the Python SDK will skip all stack frames with a local variable called  __traceback_hide__  set to  True ). Grouping By Exception If no stack trace is available but exception info is, then the grouping will consider the  type  and  value  of the exception, as long as both pieces of data are present on the event. This grouping is a lot less reliable because of changing error messages. Fallback Grouping If everything else fails, grouping falls back to messages. In this case the grouping algorithm will try to use the message without any parameters, but if that is not available, it will use the full message attribute.","title":"Issue Grouping","redirect_from":[],"platform":{"name":"native","title":"Native"},"guide":{"name":"crashpad","title":"Google Crashpad"},"noindex":true,"notoc":true,"id":"36ba6522-9c5a-5b22-a16f-e7d88b072787"}},"staticQueryHashes":["1218203755","1222113826","1222113826","1766336459","2158593473","2404336828","2472290386","2764967025","3818502851","4015007367","4192517163","4264099332","518019976"]}