summaryrefslogtreecommitdiff
path: root/lib/gitlab/query_limiting/middleware.rb
blob: 949ae79a04788a94a47ba65a28fc07285c981e6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 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