Browse Source

Add abs_path to stored event data

David Burke 2 years ago
parent
commit
2bd58b566e

+ 0 - 3
events/event_processors/javascript.py

@@ -43,9 +43,6 @@ class JavascriptEventProcessor(EventProcessorBase):
             frames[0]["function"],
             # minified_source
         )
-        import ipdb
-
-        ipdb.set_trace()
 
         # TODO get stacktrace files names, filter only those release files
         return data

+ 34 - 13
events/serializers.py

@@ -245,25 +245,28 @@ class StoreDefaultSerializer(SentrySDKEventSerializer):
         release.projects.add(project)
         return release
 
+    def is_url(self, filename: str) -> bool:
+        return filename.startswith(("file:", "http:", "https:", "applewebdata:"))
+
+    def normalize_stacktrace(self, stacktrace):
+        """
+        Port of semaphore store/normalize/stacktrace.rs
+        """
+        if not stacktrace:
+            return
+        for frame in stacktrace.get("frames", []):
+            if not frame.get("abs_path") and frame.get("filename"):
+                frame["abs_path"] = frame["filename"]
+            if frame.get("filename") and self.is_url(frame["filename"]):
+                frame["filename"] = urlparse(frame["filename"]).path
+
+
     def create(self, data):
         project = self.context.get("project")
-        release = None
-        if data.get("release"):
-            release = self.get_release(data["release"], project)
-
-        for Processor in EVENT_PROCESSORS:
-            Processor(project, release).run(data)
 
         eventtype = self.get_eventtype()
         metadata = eventtype.get_metadata(data)
-        title = eventtype.get_title(metadata)
-        culprit = eventtype.get_location(data)
-        request = data.get("request")
-        breadcrumbs = data.get("breadcrumbs")
         exception = data.get("exception")
