56 lines
1.2 KiB
Ruby
56 lines
1.2 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Gitlab
|
||
|
module QueryLimiting
|
||
|
# Middleware for reporting (or raising) when a request performs more than a
|
||
|
# certain amount of database queries.
|
||
|
class Middleware
|
||
|
CONTROLLER_KEY = 'action_controller.instance'.freeze
|
||
|
ENDPOINT_KEY = 'api.endpoint'.freeze
|
||
|
|
||
|
def initialize(app)
|
||
|
@app = app
|
||
|
end
|
||
|
|
||
|
def call(env)
|
||
|
transaction, retval = Transaction.run do
|
||
|
@app.call(env)
|
||
|
end
|
||
|
|
||
|
transaction.action = action_name(env)
|
||
|
transaction.act_upon_results
|
||
|
|
||
|
retval
|
||
|
end
|
||
|
|
||
|
def action_name(env)
|
||
|
if env[CONTROLLER_KEY]
|
||
|
action_for_rails(env)
|
||
|
elsif env[ENDPOINT_KEY]
|
||
|
action_for_grape(env)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def action_for_rails(env)
|
||
|
controller = env[CONTROLLER_KEY]
|
||
|
action = "#{controller.class.name}##{controller.action_name}"
|
||
|
|
||
|
if controller.content_type == 'text/html'
|
||
|
action
|
||
|
else
|
||
|
"#{action} (#{controller.content_type})"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def action_for_grape(env)
|
||
|
endpoint = env[ENDPOINT_KEY]
|
||
|
route = endpoint.route rescue nil
|
||
|
|
||
|
"#{route.request_method} #{route.path}" if route
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|