diff options
Diffstat (limited to 'app/services/alert_management/process_prometheus_alert_service.rb')
-rw-r--r-- | app/services/alert_management/process_prometheus_alert_service.rb | 89 |
1 files changed, 53 insertions, 36 deletions
diff --git a/app/services/alert_management/process_prometheus_alert_service.rb b/app/services/alert_management/process_prometheus_alert_service.rb index c233ea4e2e5..95ae84a85a4 100644 --- a/app/services/alert_management/process_prometheus_alert_service.rb +++ b/app/services/alert_management/process_prometheus_alert_service.rb @@ -3,9 +3,10 @@ module AlertManagement class ProcessPrometheusAlertService < BaseService include Gitlab::Utils::StrongMemoize + include ::IncidentManagement::Settings def execute - return bad_request unless parsed_alert.valid? + return bad_request unless incoming_payload.has_required_attributes? process_alert_management_alert @@ -14,71 +15,62 @@ module AlertManagement private - delegate :firing?, :resolved?, :gitlab_fingerprint, :ends_at, to: :parsed_alert - - def parsed_alert - strong_memoize(:parsed_alert) do - Gitlab::Alerting::Alert.new(project: project, payload: params) - end - end - def process_alert_management_alert - process_firing_alert_management_alert if firing? - process_resolved_alert_management_alert if resolved? + if incoming_payload.resolved? + process_resolved_alert_management_alert + else + process_firing_alert_management_alert + end end def process_firing_alert_management_alert - if am_alert.present? - am_alert.register_new_event! + if alert.persisted? + alert.register_new_event! reset_alert_management_alert_status else create_alert_management_alert end - process_incident_alert + process_incident_issues if process_issues? end def reset_alert_management_alert_status - return if am_alert.trigger + return if alert.trigger logger.warn( message: 'Unable to update AlertManagement::Alert status to triggered', project_id: project.id, - alert_id: am_alert.id + alert_id: alert.id ) end def create_alert_management_alert - new_alert = AlertManagement::Alert.new(am_alert_params.merge(ended_at: nil)) - if new_alert.save - new_alert.execute_services - @am_alert = new_alert + if alert.save + alert.execute_services + SystemNoteService.create_new_alert(alert, Gitlab::AlertManagement::AlertParams::MONITORING_TOOLS[:prometheus]) return end logger.warn( message: 'Unable to create AlertManagement::Alert', project_id: project.id, - alert_errors: new_alert.errors.messages + alert_errors: alert.errors.messages ) end - def am_alert_params - Gitlab::AlertManagement::AlertParams.from_prometheus_alert(project: project, parsed_alert: parsed_alert) - end - def process_resolved_alert_management_alert - return if am_alert.blank? + return unless alert.persisted? + return unless auto_close_incident? - if am_alert.resolve(ends_at) - close_issue(am_alert.issue) + if alert.resolve(incoming_payload.ends_at) + close_issue(alert.issue) return end logger.warn( message: 'Unable to update AlertManagement::Alert status to resolved', project_id: project.id, - alert_id: am_alert.id + alert_id: alert.id ) end @@ -92,20 +84,45 @@ module AlertManagement SystemNoteService.auto_resolve_prometheus_alert(issue, project, User.alert_bot) if issue.reset.closed? end - def process_incident_alert - return unless am_alert - return if am_alert.issue + def process_incident_issues + return unless alert.persisted? + return if alert.issue - IncidentManagement::ProcessAlertWorker.perform_async(nil, nil, am_alert.id) + IncidentManagement::ProcessAlertWorker.perform_async(nil, nil, alert.id) end def logger @logger ||= Gitlab::AppLogger end - def am_alert - strong_memoize(:am_alert) do - AlertManagement::Alert.not_resolved.for_fingerprint(project, gitlab_fingerprint).first + def alert + strong_memoize(:alert) do + existing_alert || new_alert + end + end + + def existing_alert + strong_memoize(:existing_alert) do + AlertManagement::Alert.not_resolved.for_fingerprint(project, incoming_payload.gitlab_fingerprint).first + end + end + + def new_alert + strong_memoize(:new_alert) do + AlertManagement::Alert.new( + **incoming_payload.alert_params, + ended_at: nil + ) + end + end + + def incoming_payload + strong_memoize(:incoming_payload) do + Gitlab::AlertManagement::Payload.parse( + project, + params, + monitoring_tool: Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:prometheus] + ) end end |