diff options
Diffstat (limited to 'app/presenters/alert_management')
-rw-r--r-- | app/presenters/alert_management/alert_presenter.rb | 101 | ||||
-rw-r--r-- | app/presenters/alert_management/prometheus_alert_presenter.rb | 27 |
2 files changed, 128 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 diff --git a/app/presenters/alert_management/prometheus_alert_presenter.rb b/app/presenters/alert_management/prometheus_alert_presenter.rb new file mode 100644 index 00000000000..3bcc98e6784 --- /dev/null +++ b/app/presenters/alert_management/prometheus_alert_presenter.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module AlertManagement + class PrometheusAlertPresenter < AlertManagement::AlertPresenter + def metrics_dashboard_url + alerting_alert.metrics_dashboard_url + end + + private + + def alert_markdown + alerting_alert.alert_markdown + end + + def details_list + alerting_alert.annotation_list + end + + def metric_embed_for_alert + alerting_alert.metric_embed_for_alert + end + + def full_query + alerting_alert.full_query + end + end +end |