summaryrefslogtreecommitdiff
path: root/app/presenters/alert_management/alert_presenter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/presenters/alert_management/alert_presenter.rb')
-rw-r--r--app/presenters/alert_management/alert_presenter.rb101
1 files changed, 101 insertions, 0 deletions
diff --git a/app/presenters/alert_management/alert_presenter.rb b/app/presenters/alert_management/alert_presenter.rb
new file mode 100644
index 00000000000..a515c70152d
--- /dev/null
+++ b/app/presenters/alert_management/alert_presenter.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+module AlertManagement
+ class AlertPresenter < Gitlab::View::Presenter::Delegated
+ include Gitlab::Utils::StrongMemoize
+ include IncidentManagement::Settings
+
+ MARKDOWN_LINE_BREAK = " \n".freeze
+
+ def initialize(alert, _attributes = {})
+ super
+
+ @alert = alert
+ @project = alert.project
+ end
+
+ def issue_description
+ horizontal_line = "\n\n---\n\n"
+
+ [
+ issue_summary_markdown,
+ alert_markdown,
+ incident_management_setting.issue_template_content
+ ].compact.join(horizontal_line)
+ end
+
+ def start_time
+ started_at&.strftime('%d %B %Y, %-l:%M%p (%Z)')
+ end
+
+ def issue_summary_markdown
+ <<~MARKDOWN.chomp
+ #### Summary
+
+ #{metadata_list}
+ #{alert_details}#{metric_embed_for_alert}
+ MARKDOWN
+ end
+
+ def metrics_dashboard_url; end
+
+ private
+
+ attr_reader :alert, :project
+
+ def alerting_alert
+ strong_memoize(:alerting_alert) do
+ Gitlab::Alerting::Alert.new(project: project, payload: alert.payload).present
+ end
+ end
+
+ def alert_markdown; 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?
+
+ metadata.join(MARKDOWN_LINE_BREAK)
+ end
+
+ def alert_details
+ if details.present?
+ <<~MARKDOWN.chomp
+
+ #### Alert Details
+
+ #{details_list}
+ MARKDOWN
+ end
+ end
+
+ def details_list
+ alert.details
+ .map { |label, value| list_item(label, value) }
+ .join(MARKDOWN_LINE_BREAK)
+ end
+
+ def metric_embed_for_alert; end
+
+ def full_query; end
+
+ def list_item(key, value)
+ "**#{key}:** #{value}".strip
+ end
+
+ def backtick(value)
+ "`#{value}`"
+ end
+
+ def host_links
+ hosts.join(' ')
+ end
+ end
+end