Skip to content

Commit 0b7254b

Browse files
authored
Support Unicorn in Promenade::Raindrops::Middleware (#69)
* Support Unicorn in Promenade::Raindrops::Middleware * Use raindrops middleware only when either pitchfork or unicorn is loaded
1 parent 6442f72 commit 0b7254b

File tree

3 files changed

+47
-11
lines changed

3 files changed

+47
-11
lines changed

lib/promenade/railtie.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class Railtie < ::Rails::Railtie
1414
Rails.application.config.middleware.insert 0,
1515
Promenade::Client::Rack::HTTPRequestQueueTimeCollector
1616

17-
if defined?(::Raindrops)
17+
if defined?(::Raindrops) && (defined?(::Pitchfork) || defined?(::Unicorn))
1818
require "promenade/raindrops/middleware"
1919
Rails.application.config.middleware.use Promenade::Raindrops::Middleware
2020
end

lib/promenade/raindrops/middleware.rb

+8-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,14 @@ def call(env)
1919
private
2020

2121
def tcp_listener_names
22-
::Pitchfork.listener_names
22+
if defined?(::Pitchfork)
23+
::Pitchfork.listener_names
24+
elsif defined?(::Unicorn)
25+
::Unicorn.listener_names
26+
else
27+
raise StandardError,
28+
"Promenade::Raindrops::Middleware expects either ::Pitchfork or ::Unicorn to be defined"
29+
end
2330
end
2431

2532
def instrument

spec/promenade/raindrops/middleware_spec.rb

+38-9
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,48 @@
33
RSpec.describe Promenade::Raindrops::Middleware do
44
let(:app) { double(:app, call: nil) }
55
let(:listener_address) { "127.0.0.1:#{ENV.fetch('PORT', 3000)}" }
6-
let(:pitchfork) { class_double("Pitchfork").as_stubbed_const }
76

8-
before do
9-
allow(pitchfork).to receive(:listener_names).and_return([listener_address])
7+
shared_examples "middleware" do
8+
it "is add it's instrumentaion to the rack.after_reply" do
9+
stats = class_spy("Promenade::Raindrops::Stats").as_stubbed_const
10+
11+
after_reply = []
12+
described_class.new(app).call({ "rack.after_reply" => after_reply })
13+
after_reply.each(&:call)
14+
15+
expect(stats).to have_received(:instrument).with(listener_address: listener_address)
16+
end
1017
end
1118

12-
it "is add it's instrumentaion to the rack.after_reply" do
13-
stats = class_spy("Promenade::Raindrops::Stats").as_stubbed_const
19+
context "when Pitchfork is defined" do
20+
let(:pitchfork) { class_double("Pitchfork").as_stubbed_const }
21+
22+
before do
23+
allow(pitchfork).to receive(:listener_names).and_return([listener_address])
24+
end
25+
26+
it_behaves_like "middleware"
27+
end
28+
29+
context "when Unicorn is defined" do
30+
let(:unicorn) { class_double("Unicorn").as_stubbed_const }
31+
32+
before do
33+
allow(unicorn).to receive(:listener_names).and_return([listener_address])
34+
end
35+
36+
it_behaves_like "middleware"
37+
end
1438

15-
after_reply = []
16-
described_class.new(app).call({ "rack.after_reply" => after_reply })
17-
after_reply.each(&:call)
39+
context "when neither Pitchfork nor Unicorn is defined" do
40+
it "raises an error" do
41+
stats = class_spy("Promenade::Raindrops::Stats").as_stubbed_const
1842

19-
expect(stats).to have_received(:instrument).with(listener_address: listener_address)
43+
expect do
44+
after_reply = []
45+
described_class.new(app).call({ "rack.after_reply" => after_reply })
46+
after_reply.each(&:call)
47+
end.to raise_error "Promenade::Raindrops::Middleware expects either ::Pitchfork or ::Unicorn to be defined"
48+
end
2049
end
2150
end

0 commit comments

Comments
 (0)