|
@@ -24,7 +24,16 @@ from sentry.apidocs.constants import (
|
|
|
)
|
|
|
from sentry.apidocs.parameters import GLOBAL_PARAMS, MONITOR_PARAMS
|
|
|
from sentry.apidocs.utils import inline_sentry_response_serializer
|
|
|
-from sentry.models import CheckInStatus, Monitor, MonitorCheckIn, MonitorStatus, Project, ProjectKey
|
|
|
+from sentry.models import (
|
|
|
+ CheckInStatus,
|
|
|
+ Environment,
|
|
|
+ Monitor,
|
|
|
+ MonitorCheckIn,
|
|
|
+ MonitorEnvironment,
|
|
|
+ MonitorStatus,
|
|
|
+ Project,
|
|
|
+ ProjectKey,
|
|
|
+)
|
|
|
from sentry.signals import first_cron_checkin_received, first_cron_monitor_created
|
|
|
from sentry.utils import metrics
|
|
|
|
|
@@ -137,9 +146,26 @@ class MonitorCheckInsEndpoint(MonitorEndpoint):
|
|
|
result = serializer.validated_data
|
|
|
|
|
|
with transaction.atomic():
|
|
|
+ environment_name = result.get("environment")
|
|
|
+ if not environment_name:
|
|
|
+ environment_name = "production"
|
|
|
+
|
|
|
+ environment = Environment.get_or_create(project=project, name=environment_name)
|
|
|
+
|
|
|
+ monitor_environment, created = MonitorEnvironment.objects.get_or_create(
|
|
|
+ monitor=monitor, environment=environment
|
|
|
+ )
|
|
|
+
|
|
|
+ if created:
|
|
|
+ monitor_environment.status = monitor.status
|
|
|
+ monitor_environment.next_checkin = monitor.next_checkin
|
|
|
+ monitor_environment.last_checkin = monitor.last_checkin
|
|
|
+ monitor_environment.save()
|
|
|
+
|
|
|
checkin = MonitorCheckIn.objects.create(
|
|
|
project_id=project.id,
|
|
|
monitor_id=monitor.id,
|
|
|
+ monitor_environment=monitor_environment,
|
|
|
duration=result.get("duration"),
|
|
|
status=getattr(CheckInStatus, result["status"].upper()),
|
|
|
)
|
|
@@ -155,7 +181,9 @@ class MonitorCheckInsEndpoint(MonitorEndpoint):
|
|
|
)
|
|
|
|
|
|
if checkin.status == CheckInStatus.ERROR and monitor.status != MonitorStatus.DISABLED:
|
|
|
- if not monitor.mark_failed(last_checkin=checkin.date_added):
|
|
|
+ monitor_failed = monitor.mark_failed(last_checkin=checkin.date_added)
|
|
|
+ monitor_environment.mark_failed(last_checkin=checkin.date_added)
|
|
|
+ if not monitor_failed:
|
|
|
if isinstance(request.auth, ProjectKey):
|
|
|
return self.respond(status=200)
|
|
|
return self.respond(serialize(checkin, request.user), status=200)
|
|
@@ -169,6 +197,9 @@ class MonitorCheckInsEndpoint(MonitorEndpoint):
|
|
|
Monitor.objects.filter(id=monitor.id).exclude(
|
|
|
last_checkin__gt=checkin.date_added
|
|
|
).update(**monitor_params)
|
|
|
+ MonitorEnvironment.objects.filter(id=monitor_environment.id).exclude(
|
|
|
+ last_checkin__gt=checkin.date_added
|
|
|
+ ).update(**monitor_params)
|
|
|
|
|
|
if isinstance(request.auth, ProjectKey):
|
|
|
return self.respond({"id": str(checkin.guid)}, status=201)
|