Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/alert_management/alert.rb')
-rw-r--r--app/models/alert_management/alert.rb93
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