summaryrefslogtreecommitdiff
path: root/app/services/projects/alerting/notify_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/projects/alerting/notify_service.rb')
-rw-r--r--app/services/projects/alerting/notify_service.rb33
1 files changed, 30 insertions, 3 deletions
diff --git a/app/services/projects/alerting/notify_service.rb b/app/services/projects/alerting/notify_service.rb
index 76c89e85f17..86c408aeec8 100644
--- a/app/services/projects/alerting/notify_service.rb
+++ b/app/services/projects/alerting/notify_service.rb
@@ -10,7 +10,7 @@ module Projects
return forbidden unless alerts_service_activated?
return unauthorized unless valid_token?(token)
- alert = create_alert
+ alert = process_alert
return bad_request unless alert.persisted?
process_incident_issues(alert) if process_issues?
@@ -26,11 +26,36 @@ module Projects
delegate :alerts_service, :alerts_service_activated?, to: :project
def am_alert_params
- Gitlab::AlertManagement::AlertParams.from_generic_alert(project: project, payload: params.to_h)
+ strong_memoize(:am_alert_params) do
+ Gitlab::AlertManagement::AlertParams.from_generic_alert(project: project, payload: params.to_h)
+ end
+ end
+
+ def process_alert
+ existing_alert = find_alert_by_fingerprint(am_alert_params[:fingerprint])
+
+ if existing_alert
+ process_existing_alert(existing_alert)
+ else
+ create_alert
+ end
+ end
+
+ def process_existing_alert(alert)
+ alert.register_new_event!
end
def create_alert
- AlertManagement::Alert.create(am_alert_params)
+ alert = AlertManagement::Alert.create(am_alert_params)
+ alert.execute_services if alert.persisted?
+
+ alert
+ end
+
+ def find_alert_by_fingerprint(fingerprint)
+ return unless fingerprint
+
+ AlertManagement::Alert.for_fingerprint(project, fingerprint).first
end
def send_email?
@@ -38,6 +63,8 @@ module Projects
end
def process_incident_issues(alert)
+ return if alert.issue
+
IncidentManagement::ProcessAlertWorker
.perform_async(project.id, parsed_payload, alert.id)
end