Skip to content

Commit 863cd2f

Browse files
ref(crons): Remove issue_platform module (#97710)
This has been (mostly) been replaced with detectors
1 parent 30b4630 commit 863cd2f

File tree

6 files changed

+76
-246
lines changed

6 files changed

+76
-246
lines changed

src/sentry/uptime/grouptype.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
from sentry import features, options
1212
from sentry.issues.grouptype import GroupCategory, GroupType
1313
from sentry.issues.issue_occurrence import IssueEvidence, IssueOccurrence
14+
from sentry.issues.producer import PayloadType, produce_occurrence_to_kafka
1415
from sentry.issues.status_change_message import StatusChangeMessage
16+
from sentry.models.group import GroupStatus
1517
from sentry.ratelimits.sliding_windows import Quota
1618
from sentry.types.group import PriorityLevel
1719
from sentry.uptime.models import UptimeStatus, UptimeSubscription, get_project_subscription
@@ -34,6 +36,23 @@
3436
logger = logging.getLogger(__name__)
3537

3638

39+
def resolve_uptime_issue(detector: Detector):
40+
"""
41+
Sends an update to the issue platform to resolve the uptime issue for this
42+
monitor.
43+
"""
44+
status_change = StatusChangeMessage(
45+
fingerprint=build_fingerprint(detector),
46+
project_id=detector.project_id,
47+
new_status=GroupStatus.RESOLVED,
48+
new_substatus=None,
49+
)
50+
produce_occurrence_to_kafka(
51+
payload_type=PayloadType.STATUS_CHANGE,
52+
status_change=status_change,
53+
)
54+
55+
3756
@dataclass(frozen=True)
3857
class UptimePacketValue:
3958
"""

src/sentry/uptime/issue_platform.py

Lines changed: 0 additions & 85 deletions
This file was deleted.

src/sentry/uptime/subscriptions/subscriptions.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
from sentry.quotas.base import SeatAssignmentResult
1212
from sentry.types.actor import Actor
1313
from sentry.uptime.detectors.url_extraction import extract_domain_parts
14-
from sentry.uptime.grouptype import UptimeDomainCheckFailure
15-
from sentry.uptime.issue_platform import resolve_uptime_issue
14+
from sentry.uptime.grouptype import UptimeDomainCheckFailure, resolve_uptime_issue
1615
from sentry.uptime.models import (
1716
ProjectUptimeSubscription,
1817
UptimeStatus,

tests/sentry/uptime/subscriptions/test_subscriptions.py

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from hashlib import md5
21
from unittest import mock
32

43
import pytest
@@ -9,14 +8,12 @@
98
from sentry.conf.types.uptime import UptimeRegionConfig
109
from sentry.constants import DataCategory, ObjectStatus
1110
from sentry.deletions.tasks.scheduled import run_scheduled_deletions
12-
from sentry.models.group import Group, GroupStatus
1311
from sentry.quotas.base import SeatAssignmentResult
1412
from sentry.testutils.cases import UptimeTestCase
1513
from sentry.testutils.helpers import override_options
1614
from sentry.testutils.skips import requires_kafka
1715
from sentry.types.actor import Actor
18-
from sentry.uptime.grouptype import UptimeDomainCheckFailure, build_detector_fingerprint_component
19-
from sentry.uptime.issue_platform import create_issue_platform_occurrence
16+
from sentry.uptime.grouptype import UptimeDomainCheckFailure
2017
from sentry.uptime.models import (
2118
ProjectUptimeSubscription,
2219
UptimeStatus,
@@ -770,7 +767,8 @@ def test(self, mock_disable_seat: mock.MagicMock) -> None:
770767
assert not detector.enabled
771768

772769
@mock.patch("sentry.quotas.backend.disable_seat")
773-
def test_disable_failed(self, mock_disable_seat: mock.MagicMock) -> None:
770+
@mock.patch("sentry.uptime.subscriptions.subscriptions.resolve_uptime_issue")
771+
def test_disable_failed(self, mock_resolve_uptime_issue, mock_disable_seat) -> None:
774772
with (
775773
self.tasks(),
776774
self.feature(UptimeDomainCheckFailure.build_ingest_feature_name()),
@@ -786,21 +784,8 @@ def test_disable_failed(self, mock_disable_seat: mock.MagicMock) -> None:
786784
)
787785
detector = get_detector(proj_sub.uptime_subscription)
788786

789-
create_issue_platform_occurrence(
790-
self.create_uptime_result(
791-
subscription_id=proj_sub.uptime_subscription.subscription_id
792-
),
793-
detector,
794-
)
795-
fingerprint = build_detector_fingerprint_component(detector).encode("utf-8")
796-
hashed_fingerprint = md5(fingerprint).hexdigest()
797-
assert Group.objects.filter(
798-
grouphash__hash=hashed_fingerprint, status=GroupStatus.UNRESOLVED
799-
).exists()
800787
disable_uptime_detector(detector)
801-
assert Group.objects.filter(
802-
grouphash__hash=hashed_fingerprint, status=GroupStatus.RESOLVED
803-
).exists()
788+
mock_resolve_uptime_issue.assert_called_with(detector)
804789

805790
proj_sub.refresh_from_db()
806791
assert proj_sub.status == ObjectStatus.DISABLED

tests/sentry/uptime/test_grouptype.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
from datetime import datetime, timedelta
1+
import uuid
2+
from datetime import datetime, timedelta, timezone
3+
from hashlib import md5
24
from itertools import cycle
35
from unittest import mock
46

@@ -12,6 +14,8 @@
1214
)
1315

1416
from sentry.issues.issue_occurrence import IssueEvidence, IssueOccurrence
17+
from sentry.issues.producer import PayloadType, produce_occurrence_to_kafka
18+
from sentry.models.group import Group, GroupStatus
1519
from sentry.testutils.cases import TestCase, UptimeTestCase
1620
from sentry.testutils.helpers.datetime import freeze_time
1721
from sentry.uptime.grouptype import (
@@ -22,6 +26,7 @@
2226
build_event_data,
2327
build_evidence_display,
2428
build_fingerprint,
29+
resolve_uptime_issue,
2530
)
2631
from sentry.uptime.models import UptimeStatus, UptimeSubscription, get_detector
2732
from sentry.uptime.types import UptimeMonitorMode
@@ -30,6 +35,52 @@
3035
from sentry.workflow_engine.types import DetectorPriorityLevel
3136

3237

38+
class ResolveUptimeIssueTest(UptimeTestCase):
39+
def test(self):
40+
subscription = self.create_uptime_subscription(subscription_id=uuid.uuid4().hex)
41+
self.create_project_uptime_subscription(uptime_subscription=subscription)
42+
detector = get_detector(subscription)
43+
result = self.create_uptime_result(subscription.subscription_id)
44+
45+
fingerprint = build_detector_fingerprint_component(detector)
46+
47+
with self.feature(UptimeDomainCheckFailure.build_ingest_feature_name()):
48+
occurrence = IssueOccurrence(
49+
id=uuid.uuid4().hex,
50+
resource_id=None,
51+
project_id=detector.project_id,
52+
event_id=uuid.uuid4().hex,
53+
fingerprint=[fingerprint],
54+
type=UptimeDomainCheckFailure,
55+
issue_title=f"Downtime detected for {subscription.url}",
56+
subtitle="Your monitored domain is down",
57+
evidence_display=[],
58+
evidence_data={},
59+
culprit="",
60+
detection_time=datetime.now(timezone.utc),
61+
level="error",
62+
assignee=detector.owner,
63+
)
64+
produce_occurrence_to_kafka(
65+
payload_type=PayloadType.OCCURRENCE,
66+
occurrence=occurrence,
67+
event_data={
68+
**build_event_data(result, detector),
69+
"event_id": occurrence.event_id,
70+
"fingerprint": occurrence.fingerprint,
71+
"timestamp": occurrence.detection_time.isoformat(),
72+
},
73+
)
74+
75+
hashed_detector_fingerprint = md5(fingerprint.encode("utf-8")).hexdigest()
76+
group_detector = Group.objects.get(grouphash__hash=hashed_detector_fingerprint)
77+
assert group_detector.status == GroupStatus.UNRESOLVED
78+
79+
resolve_uptime_issue(detector)
80+
group_detector.refresh_from_db()
81+
assert group_detector.status == GroupStatus.RESOLVED
82+
83+
3384
class BuildDetectorFingerprintComponentTest(UptimeTestCase):
3485
def test_build_detector_fingerprint_component(self) -> None:
3586
project_subscription = self.create_project_uptime_subscription()

0 commit comments

Comments
 (0)