summaryrefslogtreecommitdiff
path: root/lib/gitlab/health_checks/unicorn_check.rb
blob: cdc6d2a751916ef72637dec17e3688e7a04a9456 (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
# frozen_string_literal: true

module Gitlab
  module HealthChecks
    # This check can only be run on Unicorn `master` process
    class UnicornCheck
      extend SimpleAbstractCheck

      class << self
        include Gitlab::Utils::StrongMemoize

        private

        def metric_prefix
          'unicorn_check'
        end

        def successful?(result)
          result > 0
        end

        def check
          return unless http_servers

          http_servers.sum(&:worker_processes) # rubocop: disable CodeReuse/ActiveRecord
        end

        # Traversal of ObjectSpace is expensive, on fully loaded application
        # it takes around 80ms. The instances of HttpServers are not a subject
        # to change so we can cache the list of servers.
        def http_servers
          strong_memoize(:http_servers) do
            next unless Gitlab::Runtime.unicorn?

            ObjectSpace.each_object(::Unicorn::HttpServer).to_a
          end
        end
      end
    end
  end
end