class HireFire::Middleware

Public Class Methods

new(app) click to toggle source
# File lib/hirefire/middleware.rb, line 7
def initialize(app)
  @app = app
  @path_prefix = determine_path_prefix
end

Public Instance Methods

call(env) click to toggle source
# File lib/hirefire/middleware.rb, line 12
def call(env)
  process_request_queue_time(env)

  if matches_hirefire_path?(env) || matches_info_path?(env)
    return construct_info_response
  end

  @app.call(env)
end

Private Instance Methods

calculate_request_queue_time(timestamp) click to toggle source
# File lib/hirefire/middleware.rb, line 78
def calculate_request_queue_time(timestamp)
  [(Time.now.to_f * 1000).to_i - timestamp.to_i, 0].max
end
collect_request_queue_time(request_queue_time) click to toggle source
# File lib/hirefire/middleware.rb, line 66
def collect_request_queue_time(request_queue_time)
  HireFire
    .configuration
    .web
    .tap(&:start_dispatcher)
    .add_to_buffer(request_queue_time)
end
construct_info_response() click to toggle source
# File lib/hirefire/middleware.rb, line 36
def construct_info_response
  [
    200,
    {
      "Content-Type" => "application/json",
      "Cache-Control" => "must-revalidate, private, max-age=0",
      "HireFire-Resource" => "Ruby-#{HireFire::VERSION}"
    },
    [
      HireFire.configuration.workers.map do |worker|
        {name: worker.name, value: worker.value}
      end.to_json
    ]
  ]
end
determine_path_prefix() click to toggle source
# File lib/hirefire/middleware.rb, line 82
def determine_path_prefix
  if defined?(Rails) && Rails.application.config.relative_url_root
    Regexp.new("^" + Regexp.escape(Rails.application.config.relative_url_root))
  end
end
extract_path(env) click to toggle source
# File lib/hirefire/middleware.rb, line 32
def extract_path(env)
  @path_prefix ? env["PATH_INFO"].gsub(@path_prefix, "") : env["PATH_INFO"]
end
log_request_queue_time(request_queue_time) click to toggle source
# File lib/hirefire/middleware.rb, line 74
def log_request_queue_time(request_queue_time)
  puts "[hirefire:router] queue=#{request_queue_time}ms"
end
matches_hirefire_path?(env) click to toggle source
# File lib/hirefire/middleware.rb, line 24
def matches_hirefire_path?(env)
  ENV["HIREFIRE_TOKEN"] && extract_path(env) == "/hirefire" && ENV["HIREFIRE_TOKEN"] == env["HTTP_HIREFIRE_TOKEN"]
end
matches_info_path?(env) click to toggle source
# File lib/hirefire/middleware.rb, line 28
def matches_info_path?(env)
  ENV["HIREFIRE_TOKEN"] && extract_path(env) == "/hirefire/#{ENV["HIREFIRE_TOKEN"]}/info"
end
process_request_queue_time(env) click to toggle source
# File lib/hirefire/middleware.rb, line 52
def process_request_queue_time(env)
  request_start = env["HTTP_X_REQUEST_START"]

  if HireFire.configuration.web && ENV["HIREFIRE_TOKEN"] && request_start
    request_queue_time = calculate_request_queue_time(request_start)
    collect_request_queue_time(request_queue_time)
  end

  if HireFire.configuration.log_queue_metrics && request_start
    request_queue_time = calculate_request_queue_time(request_start)
    log_request_queue_time(request_queue_time)
  end
end