lib/opbeans_shuffle.rb (32 lines of code) (raw):
require 'http'
class OpbeansShuffle
def initialize(app, test, services:, probability:)
@app = app
@test = Regexp.new(test)
@services = services.split(',')
@probability = Float(probability)
end
def call(env)
path = env['PATH_INFO']
if @test =~ path && rand < @probability && @services.any?
lucky_winner = @services.sample
Rails.logger.info "Proxying #{path} to #{lucky_winner}"
unless lucky_winner.start_with?('http://')
lucky_winner = "http://#{lucky_winner}:3000"
end
Timeout.timeout(15) do
resp = HTTP.get("#{lucky_winner}#{path}")
[
resp.status,
{ 'Content-Type' => resp.headers['Content-Type'] || 'text/plain' },
resp.body
]
end
else
@app.call(env)
end
rescue Timeout::Error
Rails.logger.error "Connection to #{lucky_winner} timed out after 15s"
raise
end
end