diff options
Diffstat (limited to 'spec/lib/gitlab/database/health_status/indicators/patroni_apdex_spec.rb')
-rw-r--r-- | spec/lib/gitlab/database/health_status/indicators/patroni_apdex_spec.rb | 151 |
1 files changed, 14 insertions, 137 deletions
diff --git a/spec/lib/gitlab/database/health_status/indicators/patroni_apdex_spec.rb b/spec/lib/gitlab/database/health_status/indicators/patroni_apdex_spec.rb index e0e3a0a7c23..9382074f584 100644 --- a/spec/lib/gitlab/database/health_status/indicators/patroni_apdex_spec.rb +++ b/spec/lib/gitlab/database/health_status/indicators/patroni_apdex_spec.rb @@ -3,150 +3,27 @@ require 'spec_helper' RSpec.describe Gitlab::Database::HealthStatus::Indicators::PatroniApdex, :aggregate_failures, feature_category: :database do # rubocop:disable Layout/LineLength - let(:schema) { :main } - let(:connection) { Gitlab::Database.database_base_models[schema].connection } - - around do |example| - Gitlab::Database::SharedModel.using_connection(connection) do - example.run - end - end - - describe '#evaluate' do - let(:prometheus_url) { 'http://thanos:9090' } - let(:prometheus_config) { [prometheus_url, { allow_local_requests: true, verify: true }] } - - let(:prometheus_client) { instance_double(Gitlab::PrometheusClient) } - - let(:context) do - Gitlab::Database::HealthStatus::Context.new( - described_class, - connection, - ['users'], - gitlab_schema - ) - end - - let(:gitlab_schema) { "gitlab_#{schema}" } - let(:client_ready) { true } - let(:database_apdex_sli_query_main) { 'Apdex query for main' } - let(:database_apdex_sli_query_ci) { 'Apdex query for ci' } - let(:database_apdex_slo_main) { 0.99 } - let(:database_apdex_slo_ci) { 0.95 } - let(:database_apdex_settings) do + it_behaves_like 'Prometheus Alert based health indicator' do + let(:feature_flag) { :batched_migrations_health_status_patroni_apdex } + let(:sli_query_main) { 'Apdex query for main' } + let(:sli_query_ci) { 'Apdex query for ci' } + let(:slo_main) { 0.99 } + let(:slo_ci) { 0.95 } + let(:sli_with_good_condition) { { main: 0.991, ci: 0.951 } } + let(:sli_with_bad_condition) { { main: 0.989, ci: 0.949 } } + + let(:prometheus_alert_db_indicators_settings) do { prometheus_api_url: prometheus_url, apdex_sli_query: { - main: database_apdex_sli_query_main, - ci: database_apdex_sli_query_ci + main: sli_query_main, + ci: sli_query_ci }, apdex_slo: { - main: database_apdex_slo_main, - ci: database_apdex_slo_ci + main: slo_main, + ci: slo_ci } } end - - subject(:evaluate) { described_class.new(context).evaluate } - - before do - stub_application_setting(database_apdex_settings: database_apdex_settings) - - allow(Gitlab::PrometheusClient).to receive(:new).with(*prometheus_config).and_return(prometheus_client) - allow(prometheus_client).to receive(:ready?).and_return(client_ready) - end - - shared_examples 'Patroni Apdex Evaluator' do |schema| - context "with #{schema} schema" do - let(:schema) { schema } - let(:apdex_slo_above_sli) { { main: 0.991, ci: 0.951 } } - let(:apdex_slo_below_sli) { { main: 0.989, ci: 0.949 } } - - it 'returns NoSignal signal in case the feature flag is disabled' do - stub_feature_flags(batched_migrations_health_status_patroni_apdex: false) - - expect(evaluate).to be_a(Gitlab::Database::HealthStatus::Signals::NotAvailable) - expect(evaluate.reason).to include('indicator disabled') - end - - context 'without database_apdex_settings' do - let(:database_apdex_settings) { nil } - - it 'returns Unknown signal' do - expect(evaluate).to be_a(Gitlab::Database::HealthStatus::Signals::Unknown) - expect(evaluate.reason).to include('Patroni Apdex Settings not configured') - end - end - - context 'when Prometheus client is not ready' do - let(:client_ready) { false } - - it 'returns Unknown signal' do - expect(evaluate).to be_a(Gitlab::Database::HealthStatus::Signals::Unknown) - expect(evaluate.reason).to include('Prometheus client is not ready') - end - end - - context 'when apdex SLI query is not configured' do - let(:"database_apdex_sli_query_#{schema}") { nil } - - it 'returns Unknown signal' do - expect(evaluate).to be_a(Gitlab::Database::HealthStatus::Signals::Unknown) - expect(evaluate.reason).to include('Apdex SLI query is not configured') - end - end - - context 'when slo is not configured' do - let(:"database_apdex_slo_#{schema}") { nil } - - it 'returns Unknown signal' do - expect(evaluate).to be_a(Gitlab::Database::HealthStatus::Signals::Unknown) - expect(evaluate.reason).to include('Apdex SLO is not configured') - end - end - - it 'returns Normal signal when Patroni apdex SLI is above SLO' do - expect(prometheus_client).to receive(:query) - .with(send("database_apdex_sli_query_#{schema}")) - .and_return([{ "value" => [1662423310.878, apdex_slo_above_sli[schema]] }]) - expect(evaluate).to be_a(Gitlab::Database::HealthStatus::Signals::Normal) - expect(evaluate.reason).to include('Patroni service apdex is above SLO') - end - - it 'returns Stop signal when Patroni apdex is below SLO' do - expect(prometheus_client).to receive(:query) - .with(send("database_apdex_sli_query_#{schema}")) - .and_return([{ "value" => [1662423310.878, apdex_slo_below_sli[schema]] }]) - expect(evaluate).to be_a(Gitlab::Database::HealthStatus::Signals::Stop) - expect(evaluate.reason).to include('Patroni service apdex is below SLO') - end - - context 'when Patroni apdex can not be calculated' do - where(:result) do - [ - nil, - [], - [{}], - [{ 'value' => 1 }], - [{ 'value' => [1] }] - ] - end - - with_them do - it 'returns Unknown signal' do - expect(prometheus_client).to receive(:query).and_return(result) - expect(evaluate).to be_a(Gitlab::Database::HealthStatus::Signals::Unknown) - expect(evaluate.reason).to include('Patroni service apdex can not be calculated') - end - end - end - end - end - - Gitlab::Database.database_base_models.each do |database_base_model, connection| - next unless connection.present? - - it_behaves_like 'Patroni Apdex Evaluator', database_base_model.to_sym - end end end |