Commit 3a1ea22c authored by Matthias Käppler's avatar Matthias Käppler Committed by Michael Kozono

Introduce `Runtime` class to identify runtime proc

This will serve as the new single access point into
identifying which runtime is active.

Add Process.max_threads method

This will return the maximum concurrency for the given
runtime environment.

Revert to including `defined?` checks for Process

This is based on a reference impl by new relic which they
use to detect the current dispatcher.

Add `name` method, throw if ambiguous

This can be called from an initializer for instance.

Log the current runtime in an initializer

Add `multi_threaded?` and `app_server?` helpers

To allow easier grouping of configuration

Rename `Process` to `Runtime`

And move it into its own file.

Replace all remaining runtime checks with new API

Including a commit body because the danger bot politely asked me
to. There really is nothing else to say.

Prefer `class << self` over `instance_eval`

It seems to be the more widely adopted style.

Simplify `has_instances?` helper method

Fix rubocop offense

Remove max_threads method

This wasn't currently used anywhere and we should define this elsewhere.

Remove references to NR library

This caused some legal questions. We weren't using the instance lookup
before, so it should be OK.
parent fa78fdbf
...@@ -163,7 +163,7 @@ module Git ...@@ -163,7 +163,7 @@ module Git
end end
def logger def logger
if Sidekiq.server? if Gitlab::Runtime.sidekiq?
Sidekiq.logger Sidekiq.logger
else else
# This service runs in Sidekiq, so this shouldn't ever be # This service runs in Sidekiq, so this shouldn't ever be
......
...@@ -22,6 +22,7 @@ module Gitlab ...@@ -22,6 +22,7 @@ module Gitlab
require_dependency Rails.root.join('lib/gitlab/current_settings') require_dependency Rails.root.join('lib/gitlab/current_settings')
require_dependency Rails.root.join('lib/gitlab/middleware/read_only') require_dependency Rails.root.join('lib/gitlab/middleware/read_only')
require_dependency Rails.root.join('lib/gitlab/middleware/basic_health_check') require_dependency Rails.root.join('lib/gitlab/middleware/basic_health_check')
require_dependency Rails.root.join('lib/gitlab/runtime')
# Settings in config/environments/* take precedence over those specified here. # Settings in config/environments/* take precedence over those specified here.
# Application configuration should go into files in config/initializers # Application configuration should go into files in config/initializers
...@@ -255,7 +256,7 @@ module Gitlab ...@@ -255,7 +256,7 @@ module Gitlab
caching_config_hash[:compress] = false caching_config_hash[:compress] = false
caching_config_hash[:namespace] = Gitlab::Redis::Cache::CACHE_NAMESPACE caching_config_hash[:namespace] = Gitlab::Redis::Cache::CACHE_NAMESPACE
caching_config_hash[:expires_in] = 2.weeks # Cache should not grow forever caching_config_hash[:expires_in] = 2.weeks # Cache should not grow forever
if Sidekiq.server? || defined?(::Puma) # threaded context if Gitlab::Runtime.multi_threaded?
caching_config_hash[:pool_size] = Gitlab::Redis::Cache.pool_size caching_config_hash[:pool_size] = Gitlab::Redis::Cache.pool_size
caching_config_hash[:pool_timeout] = 1 caching_config_hash[:pool_timeout] = 1
end end
......
...@@ -46,7 +46,7 @@ Rails.application.configure do ...@@ -46,7 +46,7 @@ Rails.application.configure do
# Do not log asset requests # Do not log asset requests
config.assets.quiet = true config.assets.quiet = true
config.allow_concurrency = defined?(::Puma) config.allow_concurrency = Gitlab::Runtime.multi_threaded?
# BetterErrors live shell (REPL) on every stack frame # BetterErrors live shell (REPL) on every stack frame
BetterErrors::Middleware.allow_ip!("127.0.0.1/0") BetterErrors::Middleware.allow_ip!("127.0.0.1/0")
......
...@@ -75,5 +75,5 @@ Rails.application.configure do ...@@ -75,5 +75,5 @@ Rails.application.configure do
config.eager_load = true config.eager_load = true
config.allow_concurrency = defined?(::Puma) config.allow_concurrency = Gitlab::Runtime.multi_threaded?
end end
# frozen_string_literal: true
begin
Gitlab::AppLogger.info("Runtime: #{Gitlab::Runtime.name}")
rescue => e
message = <<-NOTICE
\n!! RUNTIME IDENTIFICATION FAILED: #{e}
Runtime based configuration settings may not work properly.
If you continue to see this error, please file an issue via
https://gitlab.com/gitlab-org/gitlab/issues/new
NOTICE
Gitlab::AppLogger.error(message)
end
...@@ -364,7 +364,7 @@ Gitlab.ee do ...@@ -364,7 +364,7 @@ Gitlab.ee do
# To ensure acceptable performance we only allow feature to be used with # To ensure acceptable performance we only allow feature to be used with
# multithreaded web-server Puma. This will be removed once download logic is moved # multithreaded web-server Puma. This will be removed once download logic is moved
# to GitLab workhorse # to GitLab workhorse
Settings.dependency_proxy['enabled'] = false unless defined?(::Puma) Settings.dependency_proxy['enabled'] = false unless Gitlab::Runtime.puma?
end end
# #
......
...@@ -4,11 +4,11 @@ require 'prometheus/client' ...@@ -4,11 +4,11 @@ require 'prometheus/client'
def prometheus_default_multiproc_dir def prometheus_default_multiproc_dir
return unless Rails.env.development? || Rails.env.test? return unless Rails.env.development? || Rails.env.test?
if Sidekiq.server? if Gitlab::Runtime.sidekiq?
Rails.root.join('tmp/prometheus_multiproc_dir/sidekiq') Rails.root.join('tmp/prometheus_multiproc_dir/sidekiq')
elsif defined?(Unicorn::Worker) elsif Gitlab::Runtime.unicorn?
Rails.root.join('tmp/prometheus_multiproc_dir/unicorn') Rails.root.join('tmp/prometheus_multiproc_dir/unicorn')
elsif defined?(::Puma) elsif Gitlab::Runtime.puma?
Rails.root.join('tmp/prometheus_multiproc_dir/puma') Rails.root.join('tmp/prometheus_multiproc_dir/puma')
else else
Rails.root.join('tmp/prometheus_multiproc_dir') Rails.root.join('tmp/prometheus_multiproc_dir')
...@@ -55,9 +55,9 @@ if !Rails.env.test? && Gitlab::Metrics.prometheus_metrics_enabled? ...@@ -55,9 +55,9 @@ if !Rails.env.test? && Gitlab::Metrics.prometheus_metrics_enabled?
Gitlab::Cluster::LifecycleEvents.on_master_start do Gitlab::Cluster::LifecycleEvents.on_master_start do
::Prometheus::Client.reinitialize_on_pid_change(force: true) ::Prometheus::Client.reinitialize_on_pid_change(force: true)
if defined?(::Unicorn) if Gitlab::Runtime.unicorn?
Gitlab::Metrics::Samplers::UnicornSampler.instance(Settings.monitoring.unicorn_sampler_interval).start Gitlab::Metrics::Samplers::UnicornSampler.instance(Settings.monitoring.unicorn_sampler_interval).start
elsif defined?(::Puma) elsif Gitlab::Runtime.puma?
Gitlab::Metrics::Samplers::PumaSampler.instance(Settings.monitoring.puma_sampler_interval).start Gitlab::Metrics::Samplers::PumaSampler.instance(Settings.monitoring.puma_sampler_interval).start
end end
...@@ -65,7 +65,7 @@ if !Rails.env.test? && Gitlab::Metrics.prometheus_metrics_enabled? ...@@ -65,7 +65,7 @@ if !Rails.env.test? && Gitlab::Metrics.prometheus_metrics_enabled?
end end
end end
if defined?(::Unicorn) || defined?(::Puma) if Gitlab::Runtime.app_server?
Gitlab::Cluster::LifecycleEvents.on_master_start do Gitlab::Cluster::LifecycleEvents.on_master_start do
Gitlab::Metrics::Exporter::WebExporter.instance.start Gitlab::Metrics::Exporter::WebExporter.instance.start
end end
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# Don't handle sidekiq configuration as it # Don't handle sidekiq configuration as it
# has its own special active record configuration here # has its own special active record configuration here
if defined?(ActiveRecord::Base) && !Sidekiq.server? if defined?(ActiveRecord::Base) && !Gitlab::Runtime.sidekiq?
Gitlab::Cluster::LifecycleEvents.on_worker_start do Gitlab::Cluster::LifecycleEvents.on_worker_start do
ActiveSupport.on_load(:active_record) do ActiveSupport.on_load(:active_record) do
ActiveRecord::Base.establish_connection ActiveRecord::Base.establish_connection
......
...@@ -5,10 +5,8 @@ ...@@ -5,10 +5,8 @@
# #
# Follow-up the issue: https://gitlab.com/gitlab-org/gitlab/issues/34107 # Follow-up the issue: https://gitlab.com/gitlab-org/gitlab/issues/34107
if defined?(::Puma) if Gitlab::Runtime.puma?
Puma::Cluster.prepend(::Gitlab::Cluster::Mixins::PumaCluster) Puma::Cluster.prepend(::Gitlab::Cluster::Mixins::PumaCluster)
end elsif Gitlab::Runtime.unicorn?
if defined?(::Unicorn::HttpServer)
Unicorn::HttpServer.prepend(::Gitlab::Cluster::Mixins::UnicornHttpServer) Unicorn::HttpServer.prepend(::Gitlab::Cluster::Mixins::UnicornHttpServer)
end end
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# when running on puma, scale connection pool size with the number # when running on puma, scale connection pool size with the number
# of threads per worker process # of threads per worker process
if defined?(::Puma) if Gitlab::Runtime.puma?
db_config = Gitlab::Database.config || db_config = Gitlab::Database.config ||
Rails.application.config.database_configuration[Rails.env] Rails.application.config.database_configuration[Rails.env]
puma_options = Puma.cli_config.options puma_options = Puma.cli_config.options
......
# Only use Lograge for Rails # Only use Lograge for Rails
unless Sidekiq.server? unless Gitlab::Runtime.sidekiq?
filename = File.join(Rails.root, 'log', "#{Rails.env}_json.log") filename = File.join(Rails.root, 'log', "#{Rails.env}_json.log")
Rails.application.configure do Rails.application.configure do
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
# and it's used only as the last resort. In such case this termination is # and it's used only as the last resort. In such case this termination is
# logged and we should fix the potential timeout issue in the code itself. # logged and we should fix the potential timeout issue in the code itself.
if defined?(::Puma) && !Rails.env.test? if Gitlab::Runtime.puma? && !Rails.env.test?
require 'rack/timeout/base' require 'rack/timeout/base'
Gitlab::Application.configure do |config| Gitlab::Application.configure do |config|
......
...@@ -13,7 +13,7 @@ if Labkit::Tracing.enabled? ...@@ -13,7 +13,7 @@ if Labkit::Tracing.enabled?
end end
# Instrument Sidekiq server calls when running Sidekiq server # Instrument Sidekiq server calls when running Sidekiq server
if Sidekiq.server? if Gitlab::Runtime.sidekiq?
Sidekiq.configure_server do |config| Sidekiq.configure_server do |config|
config.server_middleware do |chain| config.server_middleware do |chain|
chain.add Labkit::Tracing::Sidekiq::ServerMiddleware chain.add Labkit::Tracing::Sidekiq::ServerMiddleware
......
# frozen_string_literal: true # frozen_string_literal: true
if defined?(::Puma) && ::Puma.cli_config.options[:workers].to_i.zero? if Gitlab::Runtime.puma? && ::Puma.cli_config.options[:workers].to_i.zero?
raise 'Puma is only supported in Cluster-mode: workers > 0' raise 'Puma is only supported in Cluster-mode: workers > 0'
end end
...@@ -73,7 +73,7 @@ module Gitlab ...@@ -73,7 +73,7 @@ module Gitlab
# Returns true if load balancing is to be enabled. # Returns true if load balancing is to be enabled.
def self.enable? def self.enable?
return false unless ::License.feature_available?(:db_load_balancing) return false unless ::License.feature_available?(:db_load_balancing)
return false if program_name == 'rake' || Sidekiq.server? return false if program_name == 'rake' || Gitlab::Runtime.sidekiq?
hosts.any? || service_discovery_enabled? hosts.any? || service_discovery_enabled?
end end
......
...@@ -109,7 +109,7 @@ describe Gitlab::Database::LoadBalancing do ...@@ -109,7 +109,7 @@ describe Gitlab::Database::LoadBalancing do
it 'returns false when Sidekiq is being used' do it 'returns false when Sidekiq is being used' do
allow(described_class).to receive(:hosts).and_return(%w(foo)) allow(described_class).to receive(:hosts).and_return(%w(foo))
allow(Sidekiq).to receive(:server?).and_return(true) allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
expect(described_class.enable?).to eq(false) expect(described_class.enable?).to eq(false)
end end
...@@ -122,14 +122,14 @@ describe Gitlab::Database::LoadBalancing do ...@@ -122,14 +122,14 @@ describe Gitlab::Database::LoadBalancing do
it 'returns true when load balancing should be enabled' do it 'returns true when load balancing should be enabled' do
allow(described_class).to receive(:hosts).and_return(%w(foo)) allow(described_class).to receive(:hosts).and_return(%w(foo))
allow(Sidekiq).to receive(:server?).and_return(false) allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
expect(described_class.enable?).to eq(true) expect(described_class.enable?).to eq(true)
end end
it 'returns true when service discovery is enabled' do it 'returns true when service discovery is enabled' do
allow(described_class).to receive(:hosts).and_return([]) allow(described_class).to receive(:hosts).and_return([])
allow(Sidekiq).to receive(:server?).and_return(false) allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
allow(described_class) allow(described_class)
.to receive(:service_discovery_enabled?) .to receive(:service_discovery_enabled?)
...@@ -161,7 +161,7 @@ describe Gitlab::Database::LoadBalancing do ...@@ -161,7 +161,7 @@ describe Gitlab::Database::LoadBalancing do
it 'is enabled' do it 'is enabled' do
allow(described_class).to receive(:hosts).and_return(%w(foo)) allow(described_class).to receive(:hosts).and_return(%w(foo))
allow(Sidekiq).to receive(:server?).and_return(false) allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
expect(described_class.enable?).to eq(true) expect(described_class.enable?).to eq(true)
end end
......
...@@ -100,8 +100,8 @@ module Gitlab ...@@ -100,8 +100,8 @@ module Gitlab
end end
def self.process_name def self.process_name
return 'sidekiq' if Sidekiq.server? return 'sidekiq' if Gitlab::Runtime.sidekiq?
return 'console' if defined?(Rails::Console) return 'console' if Gitlab::Runtime.console?
return 'test' if Rails.env.test? return 'test' if Rails.env.test?
'web' 'web'
......
...@@ -149,10 +149,10 @@ module Gitlab ...@@ -149,10 +149,10 @@ module Gitlab
def in_clustered_environment? def in_clustered_environment?
# Sidekiq doesn't fork # Sidekiq doesn't fork
return false if Sidekiq.server? return false if Gitlab::Runtime.sidekiq?
# Unicorn always forks # Unicorn always forks
return true if defined?(::Unicorn) return true if Gitlab::Runtime.unicorn?
# Puma sometimes forks # Puma sometimes forks
return true if in_clustered_puma? return true if in_clustered_puma?
...@@ -162,7 +162,7 @@ module Gitlab ...@@ -162,7 +162,7 @@ module Gitlab
end end
def in_clustered_puma? def in_clustered_puma?
return false unless defined?(::Puma) return false unless Gitlab::Runtime.puma?
@puma_options && @puma_options[:workers] && @puma_options[:workers] > 0 @puma_options && @puma_options[:workers] && @puma_options[:workers] > 0
end end
......
...@@ -29,7 +29,7 @@ module Gitlab ...@@ -29,7 +29,7 @@ module Gitlab
PEM_REGEX = /\-+BEGIN CERTIFICATE\-+.+?\-+END CERTIFICATE\-+/m.freeze PEM_REGEX = /\-+BEGIN CERTIFICATE\-+.+?\-+END CERTIFICATE\-+/m.freeze
SERVER_VERSION_FILE = 'GITALY_SERVER_VERSION' SERVER_VERSION_FILE = 'GITALY_SERVER_VERSION'
MAXIMUM_GITALY_CALLS = 30 MAXIMUM_GITALY_CALLS = 30
CLIENT_NAME = (Sidekiq.server? ? 'gitlab-sidekiq' : 'gitlab-web').freeze CLIENT_NAME = (Gitlab::Runtime.sidekiq? ? 'gitlab-sidekiq' : 'gitlab-web').freeze
GITALY_METADATA_FILENAME = '.gitaly-metadata' GITALY_METADATA_FILENAME = '.gitaly-metadata'
MUTEX = Mutex.new MUTEX = Mutex.new
...@@ -383,17 +383,13 @@ module Gitlab ...@@ -383,17 +383,13 @@ module Gitlab
end end
def self.long_timeout def self.long_timeout
if web_app_server? if Gitlab::Runtime.app_server?
default_timeout default_timeout
else else
6.hours 6.hours
end end
end end
def self.web_app_server?
defined?(::Unicorn) || defined?(::Puma)
end
def self.storage_metadata_file_path(storage) def self.storage_metadata_file_path(storage)
Gitlab::GitalyClient::StorageSettings.allow_disk_access do Gitlab::GitalyClient::StorageSettings.allow_disk_access do
File.join( File.join(
......
...@@ -135,7 +135,7 @@ module Gitlab ...@@ -135,7 +135,7 @@ module Gitlab
end end
def cleanup_time def cleanup_time
Sidekiq.server? ? BG_CLEANUP_RUNTIME_S : FG_CLEANUP_RUNTIME_S Gitlab::Runtime.sidekiq? ? BG_CLEANUP_RUNTIME_S : FG_CLEANUP_RUNTIME_S
end end
def tmp_keychains_created def tmp_keychains_created
......
...@@ -18,7 +18,7 @@ module Gitlab ...@@ -18,7 +18,7 @@ module Gitlab
end end
def check def check
return unless defined?(::Puma) return unless Gitlab::Runtime.puma?
stats = Puma.stats stats = Puma.stats
stats = JSON.parse(stats) stats = JSON.parse(stats)
......
...@@ -30,7 +30,7 @@ module Gitlab ...@@ -30,7 +30,7 @@ module Gitlab
# to change so we can cache the list of servers. # to change so we can cache the list of servers.
def http_servers def http_servers
strong_memoize(:http_servers) do strong_memoize(:http_servers) do
next unless defined?(::Unicorn::HttpServer) next unless Gitlab::Runtime.unicorn?
ObjectSpace.each_object(::Unicorn::HttpServer).to_a ObjectSpace.each_object(::Unicorn::HttpServer).to_a
end end
......
...@@ -68,7 +68,7 @@ module Gitlab ...@@ -68,7 +68,7 @@ module Gitlab
end end
def timeout_time def timeout_time
Sidekiq.server? ? TIMEOUT_BACKGROUND : TIMEOUT_FOREGROUND Gitlab::Runtime.sidekiq? ? TIMEOUT_BACKGROUND : TIMEOUT_FOREGROUND
end end
def link_dependencies(text, highlighted_text) def link_dependencies(text, highlighted_text)
......
...@@ -150,7 +150,7 @@ module Gitlab ...@@ -150,7 +150,7 @@ module Gitlab
# Returns the prefix to use for the name of a series. # Returns the prefix to use for the name of a series.
def series_prefix def series_prefix
@series_prefix ||= Sidekiq.server? ? 'sidekiq_' : 'rails_' @series_prefix ||= Gitlab::Runtime.sidekiq? ? 'sidekiq_' : 'rails_'
end end
# Allow access from other metrics related middlewares # Allow access from other metrics related middlewares
......
...@@ -39,14 +39,10 @@ module Gitlab ...@@ -39,14 +39,10 @@ module Gitlab
end end
def add_metric(series, values, tags = {}) def add_metric(series, values, tags = {})
prefix = sidekiq? ? 'sidekiq_' : 'rails_' prefix = Gitlab::Runtime.sidekiq? ? 'sidekiq_' : 'rails_'
@metrics << Metric.new("#{prefix}#{series}", values, tags) @metrics << Metric.new("#{prefix}#{series}", values, tags)
end end
def sidekiq?
Sidekiq.server?
end
end end
end end
end end
......
...@@ -61,7 +61,7 @@ module Gitlab ...@@ -61,7 +61,7 @@ module Gitlab
# it takes around 80ms. The instances of HttpServers are not a subject # it takes around 80ms. The instances of HttpServers are not a subject
# to change so we can cache the list of servers. # to change so we can cache the list of servers.
def http_servers def http_servers
return [] unless defined?(::Unicorn::HttpServer) return [] unless Gitlab::Runtime.unicorn?
@http_servers ||= ObjectSpace.each_object(::Unicorn::HttpServer).to_a @http_servers ||= ObjectSpace.each_object(::Unicorn::HttpServer).to_a
end end
......
...@@ -22,10 +22,10 @@ module Gitlab ...@@ -22,10 +22,10 @@ module Gitlab
def pool_size def pool_size
# heuristic constant 5 should be a config setting somewhere -- related to CPU count? # heuristic constant 5 should be a config setting somewhere -- related to CPU count?
size = 5 size = 5
if Sidekiq.server? if Gitlab::Runtime.sidekiq?
# the pool will be used in a multi-threaded context # the pool will be used in a multi-threaded context
size += Sidekiq.options[:concurrency] size += Sidekiq.options[:concurrency]
elsif defined?(::Puma) elsif Gitlab::Runtime.puma?
size += Puma.cli_config.options[:max_threads] size += Puma.cli_config.options[:max_threads]
end end
......
# 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
class << self
def name
matches = []
matches << :puma if puma?
matches << :unicorn if unicorn?
matches << :console if console?
matches << :sidekiq if sidekiq?
raise "Ambiguous process match: #{matches}" if matches.size > 1
matches.first || :unknown
end
def puma?
!!(defined?(::Puma) && bin == '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? && bin == 'sidekiq')
end
def console?
!!defined?(::Rails::Console)
end
def app_server?
puma? || unicorn?
end
def multi_threaded?
puma? || sidekiq?
end
private
# Some example values from my system:
# puma: /data/cache/bundle-2.5/bin/puma
# unicorn: unicorn_rails master -E development -c /tmp/unicorn.rb -l 0.0.0.0:8080
# sidekiq: /data/cache/bundle-2.5/bin/sidekiq
# thin: bin/rails
# console: bin/rails
def script_name
$0
end
def bin
File.basename(script_name)
end
end
end
end
...@@ -5,11 +5,11 @@ module Prometheus ...@@ -5,11 +5,11 @@ module Prometheus
extend self extend self
def worker_id def worker_id
if Sidekiq.server? if Gitlab::Runtime.sidekiq?
sidekiq_worker_id sidekiq_worker_id
elsif defined?(Unicorn::Worker) elsif Gitlab::Runtime.unicorn?
unicorn_worker_id unicorn_worker_id
elsif defined?(::Puma) elsif Gitlab::Runtime.puma?
puma_worker_id puma_worker_id
else else
unknown_process_id unknown_process_id
......
...@@ -16,6 +16,7 @@ describe 'Database config initializer' do ...@@ -16,6 +16,7 @@ describe 'Database config initializer' do
let(:puma_options) { { max_threads: 8 } } let(:puma_options) { { max_threads: 8 } }
before do before do
allow(Gitlab::Runtime).to receive(:puma?).and_return(true)
stub_const("Puma", puma) stub_const("Puma", puma)
allow(puma).to receive_message_chain(:cli_config, :options).and_return(puma_options) allow(puma).to receive_message_chain(:cli_config, :options).and_return(puma_options)
end end
......
...@@ -26,7 +26,7 @@ describe Gitlab::GitalyClient do ...@@ -26,7 +26,7 @@ describe Gitlab::GitalyClient do
context 'running in Unicorn' do context 'running in Unicorn' do
before do before do
stub_const('Unicorn', 1) allow(Gitlab::Runtime).to receive(:unicorn?).and_return(true)
end end
it { expect(subject.long_timeout).to eq(55) } it { expect(subject.long_timeout).to eq(55) }
...@@ -34,7 +34,7 @@ describe Gitlab::GitalyClient do ...@@ -34,7 +34,7 @@ describe Gitlab::GitalyClient do
context 'running in Puma' do context 'running in Puma' do
before do before do
stub_const('Puma', 1) allow(Gitlab::Runtime).to receive(:puma?).and_return(true)
end end
it { expect(subject.long_timeout).to eq(55) } it { expect(subject.long_timeout).to eq(55) }
......
...@@ -236,7 +236,7 @@ describe Gitlab::Gpg do ...@@ -236,7 +236,7 @@ describe Gitlab::Gpg do
context 'when running in Sidekiq' do context 'when running in Sidekiq' do
before do before do
allow(Sidekiq).to receive(:server?).and_return(true) allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
end end
it_behaves_like 'multiple deletion attempts of the tmp-dir', described_class::BG_CLEANUP_RUNTIME_S it_behaves_like 'multiple deletion attempts of the tmp-dir', described_class::BG_CLEANUP_RUNTIME_S
......
...@@ -22,6 +22,7 @@ describe Gitlab::HealthChecks::PumaCheck do ...@@ -22,6 +22,7 @@ describe Gitlab::HealthChecks::PumaCheck do
context 'when Puma is not loaded' do context 'when Puma is not loaded' do
before do before do
allow(Gitlab::Runtime).to receive(:puma?).and_return(false)
hide_const('Puma') hide_const('Puma')
end end
...@@ -33,6 +34,7 @@ describe Gitlab::HealthChecks::PumaCheck do ...@@ -33,6 +34,7 @@ describe Gitlab::HealthChecks::PumaCheck do
context 'when Puma is loaded' do context 'when Puma is loaded' do
before do before do
allow(Gitlab::Runtime).to receive(:puma?).and_return(true)
stub_const('Puma', Module.new) stub_const('Puma', Module.new)
end end
......
...@@ -26,6 +26,7 @@ describe Gitlab::HealthChecks::UnicornCheck do ...@@ -26,6 +26,7 @@ describe Gitlab::HealthChecks::UnicornCheck do
context 'when Unicorn is not loaded' do context 'when Unicorn is not loaded' do
before do before do
allow(Gitlab::Runtime).to receive(:unicorn?).and_return(false)
hide_const('Unicorn') hide_const('Unicorn')
end end
...@@ -39,6 +40,7 @@ describe Gitlab::HealthChecks::UnicornCheck do ...@@ -39,6 +40,7 @@ describe Gitlab::HealthChecks::UnicornCheck do
let(:http_server_class) { Struct.new(:worker_processes) } let(:http_server_class) { Struct.new(:worker_processes) }
before do before do
allow(Gitlab::Runtime).to receive(:unicorn?).and_return(true)
stub_const('Unicorn::HttpServer', http_server_class) stub_const('Unicorn::HttpServer', http_server_class)
end end
......
...@@ -111,7 +111,7 @@ describe Gitlab::Highlight do ...@@ -111,7 +111,7 @@ describe Gitlab::Highlight do
end end
it 'utilizes longer timeout for sidekiq' do it 'utilizes longer timeout for sidekiq' do
allow(Sidekiq).to receive(:server?).and_return(true) allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
expect(Timeout).to receive(:timeout).with(described_class::TIMEOUT_BACKGROUND).and_call_original expect(Timeout).to receive(:timeout).with(described_class::TIMEOUT_BACKGROUND).and_call_original
subject.highlight("Content") subject.highlight("Content")
......
...@@ -63,7 +63,7 @@ describe Gitlab::Metrics::Samplers::InfluxSampler do ...@@ -63,7 +63,7 @@ describe Gitlab::Metrics::Samplers::InfluxSampler do
describe '#add_metric' do describe '#add_metric' do
it 'prefixes the series name for a Rails process' do it 'prefixes the series name for a Rails process' do
expect(sampler).to receive(:sidekiq?).and_return(false) expect(Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
expect(Gitlab::Metrics::Metric).to receive(:new) expect(Gitlab::Metrics::Metric).to receive(:new)
.with('rails_cats', { value: 10 }, {}) .with('rails_cats', { value: 10 }, {})
...@@ -73,7 +73,7 @@ describe Gitlab::Metrics::Samplers::InfluxSampler do ...@@ -73,7 +73,7 @@ describe Gitlab::Metrics::Samplers::InfluxSampler do
end end
it 'prefixes the series name for a Sidekiq process' do it 'prefixes the series name for a Sidekiq process' do
expect(sampler).to receive(:sidekiq?).and_return(true) expect(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
expect(Gitlab::Metrics::Metric).to receive(:new) expect(Gitlab::Metrics::Metric).to receive(:new)
.with('sidekiq_cats', { value: 10 }, {}) .with('sidekiq_cats', { value: 10 }, {})
......
# frozen_string_literal: true
require 'spec_helper'
describe Gitlab::Runtime do
REAL_PATH = $0
after(:all) do
$0 = REAL_PATH
end
context "when unknown" do
it "identifies as :unknown" do
expect(subject.name).to eq(:unknown)
end
end
context "on multiple matches" do
before do
$0 = '/data/cache/bundle-2.5/bin/puma'
stub_const('::Puma', double)
stub_const('::Rails::Console', double)
end
it "raises an exception when trying to identify" do
expect { subject.name }.to raise_error(RuntimeError, "Ambiguous process match: [:puma, :console]")
end
end
context "puma" do
let(:puma_type) { double('::Puma') }
before do
$0 = '/data/cache/bundle-2.5/bin/puma'
stub_const('::Puma', puma_type)
end
it "identifies itself" do
expect(subject.name).to eq(:puma)
expect(subject.puma?).to be(true)
end
it "does not identify as others" do
expect(subject.unicorn?).to be(false)
expect(subject.sidekiq?).to be(false)
expect(subject.console?).to be(false)
end
end
context "unicorn" do
let(:unicorn_type) { Module.new }
let(:unicorn_server_type) { Class.new }
before do
$0 = 'unicorn_rails master -E development -c /tmp/unicorn.rb -l 0.0.0.0:8080'
stub_const('::Unicorn', unicorn_type)
stub_const('::Unicorn::HttpServer', unicorn_server_type)
end
it "identifies itself" do
expect(subject.name).to eq(:unicorn)
expect(subject.unicorn?).to be(true)
end
it "does not identify as others" do
expect(subject.puma?).to be(false)
expect(subject.sidekiq?).to be(false)
expect(subject.console?).to be(false)
end
end
context "sidekiq" do
let(:sidekiq_type) { double('::Sidekiq') }
before do
$0 = '/data/cache/bundle-2.5/bin/sidekiq'
stub_const('::Sidekiq', sidekiq_type)
allow(sidekiq_type).to receive(:server?).and_return(true)
end
it "identifies itself" do
expect(subject.name).to eq(:sidekiq)
expect(subject.sidekiq?).to be(true)
end
it "does not identify as others" do
expect(subject.unicorn?).to be(false)
expect(subject.puma?).to be(false)
expect(subject.console?).to be(false)
end
end
context "console" do
let(:console_type) { double('::Rails::Console') }
before do
$0 = 'bin/rails'
stub_const('::Rails::Console', console_type)
end
it "identifies itself" do
expect(subject.name).to eq(:console)
expect(subject.console?).to be(true)
end
it "does not identify as others" do
expect(subject.unicorn?).to be(false)
expect(subject.sidekiq?).to be(false)
expect(subject.puma?).to be(false)
end
end
end
...@@ -6,16 +6,13 @@ describe Prometheus::PidProvider do ...@@ -6,16 +6,13 @@ describe Prometheus::PidProvider do
describe '.worker_id' do describe '.worker_id' do
subject { described_class.worker_id } subject { described_class.worker_id }
let(:sidekiq_module) { Module.new }
before do before do
allow(sidekiq_module).to receive(:server?).and_return(false) allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
stub_const('Sidekiq', sidekiq_module)
end end
context 'when running in Sidekiq server mode' do context 'when running in Sidekiq server mode' do
before do before do
expect(Sidekiq).to receive(:server?).and_return(true) allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
end end
context 'in a clustered setup' do context 'in a clustered setup' do
...@@ -33,8 +30,7 @@ describe Prometheus::PidProvider do ...@@ -33,8 +30,7 @@ describe Prometheus::PidProvider do
context 'when running in Unicorn mode' do context 'when running in Unicorn mode' do
before do before do
stub_const('Unicorn::Worker', Class.new) allow(Gitlab::Runtime).to receive(:unicorn?).and_return(true)
hide_const('Puma')
expect(described_class).to receive(:process_name) expect(described_class).to receive(:process_name)
.at_least(:once) .at_least(:once)
...@@ -94,8 +90,7 @@ describe Prometheus::PidProvider do ...@@ -94,8 +90,7 @@ describe Prometheus::PidProvider do
context 'when running in Puma mode' do context 'when running in Puma mode' do
before do before do
stub_const('Puma', Module.new) allow(Gitlab::Runtime).to receive(:puma?).and_return(true)
hide_const('Unicorn::Worker')
expect(described_class).to receive(:process_name) expect(described_class).to receive(:process_name)
.at_least(:once) .at_least(:once)
...@@ -116,11 +111,6 @@ describe Prometheus::PidProvider do ...@@ -116,11 +111,6 @@ describe Prometheus::PidProvider do
end end
context 'when running in unknown mode' do context 'when running in unknown mode' do
before do
hide_const('Puma')
hide_const('Unicorn::Worker')
end
it { is_expected.to eq "process_#{Process.pid}" } it { is_expected.to eq "process_#{Process.pid}" }
end end
end end
......
...@@ -108,7 +108,7 @@ describe Git::BranchPushService, services: true do ...@@ -108,7 +108,7 @@ describe Git::BranchPushService, services: true do
end end
it 'reports an error' do it 'reports an error' do
allow(Sidekiq).to receive(:server?).and_return(true) allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
expect(Sidekiq.logger).to receive(:warn) expect(Sidekiq.logger).to receive(:warn)
expect { subject }.not_to change { Ci::Pipeline.count } expect { subject }.not_to change { Ci::Pipeline.count }
......
...@@ -118,7 +118,7 @@ RSpec.shared_examples "redis_shared_examples" do ...@@ -118,7 +118,7 @@ RSpec.shared_examples "redis_shared_examples" do
context 'when running not on sidekiq workers' do context 'when running not on sidekiq workers' do
before do before do
allow(Sidekiq).to receive(:server?).and_return(false) allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(false)
end end
it 'instantiates a connection pool with size 5' do it 'instantiates a connection pool with size 5' do
...@@ -130,7 +130,7 @@ RSpec.shared_examples "redis_shared_examples" do ...@@ -130,7 +130,7 @@ RSpec.shared_examples "redis_shared_examples" do
context 'when running on sidekiq workers' do context 'when running on sidekiq workers' do
before do before do
allow(Sidekiq).to receive(:server?).and_return(true) allow(Gitlab::Runtime).to receive(:sidekiq?).and_return(true)
allow(Sidekiq).to receive(:options).and_return({ concurrency: 18 }) allow(Sidekiq).to receive(:options).and_return({ concurrency: 18 })
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment