From 28a236464cceb31d3d4cc98100d83a4fe3bfcd7e Mon Sep 17 00:00:00 2001 From: Abdullah Khan Date: Tue, 7 Apr 2026 23:26:33 +0600 Subject: [PATCH 1/3] feat(source-map-issues): Adding group id and title as attr to processing error trace item --- src/sentry/processing_errors/eap/producer.py | 8 ++++++++ src/sentry/search/eap/processing_errors/attributes.py | 10 ++++++++++ src/sentry/tasks/post_process.py | 4 +++- tests/sentry/processing_errors/eap/test_producer.py | 7 ++++++- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/sentry/processing_errors/eap/producer.py b/src/sentry/processing_errors/eap/producer.py index 0d3793115aa595..4e3812d402b7dc 100644 --- a/src/sentry/processing_errors/eap/producer.py +++ b/src/sentry/processing_errors/eap/producer.py @@ -44,6 +44,7 @@ def produce_processing_errors_to_eap( project: Project, event_data: Mapping[str, Any], processing_errors: Sequence[Mapping[str, Any]], + group_id: int | None = None, ) -> None: """ Produces processing errors as TraceItems to the EAP topic. @@ -65,6 +66,7 @@ def produce_processing_errors_to_eap( release = event_data.get("release") environment = event_data.get("environment") platform = event_data.get("platform") + title = event_data.get("title") sdk = event_data.get("sdk") or {} sdk_name = sdk.get("name") sdk_version = sdk.get("version") @@ -99,6 +101,12 @@ def produce_processing_errors_to_eap( if sdk_version is not None: attributes["sdk_version"] = sdk_version + if title is not None: + attributes["title"] = title + + if group_id is not None: + attributes["group_id"] = str(group_id) + item_id = hex_to_item_id( uuid.uuid5(PROCESSING_ERROR_NAMESPACE, f"{event_data['event_id']}:{index}").hex ) diff --git a/src/sentry/search/eap/processing_errors/attributes.py b/src/sentry/search/eap/processing_errors/attributes.py index 511f9e0de49329..02b491dbffd7fb 100644 --- a/src/sentry/search/eap/processing_errors/attributes.py +++ b/src/sentry/search/eap/processing_errors/attributes.py @@ -55,5 +55,15 @@ internal_name="sdk_version", search_type="string", ), + ResolvedAttribute( + public_alias="title", + internal_name="title", + search_type="string", + ), + ResolvedAttribute( + public_alias="group_id", + internal_name="group_id", + search_type="string", + ), ] } diff --git a/src/sentry/tasks/post_process.py b/src/sentry/tasks/post_process.py index f4d8390e65c6be..6479e1274ab280 100644 --- a/src/sentry/tasks/post_process.py +++ b/src/sentry/tasks/post_process.py @@ -1277,7 +1277,9 @@ def process_processing_errors_eap(job: PostProcessJob) -> None: from sentry.processing_errors.eap.producer import produce_processing_errors_to_eap - produce_processing_errors_to_eap(event.project, event.data, processing_errors) + produce_processing_errors_to_eap( + event.project, event.data, processing_errors, group_id=event.group_id + ) def process_processing_issue_detection(job: PostProcessJob) -> None: diff --git a/tests/sentry/processing_errors/eap/test_producer.py b/tests/sentry/processing_errors/eap/test_producer.py index 2f552628b14405..36a26a44453152 100644 --- a/tests/sentry/processing_errors/eap/test_producer.py +++ b/tests/sentry/processing_errors/eap/test_producer.py @@ -103,11 +103,12 @@ def test_optional_fields_included_when_present(self, mock_get_topic, mock_produc release="1.0.0", environment="production", platform="javascript", + title="ReferenceError: undefined variable", sdk={"name": "sentry.javascript.browser", "version": "7.0.0"}, ) errors = [{"type": "js_no_source", "symbolicator_type": "missing_sourcemap"}] - produce_processing_errors_to_eap(self.project, event_data, errors) + produce_processing_errors_to_eap(self.project, event_data, errors, group_id=12345) payload = mock_producer.produce.call_args[0][1] trace_item = codec.decode(payload.value) @@ -117,6 +118,8 @@ def test_optional_fields_included_when_present(self, mock_get_topic, mock_produc assert trace_item.attributes["platform"].string_value == "javascript" assert trace_item.attributes["sdk_name"].string_value == "sentry.javascript.browser" assert trace_item.attributes["sdk_version"].string_value == "7.0.0" + assert trace_item.attributes["title"].string_value == "ReferenceError: undefined variable" + assert trace_item.attributes["group_id"].string_value == "12345" @patch("sentry.processing_errors.eap.producer._eap_producer") @patch("sentry.processing_errors.eap.producer.get_topic_definition") @@ -138,6 +141,8 @@ def test_optional_fields_omitted_when_absent(self, mock_get_topic, mock_producer assert "sdk_name" not in trace_item.attributes assert "sdk_version" not in trace_item.attributes assert "symbolicator_type" not in trace_item.attributes + assert "title" not in trace_item.attributes + assert "group_id" not in trace_item.attributes @patch("sentry.processing_errors.eap.producer.logger") @patch("sentry.processing_errors.eap.producer._eap_producer") From b3d8508f1bbbf18eb6e9fd0c7926c075ea9a9367 Mon Sep 17 00:00:00 2001 From: Abdullah Khan Date: Wed, 8 Apr 2026 00:17:31 +0600 Subject: [PATCH 2/3] feat(source-map-config-issues): addressing pr comments --- src/sentry/processing_errors/eap/producer.py | 2 +- src/sentry/tasks/post_process.py | 2 +- tests/sentry/processing_errors/eap/test_producer.py | 9 +++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/sentry/processing_errors/eap/producer.py b/src/sentry/processing_errors/eap/producer.py index 4e3812d402b7dc..e9acfa7bb89f37 100644 --- a/src/sentry/processing_errors/eap/producer.py +++ b/src/sentry/processing_errors/eap/producer.py @@ -45,6 +45,7 @@ def produce_processing_errors_to_eap( event_data: Mapping[str, Any], processing_errors: Sequence[Mapping[str, Any]], group_id: int | None = None, + title: str | None = None, ) -> None: """ Produces processing errors as TraceItems to the EAP topic. @@ -66,7 +67,6 @@ def produce_processing_errors_to_eap( release = event_data.get("release") environment = event_data.get("environment") platform = event_data.get("platform") - title = event_data.get("title") sdk = event_data.get("sdk") or {} sdk_name = sdk.get("name") sdk_version = sdk.get("version") diff --git a/src/sentry/tasks/post_process.py b/src/sentry/tasks/post_process.py index 6479e1274ab280..dc10d8cb90dd3c 100644 --- a/src/sentry/tasks/post_process.py +++ b/src/sentry/tasks/post_process.py @@ -1278,7 +1278,7 @@ def process_processing_errors_eap(job: PostProcessJob) -> None: from sentry.processing_errors.eap.producer import produce_processing_errors_to_eap produce_processing_errors_to_eap( - event.project, event.data, processing_errors, group_id=event.group_id + event.project, event.data, processing_errors, group_id=event.group_id, title=event.title ) diff --git a/tests/sentry/processing_errors/eap/test_producer.py b/tests/sentry/processing_errors/eap/test_producer.py index 36a26a44453152..18ecb4dbee58d3 100644 --- a/tests/sentry/processing_errors/eap/test_producer.py +++ b/tests/sentry/processing_errors/eap/test_producer.py @@ -103,12 +103,17 @@ def test_optional_fields_included_when_present(self, mock_get_topic, mock_produc release="1.0.0", environment="production", platform="javascript", - title="ReferenceError: undefined variable", sdk={"name": "sentry.javascript.browser", "version": "7.0.0"}, ) errors = [{"type": "js_no_source", "symbolicator_type": "missing_sourcemap"}] - produce_processing_errors_to_eap(self.project, event_data, errors, group_id=12345) + produce_processing_errors_to_eap( + self.project, + event_data, + errors, + group_id=12345, + title="ReferenceError: undefined variable", + ) payload = mock_producer.produce.call_args[0][1] trace_item = codec.decode(payload.value) From 04ad7f2ca4bf663aa45d504ad7ed1a40e91ed1c5 Mon Sep 17 00:00:00 2001 From: Abdullah Khan Date: Wed, 8 Apr 2026 00:49:23 +0600 Subject: [PATCH 3/3] feat(source-map-issues): Addressing pr suggestions --- src/sentry/processing_errors/eap/producer.py | 2 +- src/sentry/search/eap/processing_errors/attributes.py | 2 +- tests/sentry/processing_errors/eap/test_producer.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sentry/processing_errors/eap/producer.py b/src/sentry/processing_errors/eap/producer.py index e9acfa7bb89f37..21709d678708dc 100644 --- a/src/sentry/processing_errors/eap/producer.py +++ b/src/sentry/processing_errors/eap/producer.py @@ -105,7 +105,7 @@ def produce_processing_errors_to_eap( attributes["title"] = title if group_id is not None: - attributes["group_id"] = str(group_id) + attributes["group_id"] = group_id item_id = hex_to_item_id( uuid.uuid5(PROCESSING_ERROR_NAMESPACE, f"{event_data['event_id']}:{index}").hex diff --git a/src/sentry/search/eap/processing_errors/attributes.py b/src/sentry/search/eap/processing_errors/attributes.py index 02b491dbffd7fb..8cb5b1d84ada7b 100644 --- a/src/sentry/search/eap/processing_errors/attributes.py +++ b/src/sentry/search/eap/processing_errors/attributes.py @@ -63,7 +63,7 @@ ResolvedAttribute( public_alias="group_id", internal_name="group_id", - search_type="string", + search_type="integer", ), ] } diff --git a/tests/sentry/processing_errors/eap/test_producer.py b/tests/sentry/processing_errors/eap/test_producer.py index 18ecb4dbee58d3..e47be3f341f44c 100644 --- a/tests/sentry/processing_errors/eap/test_producer.py +++ b/tests/sentry/processing_errors/eap/test_producer.py @@ -124,7 +124,7 @@ def test_optional_fields_included_when_present(self, mock_get_topic, mock_produc assert trace_item.attributes["sdk_name"].string_value == "sentry.javascript.browser" assert trace_item.attributes["sdk_version"].string_value == "7.0.0" assert trace_item.attributes["title"].string_value == "ReferenceError: undefined variable" - assert trace_item.attributes["group_id"].string_value == "12345" + assert trace_item.attributes["group_id"].int_value == 12345 @patch("sentry.processing_errors.eap.producer._eap_producer") @patch("sentry.processing_errors.eap.producer.get_topic_definition")