Skip to content
Closed
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
21 changes: 21 additions & 0 deletions src/sentry/event_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -1725,6 +1725,27 @@ def _handle_regression(group: Group, event: BaseEvent, release: Release | None)
# XXX: handle missing data, as its not overly important
pass
else:
try:
if (
resolution
# The group resolution is "in next release"
and resolution.current_release_version
and resolved_in_activity
# Empty string is a special case for "Resolved in upcoming release"
and resolved_in_activity.data["version"] != ""
):
logger.warning(
"Mismatch between group resolution and resolved in activity",
extra={
"group_id": group.id,
"activity_id": resolved_in_activity.id,
"activity_version": resolved_in_activity.data["version"],
"release_version": release.version,
},
)
except KeyError:
pass

try:
# We should only update last activity version prior to the regression in the
# case where we have "Resolved in upcoming release" i.e. version == ""
Expand Down
62 changes: 62 additions & 0 deletions tests/sentry/event_manager/test_event_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,68 @@ def test_resolved_in_release_regression_activity_follows_semver(
assert regressed_activity.data["follows_semver"] is True
assert regressed_activity.data["resolved_in_version"] == "foo@1.0.0"

@mock.patch("sentry.event_manager.plugin_is_regression")
@mock.patch("sentry.event_manager.logger")
def test_group_resolution_should_log_on_mismatch_between_group_resolution_and_resolved_in_activity(
self, mock_logger: mock.MagicMock, plugin_is_regression: mock.MagicMock
) -> None:
"""
Detect when the group resolution version does not match the resolved in activity
this means that we're making activity logs that don't make sense
"""
plugin_is_regression.return_value = True

# Create a release and a group associated with it
old_release = self.create_release(
version="a", date_added=timezone.now() - timedelta(minutes=30)
)
manager = EventManager(
make_event(
event_id="a" * 32,
checksum="a" * 32,
timestamp=time() - 50000, # need to work around active_at
release=old_release.version,
)
)
event = manager.save(self.project.id)
assert event.group is not None
group = event.group
group.update(status=GroupStatus.RESOLVED, substatus=None)

# Create a group resolution that is "in next release"
resolution = GroupResolution.objects.create(
release=old_release, current_release_version=old_release.version, group=group
)

# Resolve the group in old_release
activity = Activity.objects.create(
group=group,
project=group.project,
type=ActivityType.SET_RESOLVED_IN_RELEASE.value,
ident=resolution.id,
data={"version": old_release.version},
)

# Create a regression
manager = EventManager(
make_event(event_id="c" * 32, checksum="a" * 32, timestamp=time(), release="b")
)
event = manager.save(self.project.id)
assert event.group_id == group.id

activity = Activity.objects.get(id=activity.id)
assert activity.data["version"] == old_release.version

mock_logger.warning.assert_called_once_with(
"Mismatch between group resolution and resolved in activity",
extra={
"group_id": group.id,
"activity_id": activity.id,
"activity_version": activity.data["version"],
"release_version": "b",
},
)

def test_has_pending_commit_resolution(self) -> None:
project_id = self.project.id
event = self.make_release_event("1.0", project_id)
Expand Down
Loading