diff options
Diffstat (limited to 'spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb')
-rw-r--r-- | spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb b/spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb new file mode 100644 index 00000000000..862b5b2bdc3 --- /dev/null +++ b/spec/lib/gitlab/alert_management/payload/managed_prometheus_spec.rb @@ -0,0 +1,167 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::AlertManagement::Payload::ManagedPrometheus do + let_it_be(:project) { create(:project) } + let(:raw_payload) { {} } + + let(:parsed_payload) { described_class.new(project: project, payload: raw_payload) } + + it_behaves_like 'subclass has expected api' + + shared_context 'with gitlab alert' do + let_it_be(:gitlab_alert) { create(:prometheus_alert, project: project) } + let(:metric_id) { gitlab_alert.prometheus_metric_id.to_s } + let(:alert_id) { gitlab_alert.id.to_s } + end + + describe '#metric_id' do + subject { parsed_payload.metric_id } + + it { is_expected.to be_nil } + + context 'with gitlab_alert_id' do + let(:raw_payload) { { 'labels' => { 'gitlab_alert_id' => '12' } } } + + it { is_expected.to eq(12) } + end + end + + describe '#gitlab_prometheus_alert_id' do + subject { parsed_payload.gitlab_prometheus_alert_id } + + it { is_expected.to be_nil } + + context 'with gitlab_alert_id' do + let(:raw_payload) { { 'labels' => { 'gitlab_prometheus_alert_id' => '12' } } } + + it { is_expected.to eq(12) } + end + end + + describe '#gitlab_alert' do + subject { parsed_payload.gitlab_alert } + + context 'without alert info in payload' do + it { is_expected.to be_nil } + end + + context 'with metric id in payload' do + let(:raw_payload) { { 'labels' => { 'gitlab_alert_id' => metric_id } } } + let(:metric_id) { '-1' } + + context 'without matching alert' do + it { is_expected.to be_nil } + end + + context 'with matching alert' do + include_context 'with gitlab alert' + + it { is_expected.to eq(gitlab_alert) } + + context 'when unclear which alert applies' do + # With multiple alerts for different environments, + # we can't be sure which prometheus alert the payload + # belongs to + let_it_be(:another_alert) do + create(:prometheus_alert, + prometheus_metric: gitlab_alert.prometheus_metric, + project: project) + end + + it { is_expected.to be_nil } + end + end + end + + context 'with alert id' do + # gitlab_prometheus_alert_id is a stronger identifier, + # but was added after gitlab_alert_id; we won't + # see it without gitlab_alert_id also present + let(:raw_payload) do + { + 'labels' => { + 'gitlab_alert_id' => metric_id, + 'gitlab_prometheus_alert_id' => alert_id + } + } + end + + context 'without matching alert' do + let(:alert_id) { '-1' } + let(:metric_id) { '-1' } + + it { is_expected.to be_nil } + end + + context 'with matching alerts' do + include_context 'with gitlab alert' + + it { is_expected.to eq(gitlab_alert) } + end + end + end + + describe '#full_query' do + subject { parsed_payload.full_query } + + it { is_expected.to be_nil } + + context 'with gitlab alert' do + include_context 'with gitlab alert' + + let(:raw_payload) { { 'labels' => { 'gitlab_alert_id' => metric_id } } } + + it { is_expected.to eq(gitlab_alert.full_query) } + end + + context 'with sufficient fallback info' do + let(:raw_payload) { { 'generatorURL' => 'http://localhost:9090/graph?g0.expr=vector%281%29' } } + + it { is_expected.to eq('vector(1)') } + end + end + + describe '#environment' do + subject { parsed_payload.environment } + + context 'with gitlab alert' do + include_context 'with gitlab alert' + + let(:raw_payload) { { 'labels' => { 'gitlab_alert_id' => metric_id } } } + + it { is_expected.to eq(gitlab_alert.environment) } + end + + context 'with sufficient fallback info' do + let_it_be(:environment) { create(:environment, project: project, name: 'production') } + let(:raw_payload) do + { + 'labels' => { + 'gitlab_alert_id' => '-1', + 'gitlab_environment_name' => 'production' + } + } + end + + it { is_expected.to eq(environment) } + end + end + + describe '#metrics_dashboard_url' do + subject { parsed_payload.metrics_dashboard_url } + + context 'without alert' do + it { is_expected.to be_nil } + end + + context 'with gitlab alert' do + include_context 'gitlab-managed prometheus alert attributes' do + let(:raw_payload) { payload } + end + + it { is_expected.to eq(dashboard_url_for_alert) } + end + end +end |