Class: AlertManagement::Alert

Inherits:
ApplicationRecord show all
Includes:
AtomicInternalId, Gitlab::SQL::Pattern, Gitlab::Utils::StrongMemoize, IidRoutes, IncidentManagement::Escalatable, Mentionable, Noteable, Presentable, Referable, ShaAttribute, Sortable, Todoable
Defined in:
app/models/alert_management/alert.rb

Constant Summary collapse

TITLE_MAX_LENGTH =
200
DESCRIPTION_MAX_LENGTH =
1_000
SERVICE_MAX_LENGTH =
100
TOOL_MAX_LENGTH =
100
HOSTS_MAX_LENGTH =
255

Constants included from IncidentManagement::Escalatable

IncidentManagement::Escalatable::OPEN_STATUSES, IncidentManagement::Escalatable::STATUSES, IncidentManagement::Escalatable::STATUS_DESCRIPTIONS

Constants included from Gitlab::SQL::Pattern

Gitlab::SQL::Pattern::MIN_CHARS_FOR_PARTIAL_MATCHING, Gitlab::SQL::Pattern::REGEX_QUOTED_TERM

Constants included from Noteable

Noteable::MAX_NOTES_LIMIT

Constants included from AtomicInternalId

AtomicInternalId::MissingValueError

Constants inherited from ApplicationRecord

ApplicationRecord::MAX_PLUCK

Constants included from HasCheckConstraints

HasCheckConstraints::NOT_NULL_CHECK_PATTERN

Constants included from ResetOnColumnErrors

ResetOnColumnErrors::MAX_RESET_PERIOD

Instance Attribute Summary

Attributes included from Noteable

#system_note_timestamp

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Referable

#referable_inspect, #reference_link_text, #to_reference_base

Methods included from Presentable

#present

Methods included from Gitlab::SQL::Pattern

split_query_to_search_terms

Methods included from Mentionable

#all_references, #create_cross_references!, #create_new_cross_references!, #directly_addressed_users, #extractors, #gfm_reference, #local_reference, #matches_cross_reference_regex?, #mentioned_users, #referenced_group_users, #referenced_groups, #referenced_mentionables, #referenced_project_users, #referenced_projects, #referenced_users, #user_mention_class, #user_mention_identifier

Methods included from Noteable

#after_note_created, #after_note_destroyed, #base_class_name, #broadcast_notes_changed, #capped_notes_count, #commenters, #creatable_note_email_address, #discussion_ids_relation, #discussion_notes, #discussion_root_note_ids, #discussions, #discussions_can_be_resolved_by?, #discussions_rendered_on_frontend?, #discussions_resolvable?, #discussions_resolved?, #discussions_to_be_resolved, #grouped_diff_discussions, #has_any_diff_note_positions?, #human_class_name, #lockable?, #noteable_target_type_name, #preloads_discussion_diff_highlighting?, #real_time_notes_enabled?, #resolvable_discussions, #supports_creating_notes_by_email?, #supports_discussions?, #supports_replying_to_individual_notes?, #supports_resolvable_notes?, #supports_suggestion?

Methods included from AtomicInternalId

group_init, #internal_id_read_scope, #internal_id_scope_attrs, #internal_id_scope_usage, namespace_init, project_init, scope_attrs, scope_usage

Methods included from IidRoutes

#to_param

Methods inherited from ApplicationRecord

===, cached_column_list, #create_or_load_association, declarative_enum, default_select_columns, id_in, id_not_in, iid_in, nullable_column?, pluck_primary_key, primary_key_in, #readable_by?, safe_ensure_unique, safe_find_or_create_by, safe_find_or_create_by!, underscore, where_exists, where_not_exists, with_fast_read_statement_timeout, without_order

Methods included from ResetOnColumnErrors

#reset_on_union_error, #reset_on_unknown_attribute_error

Methods included from Gitlab::SensitiveSerializableHash

#serializable_hash

Class Method Details

.counts_by_statusObject



102
103
104
# File 'app/models/alert_management/alert.rb', line 102

def self.counts_by_status
  group(:status).count.transform_keys { |k| status_name(k) }
end

.find_unresolved_alert(project, fingerprint) ⇒ Object



123
124
125
# File 'app/models/alert_management/alert.rb', line 123

def self.find_unresolved_alert(project, fingerprint)
  for_fingerprint(project, fingerprint).not_resolved.take
end


138
139
140
# File 'app/models/alert_management/alert.rb', line 138

def self.link_reference_pattern
  @link_reference_pattern ||= compose_link_reference_pattern('alert_management', %r{(?<alert>\d+)/details(\#)?})
end

.reference_patternObject



131
132
133
134
135
136
# File 'app/models/alert_management/alert.rb', line 131

def self.reference_pattern
  @reference_pattern ||= %r{
    (#{Project.reference_pattern})?
    #{Regexp.escape(reference_prefix)}(?<alert>\d+)
  }x
end

.reference_prefixObject



127
128
129
# File 'app/models/alert_management/alert.rb', line 127

def self.reference_prefix
  '^alert#'
end

.reference_valid?(reference) ⇒ Boolean

Returns:

  • (Boolean)


142
143
144
# File 'app/models/alert_management/alert.rb', line 142

def self.reference_valid?(reference)
  reference.to_i > 0 && reference.to_i <= Gitlab::Database::MAX_INT_VALUE
end

.sort_by_attribute(method) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'app/models/alert_management/alert.rb', line 106

def self.sort_by_attribute(method)
  case method.to_s
  when 'started_at_asc'     then order_start_time(:asc)
  when 'started_at_desc'    then order_start_time(:desc)
  when 'ended_at_asc'       then order_end_time(:asc)
  when 'ended_at_desc'      then order_end_time(:desc)
  when 'event_count_asc'    then order_event_count(:asc)
  when 'event_count_desc'   then order_event_count(:desc)
  when 'severity_asc'       then order_severity(:asc)
  when 'severity_desc'      then order_severity(:desc)
  when 'status_asc'         then order_status(:asc)
  when 'status_desc'        then order_status(:desc)
  else
    order_by(method)
  end
end

Instance Method Details

#execute_integrationsObject



160
161
162
163
164
# File 'app/models/alert_management/alert.rb', line 160

def execute_integrations
  return unless project.has_active_integrations?(:alert_hooks)

  project.execute_integrations(hook_data, :alert_hooks)
end

#parsed_payloadObject

Representation of the alert’s payload. Avoid accessing #payload attribute directly.



168
169
170
171
172
# File 'app/models/alert_management/alert.rb', line 168

def parsed_payload
  strong_memoize(:parsed_payload) do
    Gitlab::AlertManagement::Payload.parse(project, payload, monitoring_tool: monitoring_tool)
  end
end

#prometheus?Boolean

Returns:

  • (Boolean)


146
147
148
# File 'app/models/alert_management/alert.rb', line 146

def prometheus?
  monitoring_tool == Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:prometheus]
end

#register_new_event!Object



150
151
152
# File 'app/models/alert_management/alert.rb', line 150

def register_new_event!
  increment!(:events)
end

#to_ability_nameObject



174
175
176
# File 'app/models/alert_management/alert.rb', line 174

def to_ability_name
  'alert_management_alert'
end

#to_reference(from = nil, full: false) ⇒ Object



154
155
156
157
158
# File 'app/models/alert_management/alert.rb', line 154

def to_reference(from = nil, full: false)
  reference = "#{self.class.reference_prefix}#{iid}"

  "#{project.to_reference_base(from, full: full)}#{reference}"
end