class ScoutApm::ServerIntegrations::Puma
Attributes
Public Class Methods
Source
# File lib/scout_apm/server_integrations/puma.rb, line 6 def initialize(logger) @logger = logger end
Public Instance Methods
Source
# File lib/scout_apm/server_integrations/puma.rb, line 14 def forking? return false unless defined?(::Puma) options = ::Puma.cli_config.instance_variable_get(:@options) options[:preload_app] rescue false end
Source
# File lib/scout_apm/server_integrations/puma.rb, line 54 def install old = ::Puma.cli_config.options.user_options[:before_worker_boot] || [] new = Array(old) + [Proc.new do logger.info "Installing Puma worker loop." ScoutApm::Agent.instance.start_background_worker end] ::Puma.cli_config.options[:before_worker_boot] = new rescue logger.warn "Unable to install Puma worker loop: #{$!.message}" end
Puma::UserFileDefaultOptions exposes ‘options` based on three underlying hashes: user_options, file_options, and default_options. While getting an `options` key consults all three underlying hashes, setting an `options` key only sets the user_options hash:
def [](key) fetch(key) end def []=(key, value) user_options[key] = value end def fetch(key, default_value = nil) return user_options[key] if user_options.key?(key) return file_options[key] if file_options.key?(key) return default_options[key] if default_options.key?(key) default_value end
Because of this, we can’t read options, modify, and then re-set options, since doing so could cause duplication if ‘before_worker_boot` exists on the other two underlying hashes (file_options, default_options).
To get around this, we explicitly read from ‘user_options` only, and still set using `options[]=`, which Puma
allows for setting `user_options`.
Source
# File lib/scout_apm/server_integrations/puma.rb, line 22 def present? defined?(::Puma) && (File.basename($0) =~ /\Apuma/) end