Skip to content

Commit 3eac465

Browse files
authored
fix(aci): Add an initial UptimeSubscription serializer (#92150)
Add UptimeSubscriptionSerializer to allow Detector endpoints to return successfully. Detector data source subscription types need to be serializable for the detectors APIs. Add a test to verify that we can return a serialized uptime detector; the specifics of the fields serialized are more a question for uptime folks and not yet relevant, so the serialization result contents are left untested.
1 parent 59943b2 commit 3eac465

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

src/sentry/uptime/endpoints/serializers.py

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from collections.abc import MutableMapping, Sequence
2-
from typing import Any, Literal, TypedDict, cast
2+
from typing import Any, Literal, TypedDict, cast, override
33

44
from django.db.models import prefetch_related_objects
55
from sentry_kafka_schemas.schema_types.snuba_uptime_results_v1 import (
@@ -10,7 +10,7 @@
1010
from sentry.api.serializers import Serializer, register, serialize
1111
from sentry.api.serializers.models.actor import ActorSerializer, ActorSerializerResponse
1212
from sentry.types.actor import Actor
13-
from sentry.uptime.models import ProjectUptimeSubscription
13+
from sentry.uptime.models import ProjectUptimeSubscription, UptimeSubscription
1414
from sentry.uptime.subscriptions.regions import get_region_config
1515
from sentry.uptime.types import EapCheckEntry, IncidentStatus
1616

@@ -134,3 +134,33 @@ def serialize(
134134
"region": obj.region,
135135
"regionName": region_name,
136136
}
137+
138+
139+
class UptimeSubscriptionSerializerResponse(TypedDict):
140+
timeoutMs: int
141+
intervalSeconds: int
142+
method: str
143+
url: str
144+
urlDomain: str
145+
urlDomainSuffix: str
146+
traceSampling: bool
147+
hostProviderId: str
148+
hostProviderName: str
149+
150+
151+
@register(UptimeSubscription)
152+
class UptimeSubscriptionSerializer(Serializer):
153+
154+
@override
155+
def serialize(self, obj: UptimeSubscription, attrs, user, **kwargs) -> dict[str, Any]:
156+
return {
157+
"timeoutMs": obj.timeout_ms,
158+
"intervalSeconds": obj.interval_seconds,
159+
"method": obj.method,
160+
"url": obj.url,
161+
"urlDomain": obj.url_domain,
162+
"urlDomainSuffix": obj.url_domain_suffix,
163+
"traceSampling": obj.trace_sampling,
164+
"hostProviderId": obj.host_provider_id,
165+
"hostProviderName": obj.host_provider_name,
166+
}

tests/sentry/workflow_engine/endpoints/test_organization_detector_index.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
)
1515
from sentry.testutils.cases import APITestCase
1616
from sentry.testutils.silo import region_silo_test
17+
from sentry.uptime.grouptype import UptimeDomainCheckFailure
18+
from sentry.uptime.types import DATA_SOURCE_UPTIME_SUBSCRIPTION
1719
from sentry.workflow_engine.models import DataCondition, DataConditionGroup, DataSource, Detector
1820
from sentry.workflow_engine.models.data_condition import Condition
1921
from sentry.workflow_engine.registry import data_source_type_registry
@@ -49,6 +51,31 @@ def test_simple(self):
4951
)
5052
assert response.data == serialize([detector, detector_2])
5153

54+
def test_uptime_detector(self):
55+
subscription = self.create_uptime_subscription()
56+
data_source = self.create_data_source(
57+
organization_id=self.organization.id,
58+
source_id=subscription.id,
59+
type=DATA_SOURCE_UPTIME_SUBSCRIPTION,
60+
)
61+
detector = self.create_detector(
62+
project_id=self.project.id,
63+
name="Test Detector",
64+
type=UptimeDomainCheckFailure.slug,
65+
config={
66+
"mode": 1,
67+
"environment": "production",
68+
},
69+
)
70+
self.create_data_source_detector(
71+
data_source=data_source,
72+
detector=detector,
73+
)
74+
response = self.get_success_response(
75+
self.organization.slug, qs_params={"project": self.project.id}
76+
)
77+
assert response.data[0]["dataSources"][0]["queryObj"] == serialize(subscription)
78+
5279
def test_empty_result(self):
5380
response = self.get_success_response(
5481
self.organization.slug, qs_params={"project": self.project.id}

0 commit comments

Comments
 (0)