2020-05-19 20:08:20 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require 'spec_helper'
|
|
|
|
|
|
|
|
describe Gitlab::Metrics::Samplers::DatabaseSampler do
|
2020-05-27 23:08:08 -04:00
|
|
|
subject { described_class.new }
|
|
|
|
|
|
|
|
describe '#interval' do
|
|
|
|
it 'samples every five seconds by default' do
|
|
|
|
expect(subject.interval).to eq(5)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'samples at other intervals if requested' do
|
|
|
|
expect(described_class.new(11).interval).to eq(11)
|
|
|
|
end
|
|
|
|
end
|
2020-05-19 20:08:20 -04:00
|
|
|
|
|
|
|
describe '#sample' do
|
|
|
|
before do
|
|
|
|
described_class::METRIC_DESCRIPTIONS.each_key do |metric|
|
|
|
|
allow(subject.metrics[metric]).to receive(:set)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'for ActiveRecord::Base' do
|
|
|
|
let(:labels) do
|
|
|
|
{
|
|
|
|
class: 'ActiveRecord::Base',
|
|
|
|
host: Gitlab::Database.config['host'],
|
|
|
|
port: Gitlab::Database.config['port']
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the database is connected' do
|
|
|
|
it 'samples connection pool statistics' do
|
|
|
|
expect(subject.metrics[:size]).to receive(:set).with(labels, a_value >= 1)
|
|
|
|
expect(subject.metrics[:connections]).to receive(:set).with(labels, a_value >= 1)
|
|
|
|
expect(subject.metrics[:busy]).to receive(:set).with(labels, a_value >= 1)
|
|
|
|
expect(subject.metrics[:dead]).to receive(:set).with(labels, a_value >= 0)
|
|
|
|
expect(subject.metrics[:waiting]).to receive(:set).with(labels, a_value >= 0)
|
|
|
|
|
|
|
|
subject.sample
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when the database is not connected' do
|
|
|
|
before do
|
|
|
|
allow(ActiveRecord::Base).to receive(:connected?).and_return(false)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'records no samples' do
|
|
|
|
expect(subject.metrics[:size]).not_to receive(:set).with(labels, anything)
|
|
|
|
|
|
|
|
subject.sample
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|