diff --git a/src/sentry/eventstream/eap.py b/src/sentry/eventstream/eap.py index 6fc0b6789c6c90..3a01344cc2ed68 100644 --- a/src/sentry/eventstream/eap.py +++ b/src/sentry/eventstream/eap.py @@ -56,7 +56,7 @@ def delete_groups_from_eap_rpc( ), filters=[filter_with_type], ) - response = snuba_rpc.rpc(request, DeleteTraceItemsResponse) + response = snuba_rpc.delete_trace_items_rpc(request) return response diff --git a/src/sentry/utils/snuba_rpc.py b/src/sentry/utils/snuba_rpc.py index 26f8c1b3e9ad4c..b27f5479b3fe72 100644 --- a/src/sentry/utils/snuba_rpc.py +++ b/src/sentry/utils/snuba_rpc.py @@ -16,6 +16,10 @@ CreateSubscriptionRequest, CreateSubscriptionResponse, ) +from sentry_protos.snuba.v1.endpoint_delete_trace_items_pb2 import ( + DeleteTraceItemsRequest, + DeleteTraceItemsResponse, +) from sentry_protos.snuba.v1.endpoint_get_trace_pb2 import GetTraceRequest, GetTraceResponse from sentry_protos.snuba.v1.endpoint_get_traces_pb2 import GetTracesRequest, GetTracesResponse from sentry_protos.snuba.v1.endpoint_time_series_pb2 import TimeSeriesRequest, TimeSeriesResponse @@ -196,6 +200,17 @@ def trace_item_details_rpc(req: TraceItemDetailsRequest) -> TraceItemDetailsResp return response +def delete_trace_items_rpc(req: DeleteTraceItemsRequest) -> DeleteTraceItemsResponse: + """ + An RPC which deletes trace items matching the filters specified in the request. + Used for deleting EAP trace items (e.g. occurrences). + """ + resp = _make_rpc_request("EndpointDeleteTraceItems", "v1", req.meta.referrer, req) + response = DeleteTraceItemsResponse() + response.ParseFromString(resp.data) + return response + + def rpc( req: SnubaRPCRequest, resp_type: type[RPCResponseType], diff --git a/tests/sentry/eventstream/test_eap.py b/tests/sentry/eventstream/test_eap.py index 1ea42c09d74466..cb50358adac12e 100644 --- a/tests/sentry/eventstream/test_eap.py +++ b/tests/sentry/eventstream/test_eap.py @@ -16,7 +16,7 @@ def setUp(self): self.project_id = 123 self.group_ids = [1, 2, 3] - @patch("sentry.eventstream.eap.snuba_rpc.rpc") + @patch("sentry.eventstream.eap.snuba_rpc.delete_trace_items_rpc") def test_deletion_with_error_dataset(self, mock_rpc): mock_rpc.return_value = DeleteTraceItemsResponse( meta=ResponseMeta(), @@ -37,7 +37,7 @@ def test_deletion_with_error_dataset(self, mock_rpc): assert len(request.filters) == 1 assert request.filters[0].item_type == TRACE_ITEM_TYPE_OCCURRENCE - @patch("sentry.eventstream.eap.snuba_rpc.rpc") + @patch("sentry.eventstream.eap.snuba_rpc.delete_trace_items_rpc") def test_multiple_group_ids(self, mock_rpc): mock_rpc.return_value = DeleteTraceItemsResponse( meta=ResponseMeta(), @@ -54,7 +54,7 @@ def test_multiple_group_ids(self, mock_rpc): group_filter = request.filters[0].filter.and_filter.filters[1] assert list(group_filter.comparison_filter.value.val_int_array.values) == many_group_ids - @patch("sentry.eventstream.eap.snuba_rpc.rpc") + @patch("sentry.eventstream.eap.snuba_rpc.delete_trace_items_rpc") def test_eap_deletion_disabled_skips_deletion(self, mock_rpc): with self.options({"eventstream.eap.deletion-enabled": False}): delete_events_from_eap( @@ -71,7 +71,7 @@ def test_empty_group_ids_raises_error(self): group_ids=[], ) - @patch("sentry.eventstream.eap.snuba_rpc.rpc") + @patch("sentry.eventstream.eap.snuba_rpc.delete_trace_items_rpc") def test_exception_does_not_propagate(self, mock_rpc): mock_rpc.side_effect = Exception("RPC connection failed")