-        level = None
-        if data.get("level"):
-            level = LogLevel.from_string(data["level"])
         if (
             data.get("stacktrace")
             and exception
@@ -274,6 +277,24 @@ class StoreDefaultSerializer(SentrySDKEventSerializer):
             # Assume it's for the first exception value
             exception["values"][0]["stacktrace"] = data.get("stacktrace")
         exception = self.modify_exception(exception)
+        if isinstance(exception, dict):
+            for value in exception.get("values", []):
+                self.normalize_stacktrace(value.get("stacktrace"))
+
+        release = None
+        if data.get("release"):
+            release = self.get_release(data["release"], project)
+
+        for Processor in EVENT_PROCESSORS:
+            Processor(project, release).run(data)
+
+        title = eventtype.get_title(metadata)
+        culprit = eventtype.get_location(data)
+        request = data.get("request")
+        breadcrumbs = data.get("breadcrumbs")
+        level = None
+        if data.get("level"):
+            level = LogLevel.from_string(data["level"])
         if request:
             headers = request.get("headers")
             if headers:

+ 64 - 0
events/test_data/incoming_events/small_js_error.json

@@ -0,0 +1,64 @@
+{
+  "exception": {
+    "values": [
+      {
+        "type": "Error",
+        "value": "this is an error",
+        "stacktrace": {
+          "frames": [
+            {
+              "filename": "http://127.0.0.1:8080/dist/bundle.js",
+              "function": "?",
+              "in_app": true,
+              "lineno": 2,
+              "colno": 74008
+            },
+            {
+              "filename": "http://127.0.0.1:8080/dist/bundle.js",
+              "function": "?",
+              "in_app": true,
+              "lineno": 2,
+              "colno": 74004
+            },
+            {
+              "filename": "http://127.0.0.1:8080/dist/bundle.js",
+              "function": "?",
+              "in_app": true,
+              "lineno": 2,
+              "colno": 73977
+            }
+          ]
+        },
+        "mechanism": { "type": "onerror", "handled": false }
+      }
+    ]
+  },
+  "level": "error",
+  "platform": "javascript",
+  "event_id": "00952c9936084f759aecdb0f195dd82f",
+  "timestamp": 1648917513.218,
+  "environment": "production",
+  "sdk": {
+    "integrations": [
+      "InboundFilters",
+      "FunctionToString",
+      "TryCatch",
+      "Breadcrumbs",
+      "GlobalHandlers",
+      "LinkedErrors",
+      "Dedupe",
+      "UserAgent"
+    ],
+    "name": "sentry.javascript.browser",
+    "version": "6.19.2",
+    "packages": [{ "name": "npm:@sentry/browser", "version": "6.19.2" }]
+  },
+  "request": {
+    "url": "http://127.0.0.1:8080/",
+    "headers": {
+      "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0"
+    }
+  },
+  "tags": { "skippedNormalization": true },
+  "extra": { "normalizeDepth": 3 }
+}

+ 237 - 0
events/test_data/oss_sentry_events/small_js_error.json

@@ -0,0 +1,237 @@
+{
+  "eventID": "00952c9936084f759aecdb0f195dd82f",
+  "dist": null,
+  "userReport": null,
+  "projectID": "11",
+  "previousEventID": null,
+  "message": "Error this is an error /dist/bundle.js ?(/dist/bundle.js)",
+  "id": "5253",
+  "size": 2122,
+  "errors": [
+    {
+      "data": {
+        "url": "http://127.0.0.1:8080/dist/bundle.js",
+        "value": "<class 'requests.exceptions.ConnectionError'>"
+      },
+      "message": "Unable to fetch HTTP resource",
+      "type": "fetch_generic_error"
+    }
+  ],
+  "culprit": "?(/dist/bundle.js)",
+  "title": "Error: this is an error",
+  "platform": "javascript",
+  "location": "/dist/bundle.js",
+  "nextEventID": null,
+  "type": "error",
+  "metadata": {
+    "type": "Error",
+    "value": "this is an error",
+    "filename": "/dist/bundle.js"
+  },
+  "groupingConfig": {
+    "id": "legacy:2019-03-12"
+  },
+  "crashFile": null,
+  "tags": [
+    {
+      "value": "Firefox 98.0",
+      "key": "browser",
+      "_meta": null
+    },
+    {
+      "value": "Firefox",
+      "key": "browser.name",
+      "_meta": null
+    },
+    {
+      "value": "production",
+      "key": "environment",
+      "_meta": null
+    },
+    {
+      "value": "no",
+      "key": "handled",
+      "_meta": null
+    },
+    {
+      "value": "error",
+      "key": "level",
+      "_meta": null
+    },
+    {
+      "value": "onerror",
+      "key": "mechanism",
+      "_meta": null
+    },
+    {
+      "value": "Ubuntu",
+      "key": "os.name",
+      "_meta": null
+    },
+    {
+      "value": "True",
+      "key": "skippedNormalization",
+      "_meta": null
+    },
+    {
+      "value": "http://127.0.0.1:8080/",
+      "key": "url",
+      "_meta": null
+    },
+    {
+      "query": "user.ip:71.249.111.206",
+      "value": "ip:71.249.111.206",
+      "key": "user",
+      "_meta": null
+    }
+  ],
+  "dateCreated": "2022-04-02T16:38:33.218Z",
+  "dateReceived": "2022-04-02T16:39:25.093Z",
+  "user": {
+    "username": null,
+    "name": null,
+    "ip_address": "71.249.111.206",
+    "email": null,
+    "data": {},
+    "id": null
+  },
+  "entries": [
+    {
+      "type": "exception",
+      "data": {
+        "values": [
+          {
+            "stacktrace": {
+              "frames": [
+                {
+                  "function": null,
+                  "colNo": 74008,
+                  "vars": null,
+                  "symbol": null,
+                  "module": "dist/bundle",
+                  "lineNo": 2,
+                  "trust": null,
+                  "errors": null,
+                  "package": null,
+                  "absPath": "http://127.0.0.1:8080/dist/bundle.js",
+                  "inApp": false,
+                  "instructionAddr": null,
+                  "filename": "/dist/bundle.js",
+                  "platform": null,
+                  "context": [],
+                  "symbolAddr": null
+                },
+                {
+                  "function": null,
+                  "colNo": 74004,
+                  "vars": null,
+                  "symbol": null,
+                  "module": "dist/bundle",
+                  "lineNo": 2,
+                  "trust": null,
+                  "errors": null,
+                  "package": null,
+                  "absPath": "http://127.0.0.1:8080/dist/bundle.js",
+                  "inApp": false,
+                  "instructionAddr": null,
+                  "filename": "/dist/bundle.js",
+                  "platform": null,
+                  "context": [],
+                  "symbolAddr": null
+                },
+                {
+                  "function": null,
+                  "colNo": 73977,
+                  "vars": null,
+                  "symbol": null,
+                  "module": "dist/bundle",
+                  "lineNo": 2,
+                  "trust": null,
+                  "errors": null,
+                  "package": null,
+                  "absPath": "http://127.0.0.1:8080/dist/bundle.js",
+                  "inApp": false,
+                  "instructionAddr": null,
+                  "filename": "/dist/bundle.js",
+                  "platform": null,
+                  "context": [],
+                  "symbolAddr": null
+                }
+              ],
+              "framesOmitted": null,
+              "registers": null,
+              "hasSystemFrames": false
+            },
+            "module": null,
+            "rawStacktrace": null,
+            "mechanism": {
+              "type": "onerror",
+              "handled": false
+            },
+            "threadId": null,
+            "value": "this is an error",
+            "type": "Error"
+          }
+        ],
+        "excOmitted": null,
+        "hasSystemFrames": false
+      }
+    },
+    {
+      "type": "request",
+      "data": {
+        "fragment": "",
+        "cookies": [],
+        "inferredContentType": null,
+        "env": null,
+        "headers": [
+          [
+            "User-Agent",
+            "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0"
+          ]
+        ],
+        "url": "http://127.0.0.1:8080/",
+        "query": [],
+        "data": null,
+        "method": null
+      }
+    }
+  ],
+  "packages": {},
+  "sdk": {
+    "version": "6.19.2",
+    "name": "sentry.javascript.browser",
+    "upstream": {
+      "url": null,
+      "isNewer": false,
+      "name": "sentry.javascript.browser"
+    }
+  },
+  "_meta": {
+    "user": null,
+    "context": null,
+    "entries": {},
+    "contexts": null,
+    "message": null,
+    "packages": null,
+    "tags": {},
+    "sdk": null
+  },
+  "contexts": {
+    "os": {
+      "type": "os",
+      "name": "Ubuntu"
+    },
+    "browser": {
+      "version": "98.0",
+      "type": "browser",
+      "name": "Firefox"
+    }
+  },
+  "fingerprints": ["e72903c169d4dceeac7fc31c58213360"],
+  "context": {
+    "normalizeDepth": 3
+  },
+  "release": null,
+  "groupID": "313"
+}

+ 116 - 0
events/test_data/oss_sentry_json/small_js_error.json

@@ -0,0 +1,116 @@
+{
+  "event_id": "00952c9936084f759aecdb0f195dd82f",
+  "project": 11,
+  "release": null,
+  "dist": null,
+  "platform": "javascript",
+  "message": "",
+  "datetime": "2022-04-02T16:38:33.218000Z",
+  "time_spent": null,
+  "tags": [
+    ["browser", "Firefox 98.0"],
+    ["browser.name", "Firefox"],
+    ["environment", "production"],
+    ["handled", "no"],
+    ["level", "error"],
+    ["mechanism", "onerror"],
+    ["os.name", "Ubuntu"],
+    ["user", "ip:71.249.111.206"],
+    ["skippedNormalization", "True"],
+    ["url", "http://127.0.0.1:8080/"]
+  ],
+  "contexts": {
+    "os": { "version": null, "name": "Ubuntu" },
+    "browser": { "version": "98.0", "name": "Firefox" }
+  },
+  "culprit": "?(/dist/bundle.js)",
+  "environment": "production",
+  "errors": [
+    {
+      "url": "http://127.0.0.1:8080/dist/bundle.js",
+      "type": "fetch_generic_error",
+      "value": "<class 'requests.exceptions.ConnectionError'>"
+    }
+  ],
+  "exception": {
+    "values": [
+      {
+        "stacktrace": {
+          "frames": [
+            {
+              "abs_path": "http://127.0.0.1:8080/dist/bundle.js",
+              "module": "dist/bundle",
+              "in_app": false,
+              "lineno": 2,
+              "colno": 74008,
+              "filename": "/dist/bundle.js"
+            },
+            {
+              "abs_path": "http://127.0.0.1:8080/dist/bundle.js",
+              "module": "dist/bundle",
+              "in_app": false,
+              "lineno": 2,
+              "colno": 74004,
+              "filename": "/dist/bundle.js"
+            },
+            {
+              "abs_path": "http://127.0.0.1:8080/dist/bundle.js",
+              "module": "dist/bundle",
+              "in_app": false,
+              "lineno": 2,
+              "colno": 73977,
+              "filename": "/dist/bundle.js"
+            }
+          ]
+        },
+        "type": "Error",
+        "value": "this is an error",
+        "mechanism": { "type": "onerror", "handled": false }
+      }
+    ]
+  },
+  "extra": { "normalizeDepth": 3 },
+  "fingerprint": ["{{ default }}"],
+  "grouping_config": { "id": "legacy:2019-03-12" },
+  "hashes": ["e72903c169d4dceeac7fc31c58213360"],
+  "key_id": "11",
+  "level": "error",
+  "location": "/dist/bundle.js",
+  "logger": "",
+  "metadata": {
+    "type": "Error",
+    "value": "this is an error",
+    "filename": "/dist/bundle.js"
+  },
+  "received": 1648917565.093,
+  "request": {
+    "url": "http://127.0.0.1:8080/",
+    "headers": [
+      [
+        "User-Agent",
+        "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:98.0) Gecko/20100101 Firefox/98.0"
+      ]
+    ]
+  },
+  "sdk": {
+    "version": "6.19.2",
+    "name": "sentry.javascript.browser",
+    "packages": [{ "version": "6.19.2", "name": "npm:@sentry/browser" }],
+    "integrations": [
+      "InboundFilters",
+      "FunctionToString",
+      "TryCatch",
+      "Breadcrumbs",
+      "GlobalHandlers",
+      "LinkedErrors",
+      "Dedupe",
+      "UserAgent"
+    ]
+  },
+  "timestamp": 1648917513.218,
+  "title": "Error: this is an error",
+  "type": "error",
+  "use_rust_normalize": true,
+  "user": { "ip_address": "71.249.111.206" },
+  "version": "7"
+}

+ 11 - 0
issues/tests/test_sentry_api_compat.py

@@ -474,3 +474,14 @@ class SentryAPICompatTestCase(GlitchTipTestCase):
             ["type", "values", "exception"],
         )
 
+    def test_small_js_error(self):
+        """ A small example to test stacktraces """
+        sdk_error, sentry_json, sentry_data = self.get_json_test_data("small_js_error")
+        res = self.client.post(self.event_store_url, sdk_error, format="json")
+        event = Event.objects.get(pk=res.data["id"])
+        event_json = event.event_json()
+        self.assertCompareData(
+            event_json["exception"]["values"][0],
+            sentry_json["exception"]["values"][0],
+        )
+