2016-01-14 18:37:52 +05:30
|
|
|
require 'spec_helper'
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
describe Gitlab::Metrics::InfluxSampler do
|
2016-01-14 18:37:52 +05:30
|
|
|
let(:sampler) { described_class.new(5) }
|
|
|
|
|
|
|
|
after do
|
|
|
|
Allocations.stop if Gitlab::Metrics.mri?
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#start' do
|
2017-09-10 17:25:29 +05:30
|
|
|
it 'runs once and gathers a sample at a given interval' do
|
|
|
|
expect(sampler).to receive(:sleep).with(a_kind_of(Numeric)).twice
|
|
|
|
expect(sampler).to receive(:sample).once
|
|
|
|
expect(sampler).to receive(:running).and_return(true, false)
|
2016-01-14 18:37:52 +05:30
|
|
|
|
|
|
|
sampler.start.join
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#sample' do
|
|
|
|
it 'samples various statistics' do
|
|
|
|
expect(sampler).to receive(:sample_memory_usage)
|
|
|
|
expect(sampler).to receive(:sample_file_descriptors)
|
|
|
|
expect(sampler).to receive(:sample_objects)
|
|
|
|
expect(sampler).to receive(:sample_gc)
|
|
|
|
expect(sampler).to receive(:flush)
|
|
|
|
|
|
|
|
sampler.sample
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'clears any GC profiles' do
|
|
|
|
expect(sampler).to receive(:flush)
|
|
|
|
expect(GC::Profiler).to receive(:clear)
|
|
|
|
|
|
|
|
sampler.sample
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#flush' do
|
|
|
|
it 'schedules the metrics using Sidekiq' do
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(Gitlab::Metrics).to receive(:submit_metrics)
|
|
|
|
.with([an_instance_of(Hash)])
|
2016-01-14 18:37:52 +05:30
|
|
|
|
|
|
|
sampler.sample_memory_usage
|
|
|
|
sampler.flush
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#sample_memory_usage' do
|
|
|
|
it 'adds a metric containing the memory usage' do
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(Gitlab::Metrics::System).to receive(:memory_usage)
|
|
|
|
.and_return(9000)
|
2016-01-14 18:37:52 +05:30
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(sampler).to receive(:add_metric)
|
|
|
|
.with(/memory_usage/, value: 9000)
|
|
|
|
.and_call_original
|
2016-01-14 18:37:52 +05:30
|
|
|
|
|
|
|
sampler.sample_memory_usage
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#sample_file_descriptors' do
|
|
|
|
it 'adds a metric containing the amount of open file descriptors' do
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(Gitlab::Metrics::System).to receive(:file_descriptor_count)
|
|
|
|
.and_return(4)
|
2016-01-14 18:37:52 +05:30
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(sampler).to receive(:add_metric)
|
|
|
|
.with(/file_descriptors/, value: 4)
|
|
|
|
.and_call_original
|
2016-01-14 18:37:52 +05:30
|
|
|
|
|
|
|
sampler.sample_file_descriptors
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-06-16 23:09:34 +05:30
|
|
|
if Gitlab::Metrics.mri?
|
|
|
|
describe '#sample_objects' do
|
|
|
|
it 'adds a metric containing the amount of allocated objects' do
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(sampler).to receive(:add_metric)
|
|
|
|
.with(/object_counts/, an_instance_of(Hash), an_instance_of(Hash))
|
|
|
|
.at_least(:once)
|
|
|
|
.and_call_original
|
2016-06-16 23:09:34 +05:30
|
|
|
|
|
|
|
sampler.sample_objects
|
|
|
|
end
|
2016-01-14 18:37:52 +05:30
|
|
|
|
2016-06-16 23:09:34 +05:30
|
|
|
it 'ignores classes without a name' do
|
|
|
|
expect(Allocations).to receive(:to_hash).and_return({ Class.new => 4 })
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(sampler).not_to receive(:add_metric)
|
|
|
|
.with('object_counts', an_instance_of(Hash), type: nil)
|
2016-06-16 23:09:34 +05:30
|
|
|
|
|
|
|
sampler.sample_objects
|
|
|
|
end
|
2016-01-14 18:37:52 +05:30
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#sample_gc' do
|
|
|
|
it 'adds a metric containing garbage collection statistics' do
|
|
|
|
expect(GC::Profiler).to receive(:total_time).and_return(0.24)
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(sampler).to receive(:add_metric)
|
|
|
|
.with(/gc_statistics/, an_instance_of(Hash))
|
|
|
|
.and_call_original
|
2016-01-14 18:37:52 +05:30
|
|
|
|
|
|
|
sampler.sample_gc
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '#add_metric' do
|
|
|
|
it 'prefixes the series name for a Rails process' do
|
|
|
|
expect(sampler).to receive(:sidekiq?).and_return(false)
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(Gitlab::Metrics::Metric).to receive(:new)
|
|
|
|
.with('rails_cats', { value: 10 }, {})
|
|
|
|
.and_call_original
|
2016-01-14 18:37:52 +05:30
|
|
|
|
|
|
|
sampler.add_metric('cats', value: 10)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'prefixes the series name for a Sidekiq process' do
|
|
|
|
expect(sampler).to receive(:sidekiq?).and_return(true)
|
|
|
|
|
2017-09-10 17:25:29 +05:30
|
|
|
expect(Gitlab::Metrics::Metric).to receive(:new)
|
|
|
|
.with('sidekiq_cats', { value: 10 }, {})
|
|
|
|
.and_call_original
|
2016-01-14 18:37:52 +05:30
|
|
|
|
|
|
|
sampler.add_metric('cats', value: 10)
|
|
|
|
end
|
|
|
|
end
|
2016-01-19 16:12:03 +05:30
|
|
|
|
|
|
|
describe '#sleep_interval' do
|
|
|
|
it 'returns a Numeric' do
|
|
|
|
expect(sampler.sleep_interval).to be_a_kind_of(Numeric)
|
|
|
|
end
|
|
|
|
|
|
|
|
# Testing random behaviour is very hard, so treat this test as a basic smoke
|
|
|
|
# test instead of a very accurate behaviour/unit test.
|
|
|
|
it 'does not return the same interval twice in a row' do
|
|
|
|
last = nil
|
|
|
|
|
|
|
|
100.times do
|
|
|
|
interval = sampler.sleep_interval
|
|
|
|
|
2016-06-16 23:09:34 +05:30
|
|
|
expect(interval).not_to eq(last)
|
2016-01-19 16:12:03 +05:30
|
|
|
|
|
|
|
last = interval
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2016-01-14 18:37:52 +05:30
|
|
|
end
|