debian-mirror-gitlab/app/presenters/alert_management/alert_presenter.rb

120 lines
3 KiB
Ruby
Raw Normal View History

2020-07-28 23:09:34 +05:30
# frozen_string_literal: true
module AlertManagement
class AlertPresenter < Gitlab::View::Presenter::Delegated
include IncidentManagement::Settings
2021-11-18 22:05:49 +05:30
presents ::AlertManagement::Alert
2022-04-04 11:22:00 +05:30
delegator_override_with Gitlab::Utils::StrongMemoize # This module inclusion is expected. See https://gitlab.com/gitlab-org/gitlab/-/issues/352884.
2021-11-18 22:05:49 +05:30
2020-11-24 15:15:51 +05:30
MARKDOWN_LINE_BREAK = " \n"
HORIZONTAL_LINE = "\n\n---\n\n"
delegate :metrics_dashboard_url, :runbook, to: :parsed_payload
2020-07-28 23:09:34 +05:30
2021-01-03 14:25:43 +05:30
def initialize(alert, **attributes)
2020-07-28 23:09:34 +05:30
super
@alert = alert
@project = alert.project
end
def issue_description
[
issue_summary_markdown,
alert_markdown,
incident_management_setting.issue_template_content
2020-11-24 15:15:51 +05:30
].compact.join(HORIZONTAL_LINE)
2020-07-28 23:09:34 +05:30
end
def start_time
started_at&.strftime('%d %B %Y, %-l:%M%p (%Z)')
end
2021-11-18 22:05:49 +05:30
delegator_override :details_url
2020-10-24 23:57:45 +05:30
def details_url
details_project_alert_management_url(project, alert.iid)
end
2020-11-24 15:15:51 +05:30
def details
Gitlab::Utils::InlineHash.merge_keys(payload)
end
2021-01-03 14:25:43 +05:30
def show_incident_issues_link?
project.incident_management_setting&.create_issue?
end
def show_performance_dashboard_link?
prometheus_alert.present?
end
def incident_issues_link
2021-02-22 17:27:13 +05:30
project_incidents_url(project)
2021-01-03 14:25:43 +05:30
end
def performance_dashboard_link
if environment
metrics_project_environment_url(project, environment)
else
metrics_project_environments_url(project)
end
end
def email_title
[environment&.name, query_title].compact.join(': ')
end
2020-07-28 23:09:34 +05:30
private
attr_reader :alert, :project
2021-11-18 22:05:49 +05:30
2020-11-24 15:15:51 +05:30
delegate :alert_markdown, :full_query, to: :parsed_payload
2020-07-28 23:09:34 +05:30
2020-11-24 15:15:51 +05:30
def issue_summary_markdown
<<~MARKDOWN.chomp
#{metadata_list}
#{metric_embed_for_alert}
MARKDOWN
2020-07-28 23:09:34 +05:30
end
def metadata_list
metadata = []
metadata << list_item('Start time', start_time)
metadata << list_item('Severity', severity)
metadata << list_item('full_query', backtick(full_query)) if full_query
metadata << list_item('Service', service) if service
metadata << list_item('Monitoring tool', monitoring_tool) if monitoring_tool
metadata << list_item('Hosts', host_links) if hosts.any?
metadata << list_item('Description', description) if description.present?
2020-10-24 23:57:45 +05:30
metadata << list_item('GitLab alert', details_url) if details_url.present?
2020-07-28 23:09:34 +05:30
metadata.join(MARKDOWN_LINE_BREAK)
end
2020-11-24 15:15:51 +05:30
def metric_embed_for_alert
"\n[](#{metrics_dashboard_url})" if metrics_dashboard_url
2020-07-28 23:09:34 +05:30
end
def list_item(key, value)
"**#{key}:** #{value}".strip
end
def backtick(value)
"`#{value}`"
end
def host_links
hosts.join(' ')
end
2021-01-03 14:25:43 +05:30
def query_title
return title unless prometheus_alert
"#{prometheus_alert.title} #{prometheus_alert.computed_operator} #{prometheus_alert.threshold} for 5 minutes"
end
2020-07-28 23:09:34 +05:30
end
end
2021-06-08 01:23:25 +05:30
AlertManagement::AlertPresenter.prepend_mod_with('AlertManagement::AlertPresenter')