Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 10 additions & 15 deletions src/sentry/deletions/tasks/nodestore.py
Original file line number Diff line number Diff line change
Expand Up @@ -215,38 +215,33 @@ def delete_events_from_eap(
group_ids: Sequence[int],
dataset: Dataset,
) -> None:
eap_deletion_allowlist = options.get("eventstream.eap.deletion_enabled.organization_allowlist")
if organization_id not in eap_deletion_allowlist:
if not options.get("eventstream.eap.deletion-enabled"):
return

try:
response = delete_groups_from_eap_rpc(
delete_groups_from_eap_rpc(
organization_id=organization_id,
project_id=project_id,
group_ids=group_ids,
referrer="deletions.group.eap",
)
logger.info(
"eap.delete_groups.completed",
extra={
"organization_id": organization_id,
"project_id": project_id,
"group_count": len(group_ids),
"matching_items_count": response.matching_items_count,
},
metrics.incr(
"deletions.group.eap.success",
tags={"dataset": dataset.value},
sample_rate=1.0,
)
except Exception as e:
except Exception:
logger.exception(
"eap.delete_groups.failed",
"Failed to delete groups from EAP",
extra={
"organization_id": organization_id,
"project_id": project_id,
"group_ids": group_ids[:10],
"error": str(e),
"dataset": dataset.value,
},
)
metrics.incr(
"deletions.eap.failed",
"deletions.group.eap.failure",
tags={"dataset": dataset.value},
sample_rate=1.0,
)
Expand Down
10 changes: 5 additions & 5 deletions src/sentry/options/defaults.py
Original file line number Diff line number Diff line change
Expand Up @@ -3598,12 +3598,12 @@
flags=FLAG_ALLOW_EMPTY | FLAG_AUTOMATOR_MODIFIABLE,
)

# The allowlist of organization IDs for which deletion from EAP is enabled.
# Controls whether deletion from EAP is enabled.
register(
"eventstream.eap.deletion_enabled.organization_allowlist",
type=Sequence,
default=[],
flags=FLAG_ALLOW_EMPTY | FLAG_AUTOMATOR_MODIFIABLE,
"eventstream.eap.deletion-enabled",
type=Bool,
default=True,
flags=FLAG_AUTOMATOR_MODIFIABLE,
)

# Send logs for sentry app webhooks sent. Should only be enabled for debugging a specific app or installation.
Expand Down
44 changes: 20 additions & 24 deletions tests/sentry/eventstream/test_eap.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,9 @@ def test_deletion_with_error_dataset(self, mock_rpc):
matching_items_count=150,
)

with self.options(
{"eventstream.eap.deletion_enabled.organization_allowlist": [self.organization_id]}
):
delete_events_from_eap(
self.organization_id, self.project_id, self.group_ids, Dataset.Events
)

delete_events_from_eap(
self.organization_id, self.project_id, self.group_ids, Dataset.Events
)
assert mock_rpc.call_count == 1

request = mock_rpc.call_args[0][0]
Expand All @@ -50,29 +46,17 @@ def test_multiple_group_ids(self, mock_rpc):

many_group_ids = [10, 20, 30, 40, 50]

with self.options(
{"eventstream.eap.deletion_enabled.organization_allowlist": [self.organization_id]}
):
delete_events_from_eap(
self.organization_id, self.project_id, many_group_ids, Dataset.Events
)
delete_events_from_eap(
self.organization_id, self.project_id, many_group_ids, Dataset.Events
)

request = mock_rpc.call_args[0][0]
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")
def test_organization_not_in_allowlist_skips_deletion(self, mock_rpc):
with self.options({"eventstream.eap.deletion_enabled.organization_allowlist": [456, 789]}):
delete_events_from_eap(
self.organization_id, self.project_id, self.group_ids, Dataset.Events
)

mock_rpc.assert_not_called()

@patch("sentry.eventstream.eap.snuba_rpc.rpc")
def test_empty_allowlist_skips_deletion(self, mock_rpc):
with self.options({"eventstream.eap.deletion_enabled.organization_allowlist": []}):
def test_eap_deletion_disabled_skips_deletion(self, mock_rpc):
with self.options({"eventstream.eap.deletion-enabled": False}):
delete_events_from_eap(
self.organization_id, self.project_id, self.group_ids, Dataset.Events
)
Expand All @@ -86,3 +70,15 @@ def test_empty_group_ids_raises_error(self):
project_id=self.project_id,
group_ids=[],
)

@patch("sentry.eventstream.eap.snuba_rpc.rpc")
def test_exception_does_not_propagate(self, mock_rpc):
mock_rpc.side_effect = Exception("RPC connection failed")

# Should not raise - exception should be caught
try:
delete_events_from_eap(
self.organization_id, self.project_id, self.group_ids, Dataset.Events
)
except Exception:
pytest.fail("Exception should have been caught and not propagated")
Loading