|
@@ -1,27 +1,71 @@
|
|
|
+from collections import defaultdict
|
|
|
from datetime import datetime
|
|
|
from typing import Any
|
|
|
|
|
|
+from django.db.models import prefetch_related_objects
|
|
|
from typing_extensions import TypedDict
|
|
|
|
|
|
from sentry.api.serializers import ProjectSerializerResponse, Serializer, register, serialize
|
|
|
from sentry.models import Project
|
|
|
|
|
|
-from .models import Monitor, MonitorCheckIn
|
|
|
+from .models import Monitor, MonitorCheckIn, MonitorEnvironment
|
|
|
+
|
|
|
+
|
|
|
+@register(MonitorEnvironment)
|
|
|
+class MonitorEnvironmentSerializer(Serializer):
|
|
|
+ def serialize(self, obj, attrs, user):
|
|
|
+ return {
|
|
|
+ "name": obj.environment.name,
|
|
|
+ "status": obj.get_status_display(),
|
|
|
+ "lastCheckIn": obj.last_checkin,
|
|
|
+ "nextCheckIn": obj.next_checkin,
|
|
|
+ "dateCreated": obj.monitor.date_added,
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+class MonitorEnvironmentSerializerResponse(TypedDict):
|
|
|
+ name: str
|
|
|
+ status: str
|
|
|
+ dateCreated: datetime
|
|
|
+ lastCheckIn: datetime
|
|
|
+ nextCheckIn: datetime
|
|
|
|
|
|
|
|
|
@register(Monitor)
|
|
|
class MonitorSerializer(Serializer):
|
|
|
- def get_attrs(self, item_list, user):
|
|
|
+ def __init__(self, environments=None):
|
|
|
+ self.environments = environments
|
|
|
+
|
|
|
+ def get_attrs(self, item_list, user, **kwargs):
|
|
|
# TODO(dcramer): assert on relations
|
|
|
projects = {
|
|
|
- d["id"]: d
|
|
|
- for d in serialize(
|
|
|
+ p["id"]: p
|
|
|
+ for p in serialize(
|
|
|
list(Project.objects.filter(id__in=[i.project_id for i in item_list])), user
|
|
|
)
|
|
|
}
|
|
|
|
|
|
+ environment_data = {}
|
|
|
+ if self.environments:
|
|
|
+ monitor_environments = defaultdict(list)
|
|
|
+ for monitor_environment in MonitorEnvironment.objects.filter(
|
|
|
+ monitor__in=item_list, environment__in=self.environments
|
|
|
+ ).select_related("environment"):
|
|
|
+ # individually serialize as related objects are prefetched
|
|
|
+ monitor_environments[monitor_environment.monitor_id].append(
|
|
|
+ serialize(
|
|
|
+ monitor_environment,
|
|
|
+ user,
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ environment_data = {str(item.id): monitor_environments[item.id] for item in item_list}
|
|
|
+
|
|
|
return {
|
|
|
- item: {"project": projects[str(item.project_id)] if item.project_id else None}
|
|
|
+ item: {
|
|
|
+ "project": projects[str(item.project_id)] if item.project_id else None,
|
|
|
+ "environments": environment_data[str(item.id)] if self.environments else None,
|
|
|
+ }
|
|
|
for item in item_list
|
|
|
}
|
|
|
|
|
@@ -40,6 +84,7 @@ class MonitorSerializer(Serializer):
|
|
|
"nextCheckIn": obj.next_checkin,
|
|
|
"dateCreated": obj.date_added,
|
|
|
"project": attrs["project"],
|
|
|
+ "environments": attrs["environments"],
|
|
|
}
|
|
|
|
|
|
|
|
@@ -54,13 +99,22 @@ class MonitorSerializerResponse(TypedDict):
|
|
|
lastCheckIn: datetime
|
|
|
nextCheckIn: datetime
|
|
|
project: ProjectSerializerResponse
|
|
|
+ environments: MonitorEnvironmentSerializerResponse
|
|
|
|
|
|
|
|
|
@register(MonitorCheckIn)
|
|
|
class MonitorCheckInSerializer(Serializer):
|
|
|
+ def get_attrs(self, item_list, user, **kwargs):
|
|
|
+ # prefetch monitor environment data
|
|
|
+ prefetch_related_objects(item_list, "monitor_environment__environment")
|
|
|
+ return {}
|
|
|
+
|
|
|
def serialize(self, obj, attrs, user):
|
|
|
return {
|
|
|
"id": str(obj.guid),
|
|
|
+ "environment": obj.monitor_environment.environment.name
|
|
|
+ if obj.monitor_environment
|
|
|
+ else None,
|
|
|
"status": obj.get_status_display(),
|
|
|
"duration": obj.duration,
|
|
|
"dateCreated": obj.date_added,
|
|
@@ -70,6 +124,7 @@ class MonitorCheckInSerializer(Serializer):
|
|
|
|
|
|
class MonitorCheckInSerializerResponse(TypedDict):
|
|
|
id: str
|
|
|
+ environment: str
|
|
|
status: str
|
|
|
duration: int
|
|
|
dateCreated: datetime
|