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
 |