diff options
Diffstat (limited to 'app/models/alert_management/alert.rb')
-rw-r--r-- | app/models/alert_management/alert.rb | 93 |
1 files changed, 5 insertions, 88 deletions
diff --git a/app/models/alert_management/alert.rb b/app/models/alert_management/alert.rb index d0e4163dcdb..f40d0cd2fa4 100644 --- a/app/models/alert_management/alert.rb +++ b/app/models/alert_management/alert.rb @@ -9,24 +9,12 @@ module AlertManagement include ShaAttribute include Sortable include Noteable + include Mentionable include Gitlab::SQL::Pattern include Presentable include Gitlab::Utils::StrongMemoize include Referable - - STATUSES = { - triggered: 0, - acknowledged: 1, - resolved: 2, - ignored: 3 - }.freeze - - STATUS_DESCRIPTIONS = { - triggered: 'Investigation has not started', - acknowledged: 'Someone is actively investigating the problem', - resolved: 'No further work is required', - ignored: 'No action will be taken on the alert' - }.freeze + include ::IncidentManagement::Escalatable belongs_to :project belongs_to :issue, optional: true @@ -44,6 +32,9 @@ module AlertManagement sha_attribute :fingerprint + # Allow :ended_at to be managed by Escalatable + alias_attribute :resolved_at, :ended_at + TITLE_MAX_LENGTH = 200 DESCRIPTION_MAX_LENGTH = 1_000 SERVICE_MAX_LENGTH = 100 @@ -57,7 +48,6 @@ module AlertManagement validates :project, presence: true validates :events, presence: true validates :severity, presence: true - validates :status, presence: true validates :started_at, presence: true validates :fingerprint, allow_blank: true, uniqueness: { scope: :project, @@ -80,52 +70,10 @@ module AlertManagement threat_monitoring: 1 } - state_machine :status, initial: :triggered do - state :triggered, value: STATUSES[:triggered] - - state :acknowledged, value: STATUSES[:acknowledged] - - state :resolved, value: STATUSES[:resolved] do - validates :ended_at, presence: true - end - - state :ignored, value: STATUSES[:ignored] - - state :triggered, :acknowledged, :ignored do - validates :ended_at, absence: true - end - - event :trigger do - transition any => :triggered - end - - event :acknowledge do - transition any => :acknowledged - end - - event :resolve do - transition any => :resolved - end - - event :ignore do - transition any => :ignored - end - - before_transition to: [:triggered, :acknowledged, :ignored] do |alert, _transition| - alert.ended_at = nil - end - - before_transition to: :resolved do |alert, transition| - ended_at = transition.args.first - alert.ended_at = ended_at || Time.current - end - end - delegate :iid, to: :issue, prefix: true, allow_nil: true delegate :details_url, to: :present scope :for_iid, -> (iid) { where(iid: iid) } - scope :for_status, -> (status) { with_status(status) } scope :for_fingerprint, -> (project, fingerprint) { where(project: project, fingerprint: fingerprint) } scope :for_environment, -> (environment) { where(environment: environment) } scope :for_assignee_username, -> (assignee_username) { joins(:assignees).merge(User.by_username(assignee_username)) } @@ -146,36 +94,14 @@ module AlertManagement scope :order_severity, -> (sort_order) { order(severity: sort_order == :asc ? :desc : :asc) } scope :order_severity_with_open_prometheus_alert, -> { open.with_prometheus_alert.order(severity: :asc, started_at: :desc) } - # Ascending sort order sorts statuses: Ignored > Resolved > Acknowledged > Triggered - # Descending sort order sorts statuses: Triggered > Acknowledged > Resolved > Ignored - # https://gitlab.com/gitlab-org/gitlab/-/issues/221242#what-is-the-expected-correct-behavior - scope :order_status, -> (sort_order) { order(status: sort_order == :asc ? :desc : :asc) } - scope :counts_by_project_id, -> { group(:project_id).count } alias_method :state, :status_name - def self.state_machine_statuses - @state_machine_statuses ||= state_machines[:status].states.to_h { |s| [s.name, s.value] } - end - private_class_method :state_machine_statuses - - def self.status_value(name) - state_machine_statuses[name] - end - - def self.status_name(raw_status) - state_machine_statuses.key(raw_status) - end - def self.counts_by_status group(:status).count.transform_keys { |k| status_name(k) } end - def self.status_names - @status_names ||= state_machine_statuses.keys - end - def self.sort_by_attribute(method) case method.to_s when 'started_at_asc' then order_start_time(:asc) @@ -229,15 +155,6 @@ module AlertManagement self.class.open_status?(status_name) end - def status_event_for(status) - self.class.state_machines[:status].events.transitions_for(self, to: status.to_s.to_sym).first&.event - end - - def change_status_to(new_status) - event = status_event_for(new_status) - event && fire_status_event(event) - end - def prometheus? monitoring_tool == Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:prometheus] end |