diff options
author | Pawel Chojnacki <pawel@chojnacki.ws> | 2017-07-28 17:07:00 +0200 |
---|---|---|
committer | Pawel Chojnacki <pawel@chojnacki.ws> | 2017-08-02 15:09:54 +0200 |
commit | e5541e0467c52d904fc15d28a0c864298c7d0e48 (patch) | |
tree | 9b96c2fb7cd30ea7347a55d029cb324924e8e6fa | |
parent | 5c7709c9c108b8a88ff244403a01859e3fc7f87b (diff) | |
download | gitlab-ce-e5541e0467c52d904fc15d28a0c864298c7d0e48.tar.gz |
SidekiqMetricsExporter tests
-rw-r--r-- | lib/gitlab/metrics/sidekiq_metrics_exporter.rb | 28 | ||||
-rw-r--r-- | spec/lib/gitlab/metrics/sidekiq_metrics_exporter_spec.rb | 114 |
2 files changed, 128 insertions, 14 deletions
diff --git a/lib/gitlab/metrics/sidekiq_metrics_exporter.rb b/lib/gitlab/metrics/sidekiq_metrics_exporter.rb index ce26fc97099..769a761e99e 100644 --- a/lib/gitlab/metrics/sidekiq_metrics_exporter.rb +++ b/lib/gitlab/metrics/sidekiq_metrics_exporter.rb @@ -10,15 +10,13 @@ module Gitlab MUTEX.synchronize do if @instance.nil? @instance = SidekiqMetricsExporter.new - at_exit(&@instance.method(:stop)) + Kernel.at_exit(&@instance.method(:stop)) end end @instance end - attr_reader :running - def initialize @mutex = Mutex.new end @@ -27,27 +25,25 @@ module Gitlab settings.enabled end + def running? + !thread.nil? + end + def start return unless enabled? @mutex.synchronize do - return if running - @running = true + return thread if thread @thread = Thread.new do server_start - @running = false end end end def stop @mutex.synchronize do - return unless running - - @running = false - - if @thread + if thread @thread.wakeup if @thread.alive? server_stop @@ -62,17 +58,21 @@ module Gitlab Settings.monitoring.sidekiq_exporter end + private + + attr_reader :thread, :server + def server_start return unless @server.nil? @server = ::WEBrick::HTTPServer.new(Port: settings.port, BindAddress: settings.address) - @server.mount "/", Rack::Handler::WEBrick, rack_app + server.mount "/", Rack::Handler::WEBrick, rack_app - @server.start + server.start end def server_stop - @server&.shutdown + server&.shutdown @server = nil end diff --git a/spec/lib/gitlab/metrics/sidekiq_metrics_exporter_spec.rb b/spec/lib/gitlab/metrics/sidekiq_metrics_exporter_spec.rb new file mode 100644 index 00000000000..bcf53febcac --- /dev/null +++ b/spec/lib/gitlab/metrics/sidekiq_metrics_exporter_spec.rb @@ -0,0 +1,114 @@ +require 'spec_helper' + +describe Gitlab::Metrics::SidekiqMetricsExporter do + let(:exporter) { described_class.new } + let(:server) { double('server') } + + before do + allow(::WEBrick::HTTPServer).to receive(:new).and_return(server) + allow(server).to receive(:mount) + allow(server).to receive(:start) + allow(server).to receive(:shutdown) + end + + describe '.instance' do + it 'provides instance of SidekiQMetricsExporter' do + expect(described_class.instance).to be_instance_of(described_class) + end + + it 'subsequent invocations provide the same instance' do + expect(described_class.instance).to eq(described_class.instance) + end + + it 'is synchronized using mutex' do + expect(described_class::MUTEX).to receive(:synchronize) + + described_class.instance + end + + it 'creates at_exit hook when instance is created' do + described_class.instance_variable_set(:@instance, nil) + expect(Kernel).to receive(:at_exit) + + expect(described_class.instance).not_to be_nil + end + end + + describe 'when exporter is enabled' do + before do + allow(Settings.monitoring.sidekiq_exporter).to receive(:enabled).and_return(true) + end + + describe 'when exporter is stopped' do + describe '#start' do + it 'starts the exporter' do + expect { exporter.start.join }.to change { exporter.running? }.from(false).to(true) + + expect(server).to have_received(:start) + end + + it 'starts server with port and address from settings' do + expect(::WEBrick::HTTPServer).to receive(:new).with( + Port: Settings.monitoring.sidekiq_exporter.port, + BindAddress: Settings.monitoring.sidekiq_exporter.address + ) + + exporter.start.join + end + end + + describe '#stop' do + it "doesn't shutdown stopped server" do + expect { exporter.stop }.not_to change { exporter.running? } + + expect(server).not_to have_received(:shutdown) + end + end + end + + describe 'when exporter is running' do + before do + exporter.start.join + end + + describe '#start' do + it "doesn't start running server" do + expect(server).to have_received(:start).once + + expect { exporter.start.join }.not_to change { exporter.running? } + end + end + + describe '#stop' do + it 'shutdowns server' do + expect { exporter.stop }.to change { exporter.running? }.from(true).to(false) + + expect(server).to have_received(:shutdown) + end + end + end + end + + describe 'when exporter is disabled' do + before do + allow(Settings.monitoring.sidekiq_exporter).to receive(:enabled).and_return(false) + end + + describe '#start' do + it "doesn't start" do + expect(exporter.start).to be_nil + expect { exporter.start }.not_to change { exporter.running? } + + expect(server).not_to have_received(:start) + end + end + + describe '#stop' do + it "doesn't shutdown" do + expect { exporter.stop }.not_to change { exporter.running? } + + expect(server).not_to have_received(:shutdown) + end + end + end +end |