summaryrefslogtreecommitdiff
path: root/lib/gitlab/health_checks/server.rb
blob: d747b64a2215db697900a5e1530f718f38231666 (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
56
57
58
59
60
61
62
# frozen_string_literal: true

require 'webrick'

module Gitlab
  module HealthChecks
    class Server < Daemon
      def initialize(address:, port:, **options)
        super(**options)

        @address = address
        @port = port
      end

      private

      def start_working
        @server = ::WEBrick::HTTPServer.new(
          Port: @port, BindAddress: @address, AccessLog: []
        )
        @server.mount '/', Rack::Handler::WEBrick, rack_app

        true
      end

      def run_thread
        @server&.start
      rescue IOError
        # ignore forcibily closed servers
      end

      def stop_working
        if @server
          # we close sockets if thread is not longer running
          # this happens, when the process forks
          if thread.alive?
            @server.shutdown
          else
            @server.listeners.each(&:close)
          end
        end

        @server = nil
      end

      def rack_app
        readiness = new_probe
        liveness = new_probe

        Rack::Builder.app do
          use Rack::Deflater
          use HealthChecks::Middleware, readiness, liveness
          run -> (env) { [404, {}, ['']] }
        end
      end

      def new_probe
        ::Gitlab::HealthChecks::Probes::Collection.new
      end
    end
  end
end