Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/lib/gitlab/utils/usage_data_spec.rb')
-rw-r--r--spec/lib/gitlab/utils/usage_data_spec.rb151
1 files changed, 98 insertions, 53 deletions
diff --git a/spec/lib/gitlab/utils/usage_data_spec.rb b/spec/lib/gitlab/utils/usage_data_spec.rb
index e721b28ac29..325ace6fbbf 100644
--- a/spec/lib/gitlab/utils/usage_data_spec.rb
+++ b/spec/lib/gitlab/utils/usage_data_spec.rb
@@ -5,32 +5,38 @@ require 'spec_helper'
RSpec.describe Gitlab::Utils::UsageData do
include Database::DatabaseHelpers
- describe '#add_metric' do
- let(:metric) { 'UuidMetric'}
+ shared_examples 'failing hardening method' do
+ before do
+ allow(Gitlab::ErrorTracking).to receive(:should_raise_for_dev?).and_return(should_raise_for_dev)
+ stub_const("Gitlab::Utils::UsageData::FALLBACK", fallback)
+ allow(failing_class).to receive(failing_method).and_raise(ActiveRecord::StatementInvalid)
+ end
- context 'with usage_data_instrumentation feature flag' do
- context 'when enabled' do
- before do
- stub_feature_flags(usage_data_instrumentation: true)
- end
+ context 'with should_raise_for_dev? false' do
+ let(:should_raise_for_dev) { false }
- it 'returns -100 value to be overriden' do
- expect(described_class.add_metric(metric)).to eq(-100)
- end
+ it 'returns the fallback' do
+ expect(subject).to eq(fallback)
end
+ end
- context 'when disabled' do
- before do
- stub_feature_flags(usage_data_instrumentation: false)
- end
+ context 'with should_raise_for_dev? true' do
+ let(:should_raise_for_dev) { true }
- it 'computes the metric value for given metric' do
- expect(described_class.add_metric(metric)).to eq(Gitlab::CurrentSettings.uuid)
- end
+ it 'raises an error' do
+ expect { subject }.to raise_error(ActiveRecord::StatementInvalid)
end
end
end
+ describe '#add_metric' do
+ let(:metric) { 'UuidMetric'}
+
+ it 'computes the metric value for given metric' do
+ expect(described_class.add_metric(metric)).to eq(Gitlab::CurrentSettings.uuid)
+ end
+ end
+
describe '#count' do
let(:relation) { double(:relation) }
@@ -40,11 +46,14 @@ RSpec.describe Gitlab::Utils::UsageData do
expect(described_class.count(relation, batch: false)).to eq(1)
end
- it 'returns the fallback value when counting fails' do
- stub_const("Gitlab::Utils::UsageData::FALLBACK", 15)
- allow(relation).to receive(:count).and_raise(ActiveRecord::StatementInvalid.new(''))
+ context 'when counting fails' do
+ subject { described_class.count(relation, batch: false) }
- expect(described_class.count(relation, batch: false)).to eq(15)
+ let(:fallback) { 15 }
+ let(:failing_class) { relation }
+ let(:failing_method) { :count }
+
+ it_behaves_like 'failing hardening method'
end
end
@@ -57,11 +66,14 @@ RSpec.describe Gitlab::Utils::UsageData do
expect(described_class.distinct_count(relation, batch: false)).to eq(1)
end
- it 'returns the fallback value when counting fails' do
- stub_const("Gitlab::Utils::UsageData::FALLBACK", 15)
- allow(relation).to receive(:distinct_count_by).and_raise(ActiveRecord::StatementInvalid.new(''))
+ context 'when counting fails' do
+ subject { described_class.distinct_count(relation, batch: false) }
+
+ let(:fallback) { 15 }
+ let(:failing_class) { relation }
+ let(:failing_method) { :distinct_count_by }
- expect(described_class.distinct_count(relation, batch: false)).to eq(15)
+ it_behaves_like 'failing hardening method'
end
end
@@ -106,7 +118,7 @@ RSpec.describe Gitlab::Utils::UsageData do
# build_needs set: ['1', '2', '3', '4', '5']
# ci_build set ['a', 'b']
# with them, current implementation is expected to consistently report
- # 5.217656147118495 and 2.0809220082170614 values
+ # the same static values
# This test suite is expected to assure, that HyperLogLog implementation
# behaves consistently between changes made to other parts of codebase.
# In case of fine tuning or changes to HyperLogLog algorithm implementation
@@ -118,8 +130,8 @@ RSpec.describe Gitlab::Utils::UsageData do
let(:model) { Ci::BuildNeed }
let(:column) { :name }
- let(:build_needs_estimated_cardinality) { 5.217656147118495 }
- let(:ci_builds_estimated_cardinality) { 2.0809220082170614 }
+ let(:build_needs_estimated_cardinality) { 5.024574181542231 }
+ let(:ci_builds_estimated_cardinality) { 2.003916452421793 }
before do
allow(model.connection).to receive(:transaction_open?).and_return(false)
@@ -173,14 +185,24 @@ RSpec.describe Gitlab::Utils::UsageData do
stub_const("Gitlab::Utils::UsageData::DISTRIBUTED_HLL_FALLBACK", 4)
end
- it 'returns fallback if counter raises WRONG_CONFIGURATION_ERROR' do
- expect(described_class.estimate_batch_distinct_count(relation, 'id', start: 1, finish: 0)).to eq 3
+ context 'when counter raises WRONG_CONFIGURATION_ERROR' do
+ subject { described_class.estimate_batch_distinct_count(relation, 'id', start: 1, finish: 0) }
+
+ let(:fallback) { 3 }
+ let(:failing_class) { Gitlab::Database::PostgresHll::BatchDistinctCounter }
+ let(:failing_method) { :new }
+
+ it_behaves_like 'failing hardening method'
end
- it 'returns default fallback value when counting fails due to database error' do
- allow(Gitlab::Database::PostgresHll::BatchDistinctCounter).to receive(:new).and_raise(ActiveRecord::StatementInvalid.new(''))
+ context 'when counting fails due to database error' do
+ subject { described_class.estimate_batch_distinct_count(relation) }
+
+ let(:fallback) { 3 }
+ let(:failing_class) { Gitlab::Database::PostgresHll::BatchDistinctCounter }
+ let(:failing_method) { :new }
- expect(described_class.estimate_batch_distinct_count(relation)).to eq(3)
+ it_behaves_like 'failing hardening method'
end
it 'logs error and returns DISTRIBUTED_HLL_FALLBACK value when counting raises any error', :aggregate_failures do
@@ -205,13 +227,14 @@ RSpec.describe Gitlab::Utils::UsageData do
expect(described_class.sum(relation, :column, batch_size: 100, start: 2, finish: 3)).to eq(1)
end
- it 'returns the fallback value when counting fails' do
- stub_const("Gitlab::Utils::UsageData::FALLBACK", 15)
- allow(Gitlab::Database::BatchCount)
- .to receive(:batch_sum)
- .and_raise(ActiveRecord::StatementInvalid.new(''))
+ context 'when counting fails' do
+ subject { described_class.sum(relation, :column) }
- expect(described_class.sum(relation, :column)).to eq(15)
+ let(:fallback) { 15 }
+ let(:failing_class) { Gitlab::Database::BatchCount }
+ let(:failing_method) { :batch_sum }
+
+ it_behaves_like 'failing hardening method'
end
end
@@ -291,23 +314,45 @@ RSpec.describe Gitlab::Utils::UsageData do
expect(histogram).to eq('2' => 1)
end
- it 'returns fallback and logs canceled queries' do
- create(:alert_management_http_integration, :active, project: project1)
+ context 'when query timeout' do
+ subject do
+ with_statement_timeout(0.001) do
+ relation = AlertManagement::HttpIntegration.select('pg_sleep(0.002)')
+ described_class.histogram(relation, column, buckets: 1..100)
+ end
+ end
- expect(Gitlab::AppJsonLogger).to receive(:error).with(
- event: 'histogram',
- relation: relation.table_name,
- operation: 'histogram',
- operation_args: [column, 1, 100, 99],
- query: kind_of(String),
- message: /PG::QueryCanceled/
- )
+ before do
+ allow(Gitlab::ErrorTracking).to receive(:should_raise_for_dev?).and_return(should_raise_for_dev)
+ create(:alert_management_http_integration, :active, project: project1)
+ end
- with_statement_timeout(0.001) do
- relation = AlertManagement::HttpIntegration.select('pg_sleep(0.002)')
- histogram = described_class.histogram(relation, column, buckets: 1..100)
+ context 'with should_raise_for_dev? false' do
+ let(:should_raise_for_dev) { false }
+
+ it 'logs canceled queries' do
+ expect(Gitlab::AppJsonLogger).to receive(:error).with(
+ event: 'histogram',
+ relation: relation.table_name,
+ operation: 'histogram',
+ operation_args: [column, 1, 100, 99],
+ query: kind_of(String),
+ message: /PG::QueryCanceled/
+ )
+ subject
+ end
- expect(histogram).to eq(fallback)
+ it 'returns fallback' do
+ expect(subject).to eq(fallback)
+ end
+ end
+
+ context 'with should_raise_for_dev? true' do
+ let(:should_raise_for_dev) { true }
+
+ it 'raises error' do
+ expect { subject }.to raise_error(ActiveRecord::QueryCanceled)
+ end
end
end
end