summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPawel Chojnacki <pawel@chojnacki.ws>2017-07-28 17:07:00 +0200
committerPawel Chojnacki <pawel@chojnacki.ws>2017-08-02 15:09:54 +0200
commite5541e0467c52d904fc15d28a0c864298c7d0e48 (patch)
tree9b96c2fb7cd30ea7347a55d029cb324924e8e6fa
parent5c7709c9c108b8a88ff244403a01859e3fc7f87b (diff)
downloadgitlab-ce-e5541e0467c52d904fc15d28a0c864298c7d0e48.tar.gz
SidekiqMetricsExporter tests
-rw-r--r--lib/gitlab/metrics/sidekiq_metrics_exporter.rb28
-rw-r--r--spec/lib/gitlab/metrics/sidekiq_metrics_exporter_spec.rb114
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