diff --git a/app/presenters/alert_management/alert_presenter.rb b/app/presenters/alert_management/alert_presenter.rb index d6ebc8e18b112123ee2aa3b41398af6def2a7783..c3067e6377fc26fc366fb5733ec657c17807a620 100644 --- a/app/presenters/alert_management/alert_presenter.rb +++ b/app/presenters/alert_management/alert_presenter.rb @@ -47,6 +47,13 @@ def metrics_dashboard_url; end private + def details_url + ::Gitlab::Routing.url_helpers.details_project_alert_management_url( + project, + alert.iid + ) + end + attr_reader :alert, :project def alerting_alert @@ -67,6 +74,7 @@ def metadata_list 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 << list_item('GitLab alert', details_url) if details_url.present? metadata.join(MARKDOWN_LINE_BREAK) end diff --git a/app/presenters/projects/prometheus/alert_presenter.rb b/app/presenters/projects/prometheus/alert_presenter.rb index 1cf8b202810d7abad0d9a2f14a6de5ef8f45a416..14a51b4a4fc1523e3a40d33ba1bc6a0871eec4da 100644 --- a/app/presenters/projects/prometheus/alert_presenter.rb +++ b/app/presenters/projects/prometheus/alert_presenter.rb @@ -77,6 +77,15 @@ def metrics_dashboard_url end end + def details_url + return unless am_alert + + ::Gitlab::Routing.url_helpers.details_project_alert_management_url( + project, + am_alert.iid + ) + end + private def alert_title @@ -97,6 +106,7 @@ def metadata_list metadata << list_item(service.label.humanize, service.value) if service metadata << list_item(monitoring_tool.label.humanize, monitoring_tool.value) if monitoring_tool metadata << list_item(hosts.label.humanize, host_links) if hosts + metadata << list_item('GitLab alert', details_url) if details_url metadata.join(MARKDOWN_LINE_BREAK) end diff --git a/app/services/incident_management/create_issue_service.rb b/app/services/incident_management/create_issue_service.rb index 34c70b002b6fd417028fcc5d1a3c7b8925c4fec4..d1c5c6752d4f4e6f103d25e2364e03bfc32d8ed2 100644 --- a/app/services/incident_management/create_issue_service.rb +++ b/app/services/incident_management/create_issue_service.rb @@ -5,13 +5,16 @@ class CreateIssueService < BaseService include Gitlab::Utils::StrongMemoize include IncidentManagement::Settings - def initialize(project, params) - super(project, User.alert_bot, params) + attr_reader :alert + + def initialize(project, alert) + super(project, User.alert_bot) + @alert = alert end def execute return error('setting disabled') unless incident_management_setting.create_issue? - return error('invalid alert') unless alert.valid? + return error('invalid alert') unless alert_presenter.valid? result = create_incident return error(result.message, result.payload[:issue]) unless result.success? @@ -31,7 +34,7 @@ def create_incident end def issue_title - alert.full_title + alert_presenter.full_title end def issue_description @@ -45,16 +48,16 @@ def issue_description end def alert_summary - alert.issue_summary_markdown + alert_presenter.issue_summary_markdown end def alert_markdown - alert.alert_markdown + alert_presenter.alert_markdown end - def alert - strong_memoize(:alert) do - Gitlab::Alerting::Alert.new(project: project, payload: params).present + def alert_presenter + strong_memoize(:alert_presenter) do + Gitlab::Alerting::Alert.for_alert_management_alert(project: project, alert: alert).present end end diff --git a/app/workers/incident_management/process_alert_worker.rb b/app/workers/incident_management/process_alert_worker.rb index 26c86a3aa2bc73c2cafc9c9ea98e6cc006b40c7c..a8c6c9aa12151856c8433d5f8a742f6396f8f8dd 100644 --- a/app/workers/incident_management/process_alert_worker.rb +++ b/app/workers/incident_management/process_alert_worker.rb @@ -29,17 +29,9 @@ def find_alert(alert_id) AlertManagement::Alert.find_by_id(alert_id) end - def parsed_payload(alert) - if alert.prometheus? - alert.payload - else - Gitlab::Alerting::NotificationPayloadParser.call(alert.payload.to_h, alert.project) - end - end - def create_issue_for(alert) IncidentManagement::CreateIssueService - .new(alert.project, parsed_payload(alert)) + .new(alert.project, alert) .execute end diff --git a/changelogs/unreleased/215088-add-alert-url-to-issue-description.yml b/changelogs/unreleased/215088-add-alert-url-to-issue-description.yml new file mode 100644 index 0000000000000000000000000000000000000000..c3682301fab248046bfde337083af4caf832de59 --- /dev/null +++ b/changelogs/unreleased/215088-add-alert-url-to-issue-description.yml @@ -0,0 +1,5 @@ +--- +title: Add alert url into incident issue markdown +merge_request: 38649 +author: +type: added diff --git a/lib/gitlab/alerting/alert.rb b/lib/gitlab/alerting/alert.rb index dad3dabb4fcb69455afb09db622783a2c34d771d..94b81b7d2906a1eefffdc32863e2a9fa551bfd54 100644 --- a/lib/gitlab/alerting/alert.rb +++ b/lib/gitlab/alerting/alert.rb @@ -7,7 +7,17 @@ class Alert include Gitlab::Utils::StrongMemoize include Presentable - attr_accessor :project, :payload + attr_accessor :project, :payload, :am_alert + + def self.for_alert_management_alert(project:, alert:) + params = if alert.prometheus? + alert.payload + else + Gitlab::Alerting::NotificationPayloadParser.call(alert.payload.to_h, alert.project) + end + + self.new(project: project, payload: params, am_alert: alert) + end def gitlab_alert strong_memoize(:gitlab_alert) do diff --git a/spec/presenters/alert_management/alert_presenter_spec.rb b/spec/presenters/alert_management/alert_presenter_spec.rb index ccea0d36a28377aca9ca25712e0aaa07ab637d64..4281babee61d68761aed3eafc078486f0550ede4 100644 --- a/spec/presenters/alert_management/alert_presenter_spec.rb +++ b/spec/presenters/alert_management/alert_presenter_spec.rb @@ -4,6 +4,7 @@ RSpec.describe AlertManagement::AlertPresenter do let_it_be(:project) { create(:project) } + let_it_be(:generic_payload) do { 'title' => 'Alert title', @@ -12,10 +13,13 @@ 'runbook' => 'https://runbook.com' } end + let_it_be(:alert) do - build(:alert_management_alert, :with_description, :with_host, :with_service, :with_monitoring_tool, project: project, payload: generic_payload) + create(:alert_management_alert, :with_description, :with_host, :with_service, :with_monitoring_tool, project: project, payload: generic_payload) end + let(:alert_url) { "http://localhost/#{project.full_path}/-/alert_management/#{alert.iid}/details" } + subject(:presenter) { described_class.new(alert) } describe '#issue_description' do @@ -31,7 +35,8 @@ **Service:** #{alert.service}#{markdown_line_break} **Monitoring tool:** #{alert.monitoring_tool}#{markdown_line_break} **Hosts:** #{alert.hosts.join(' ')}#{markdown_line_break} - **Description:** #{alert.description} + **Description:** #{alert.description}#{markdown_line_break} + **GitLab alert:** #{alert_url} #### Alert Details diff --git a/spec/presenters/alert_management/prometheus_alert_presenter_spec.rb b/spec/presenters/alert_management/prometheus_alert_presenter_spec.rb index 70c85619fd1f333d615ac3ed0ab7a7bf47933c79..3cfff3c1b2f4533af419fc94134b642f83b7b4a1 100644 --- a/spec/presenters/alert_management/prometheus_alert_presenter_spec.rb +++ b/spec/presenters/alert_management/prometheus_alert_presenter_spec.rb @@ -16,10 +16,12 @@ } end - let(:alert) do + let!(:alert) do create(:alert_management_alert, :prometheus, project: project, payload: payload) end + let(:alert_url) { "http://localhost/#{project.full_path}/-/alert_management/#{alert.iid}/details" } + subject(:presenter) { described_class.new(alert) } describe '#issue_description' do @@ -33,7 +35,8 @@ **Start time:** #{presenter.start_time}#{markdown_line_break} **Severity:** #{presenter.severity}#{markdown_line_break} **full_query:** `vector(1)`#{markdown_line_break} - **Monitoring tool:** Prometheus + **Monitoring tool:** Prometheus#{markdown_line_break} + **GitLab alert:** #{alert_url} #### Alert Details diff --git a/spec/presenters/projects/prometheus/alert_presenter_spec.rb b/spec/presenters/projects/prometheus/alert_presenter_spec.rb index 89c5438b074d69a4df537580478aa878d94e275a..2d58a7f2cfa821077dc1efa3c721ff66eb4a5315 100644 --- a/spec/presenters/projects/prometheus/alert_presenter_spec.rb +++ b/spec/presenters/projects/prometheus/alert_presenter_spec.rb @@ -293,6 +293,19 @@ end end + describe '#details_url' do + subject { presenter.details_url } + + it { is_expected.to eq(nil) } + + context 'alert management alert present' do + let_it_be(:am_alert) { create(:alert_management_alert, project: project) } + let(:alert) { create(:alerting_alert, project: project, payload: payload, am_alert: am_alert) } + + it { is_expected.to eq("http://localhost/#{project.full_path}/-/alert_management/#{am_alert.iid}/details") } + end + end + context 'with gitlab alert' do include_context 'gitlab alert' diff --git a/spec/services/incident_management/create_issue_service_spec.rb b/spec/services/incident_management/create_issue_service_spec.rb index 60b3a513a67ace88e5506cbbdc4c6ff222791c16..6c77779fd9205266c9238f58ea17a80917586954 100644 --- a/spec/services/incident_management/create_issue_service_spec.rb +++ b/spec/services/incident_management/create_issue_service_spec.rb @@ -5,7 +5,6 @@ RSpec.describe IncidentManagement::CreateIssueService do let(:project) { create(:project, :repository, :private) } let_it_be(:user) { User.alert_bot } - let(:service) { described_class.new(project, alert_payload) } let(:alert_starts_at) { Time.current } let(:alert_title) { 'TITLE' } let(:alert_annotations) { { title: alert_title } } @@ -17,8 +16,11 @@ ) end + let(:alert) { create(:alert_management_alert, :prometheus, project: project, payload: alert_payload) } + let(:service) { described_class.new(project, alert) } + let(:alert_presenter) do - Gitlab::Alerting::Alert.new(project: project, payload: alert_payload).present + Gitlab::Alerting::Alert.for_alert_management_alert(project: project, alert: alert).present end let!(:setting) do diff --git a/spec/workers/incident_management/process_alert_worker_spec.rb b/spec/workers/incident_management/process_alert_worker_spec.rb index bed6dc59ac78ba637f2f511aae9779706081b8b3..9aac253c767b6060a9ad51685ef8fd8b662ac60d 100644 --- a/spec/workers/incident_management/process_alert_worker_spec.rb +++ b/spec/workers/incident_management/process_alert_worker_spec.rb @@ -19,14 +19,14 @@ allow(Gitlab::AppLogger).to receive(:warn).and_call_original allow(IncidentManagement::CreateIssueService) - .to receive(:new).with(alert.project, parsed_payload) + .to receive(:new).with(alert.project, alert) .and_call_original end shared_examples 'creates issue successfully' do it 'creates an issue' do expect(IncidentManagement::CreateIssueService) - .to receive(:new).with(alert.project, parsed_payload) + .to receive(:new).with(alert.project, alert) expect { subject }.to change { Issue.count }.by(1) end