blob: 3f6361c727653d155476c163b9e2f30ca8130efd (
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
# frozen_string_literal: true
module Gitlab
# Provides routines to identify the current runtime as which the application
# executes, such as whether it is an application server and which one.
module Runtime
IdentificationError = Class.new(RuntimeError)
AmbiguousProcessError = Class.new(IdentificationError)
UnknownProcessError = Class.new(IdentificationError)
AVAILABLE_RUNTIMES = [
:console,
:geo_log_cursor,
:puma,
:rails_runner,
:rake,
:sidekiq,
:test_suite,
:unicorn
].freeze
class << self
def identify
matches = AVAILABLE_RUNTIMES.select { |runtime| public_send("#{runtime}?") } # rubocop:disable GitlabSecurity/PublicSend
if matches.one?
matches.first
elsif matches.none?
raise UnknownProcessError.new(
"Failed to identify runtime for process #{Process.pid} (#{$0})"
)
else
raise AmbiguousProcessError.new(
"Ambiguous runtime #{matches} for process #{Process.pid} (#{$0})"
)
end
end
def puma?
!!defined?(::Puma)
end
# For unicorn, we need to check for actual server instances to avoid false positives.
def unicorn?
!!(defined?(::Unicorn) && defined?(::Unicorn::HttpServer))
end
def sidekiq?
!!(defined?(::Sidekiq) && Sidekiq.server?)
end
def rake?
!!(defined?(::Rake) && Rake.application.top_level_tasks.any?)
end
def test_suite?
Rails.env.test?
end
def console?
!!defined?(::Rails::Console)
end
def geo_log_cursor?
!!defined?(::GeoLogCursorOptionParser)
end
def rails_runner?
!!defined?(::Rails::Command::RunnerCommand)
end
def web_server?
puma? || unicorn?
end
def multi_threaded?
puma? || sidekiq?
end
def max_threads
if puma?
Puma.cli_config.options[:max_threads]
elsif sidekiq?
Sidekiq.options[:concurrency]
else
1
end
end
end
end
end
|