diff options
Diffstat (limited to 'spec/lib/gitlab/utils/usage_data_spec.rb')
-rw-r--r-- | spec/lib/gitlab/utils/usage_data_spec.rb | 149 |
1 files changed, 139 insertions, 10 deletions
diff --git a/spec/lib/gitlab/utils/usage_data_spec.rb b/spec/lib/gitlab/utils/usage_data_spec.rb index 4675cbd7fa1..362cbaa78e9 100644 --- a/spec/lib/gitlab/utils/usage_data_spec.rb +++ b/spec/lib/gitlab/utils/usage_data_spec.rb @@ -37,6 +37,28 @@ RSpec.describe Gitlab::Utils::UsageData do end end + describe '#sum' do + let(:relation) { double(:relation) } + + it 'returns the count when counting succeeds' do + allow(Gitlab::Database::BatchCount) + .to receive(:batch_sum) + .with(relation, :column, batch_size: 100, start: 2, finish: 3) + .and_return(1) + + 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('')) + + expect(described_class.sum(relation, :column)).to eq(15) + end + end + describe '#alt_usage_data' do it 'returns the fallback when it gets an error' do expect(described_class.alt_usage_data { raise StandardError } ).to eq(-1) @@ -76,26 +98,19 @@ RSpec.describe Gitlab::Utils::UsageData do end describe '#with_prometheus_client' do - context 'when Prometheus is enabled' do + shared_examples 'query data from Prometheus' do it 'yields a client instance and returns the block result' do - expect(Gitlab::Prometheus::Internal).to receive(:prometheus_enabled?).and_return(true) - expect(Gitlab::Prometheus::Internal).to receive(:uri).and_return('http://prom:9090') - result = described_class.with_prometheus_client { |client| client } expect(result).to be_an_instance_of(Gitlab::PrometheusClient) end end - context 'when Prometheus is disabled' do - before do - expect(Gitlab::Prometheus::Internal).to receive(:prometheus_enabled?).and_return(false) - end - + shared_examples 'does not query data from Prometheus' do it 'returns nil by default' do result = described_class.with_prometheus_client { |client| client } - expect(result).to be nil + expect(result).to be_nil end it 'returns fallback if provided' do @@ -104,6 +119,74 @@ RSpec.describe Gitlab::Utils::UsageData do expect(result).to eq([]) end end + + shared_examples 'try to query Prometheus with given address' do + context 'Prometheus is ready' do + before do + stub_request(:get, /\/-\/ready/) + .to_return(status: 200, body: 'Prometheus is Ready.\n') + end + + context 'Prometheus is reachable through HTTPS' do + it_behaves_like 'query data from Prometheus' + end + + context 'Prometheus is not reachable through HTTPS' do + before do + stub_request(:get, /https:\/\/.*/).to_raise(Errno::ECONNREFUSED) + end + + context 'Prometheus is reachable through HTTP' do + it_behaves_like 'query data from Prometheus' + end + + context 'Prometheus is not reachable through HTTP' do + before do + stub_request(:get, /http:\/\/.*/).to_raise(Errno::ECONNREFUSED) + end + + it_behaves_like 'does not query data from Prometheus' + end + end + end + + context 'Prometheus is not ready' do + before do + stub_request(:get, /\/-\/ready/) + .to_return(status: 503, body: 'Service Unavailable') + end + + it_behaves_like 'does not query data from Prometheus' + end + end + + context 'when Prometheus server address is available from settings' do + before do + expect(Gitlab::Prometheus::Internal).to receive(:prometheus_enabled?).and_return(true) + expect(Gitlab::Prometheus::Internal).to receive(:server_address).and_return('prom:9090') + end + + it_behaves_like 'try to query Prometheus with given address' + end + + context 'when Prometheus server address is available from Consul service discovery' do + before do + expect(Gitlab::Prometheus::Internal).to receive(:prometheus_enabled?).and_return(false) + expect(Gitlab::Consul::Internal).to receive(:api_url).and_return('http://localhost:8500') + expect(Gitlab::Consul::Internal).to receive(:discover_prometheus_server_address).and_return('prom:9090') + end + + it_behaves_like 'try to query Prometheus with given address' + end + + context 'when Prometheus server address is not available' do + before do + expect(Gitlab::Prometheus::Internal).to receive(:prometheus_enabled?).and_return(false) + expect(Gitlab::Consul::Internal).to receive(:api_url).and_return(nil) + end + + it_behaves_like 'does not query data from Prometheus' + end end describe '#measure_duration' do @@ -126,4 +209,50 @@ RSpec.describe Gitlab::Utils::UsageData do end end end + + describe '#track_usage_event' do + let(:value) { '9f302fea-f828-4ca9-aef4-e10bd723c0b3' } + let(:event_name) { 'my_event' } + let(:unknown_event) { 'unknown' } + let(:feature) { "usage_data_#{event_name}" } + + context 'with feature enabled' do + before do + stub_feature_flags(feature => true) + end + + it 'tracks redis hll event' do + stub_application_setting(usage_ping_enabled: true) + + expect(Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with(value, event_name) + + described_class.track_usage_event(event_name, value) + end + + it 'does not track event when usage ping is not enabled' do + stub_application_setting(usage_ping_enabled: false) + expect(Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event) + + described_class.track_usage_event(event_name, value) + end + + it 'raise an error for unknown event' do + stub_application_setting(usage_ping_enabled: true) + + expect { described_class.track_usage_event(unknown_event, value) }.to raise_error(Gitlab::UsageDataCounters::HLLRedisCounter::UnknownEvent) + end + end + + context 'with feature disabled' do + before do + stub_feature_flags(feature => false) + end + + it 'does not track event' do + expect(Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event) + + described_class.track_usage_event(event_name, value) + end + end + end end |