diff options
Diffstat (limited to 'app/services/projects/alerting/notify_service.rb')
-rw-r--r-- | app/services/projects/alerting/notify_service.rb | 33 |
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 |