diff --git a/src/sentry/processing_errors/eap/producer.py b/src/sentry/processing_errors/eap/producer.py index 0d3793115aa595..21709d678708dc 100644 --- a/src/sentry/processing_errors/eap/producer.py +++ b/src/sentry/processing_errors/eap/producer.py @@ -44,6 +44,8 @@ def produce_processing_errors_to_eap( project: Project, 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. @@ -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"] = 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..8cb5b1d84ada7b 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="integer", + ), ] } diff --git a/src/sentry/tasks/post_process.py b/src/sentry/tasks/post_process.py index f4d8390e65c6be..dc10d8cb90dd3c 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, title=event.title + ) 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..e47be3f341f44c 100644 --- a/tests/sentry/processing_errors/eap/test_producer.py +++ b/tests/sentry/processing_errors/eap/test_producer.py @@ -107,7 +107,13 @@ def test_optional_fields_included_when_present(self, mock_get_topic, mock_produc ) 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, + title="ReferenceError: undefined variable", + ) payload = mock_producer.produce.call_args[0][1] trace_item = codec.decode(payload.value) @@ -117,6 +123,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"].int_value == 12345 @patch("sentry.processing_errors.eap.producer._eap_producer") @patch("sentry.processing_errors.eap.producer.get_topic_definition") @@ -138,6 +146,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")