Class: Appsignal::Config

Inherits:
Object show all
Defined in:
lib/appsignal/config.rb

Constant Summary collapse

SYSTEM_TMP_DIR =
File.realpath('/tmp')
DEFAULT_CONFIG =
{
  :debug                          => false,
  :log                            => 'file',
  :ignore_errors                  => [],
  :ignore_actions                 => [],
  :filter_parameters              => [],
  :send_params                    => true,
  :endpoint                       => 'https://push.appsignal.com',
  :instrument_net_http            => true,
  :instrument_redis               => true,
  :instrument_sequel              => true,
  :skip_session_data              => false,
  :enable_frontend_error_catching => false,
  :frontend_error_catching_path   => '/appsignal_error_catcher',
  :enable_allocation_tracking     => true,
  :enable_gc_instrumentation      => false,
  :running_in_container           => false,
  :enable_host_metrics            => true,
  :enable_minutely_probes         => false,
  :hostname                       => ::Socket.gethostname,
  :ca_file_path                   => File.expand_path(File.join('../../../resources/cacert.pem'), __FILE__)
}.freeze
ENV_TO_KEY_MAPPING =
{
  'APPSIGNAL_ACTIVE'                         => :active,
  'APPSIGNAL_PUSH_API_KEY'                   => :push_api_key,
  'APPSIGNAL_APP_NAME'                       => :name,
  'APPSIGNAL_PUSH_API_ENDPOINT'              => :endpoint,
  'APPSIGNAL_FRONTEND_ERROR_CATCHING_PATH'   => :frontend_error_catching_path,
  'APPSIGNAL_DEBUG'                          => :debug,
  'APPSIGNAL_LOG'                            => :log,
  'APPSIGNAL_LOG_PATH'                       => :log_path,
  'APPSIGNAL_INSTRUMENT_NET_HTTP'            => :instrument_net_http,
  'APPSIGNAL_INSTRUMENT_REDIS'               => :instrument_redis,
  'APPSIGNAL_INSTRUMENT_SEQUEL'              => :instrument_sequel,
  'APPSIGNAL_SKIP_SESSION_DATA'              => :skip_session_data,
  'APPSIGNAL_ENABLE_FRONTEND_ERROR_CATCHING' => :enable_frontend_error_catching,
  'APPSIGNAL_IGNORE_ERRORS'                  => :ignore_errors,
  'APPSIGNAL_IGNORE_ACTIONS'                 => :ignore_actions,
  'APPSIGNAL_FILTER_PARAMETERS'              => :filter_parameters,
  'APPSIGNAL_SEND_PARAMS'                    => :send_params,
  'APPSIGNAL_HTTP_PROXY'                     => :http_proxy,
  'APPSIGNAL_ENABLE_ALLOCATION_TRACKING'     => :enable_allocation_tracking,
  'APPSIGNAL_ENABLE_GC_INSTRUMENTATION'      => :enable_gc_instrumentation,
  'APPSIGNAL_RUNNING_IN_CONTAINER'           => :running_in_container,
  'APPSIGNAL_WORKING_DIR_PATH'               => :working_dir_path,
  'APPSIGNAL_ENABLE_HOST_METRICS'            => :enable_host_metrics,
  'APPSIGNAL_ENABLE_MINUTELY_PROBES'         => :enable_minutely_probes,
  'APPSIGNAL_HOSTNAME'                       => :hostname,
  'APPSIGNAL_CA_FILE_PATH'                   => :ca_file_path
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(root_path, env, initial_config = {}, logger = Appsignal.logger) ⇒ Config

Returns a new instance of Config.



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/appsignal/config.rb', line 64

def initialize(root_path, env, initial_config={}, logger=Appsignal.logger)
  @root_path      = root_path
  @env            = ENV.fetch("APPSIGNAL_APP_ENV".freeze, env.to_s)
  @initial_config = initial_config
  @logger         = logger
  @valid          = false
  @config_hash    = Hash[DEFAULT_CONFIG]

  # Set config based on the system
  detect_from_system
  # Initial config
  merge(@config_hash, initial_config)
  # Load the config file if it exists
  load_from_disk
  # Load config from environment variables
  load_from_environment
  # Validate that we have a correct config
  validate
end

Instance Attribute Details

#config_hashObject (readonly)

Returns the value of attribute config_hash.



61
62
63
# File 'lib/appsignal/config.rb', line 61

def config_hash
  @config_hash
end

#envObject (readonly)

Returns the value of attribute env.



61
62
63
# File 'lib/appsignal/config.rb', line 61

def env
  @env
end

#initial_configObject (readonly)

Returns the value of attribute initial_config.



61
62
63
# File 'lib/appsignal/config.rb', line 61

def initial_config
  @initial_config
end

#loggerObject

Returns the value of attribute logger.



62
63
64
# File 'lib/appsignal/config.rb', line 62

def logger
  @logger
end

#root_pathObject (readonly)

Returns the value of attribute root_path.



61
62
63
# File 'lib/appsignal/config.rb', line 61

def root_path
  @root_path
end

Instance Method Details

#[](key) ⇒ Object



84
85
86
# File 'lib/appsignal/config.rb', line 84

def [](key)
  config_hash[key]
end

#[]=(key, value) ⇒ Object



88
89
90
# File 'lib/appsignal/config.rb', line 88

def []=(key, value)
  config_hash[key] = value
end

#active?Boolean

Returns:

  • (Boolean)


114
115
116
# File 'lib/appsignal/config.rb', line 114

def active?
  @valid && config_hash[:active]
end

#log_file_pathObject



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/appsignal/config.rb', line 92

def log_file_path
  path = config_hash[:log_path] || root_path && File.join(root_path, 'log')
  if path && File.writable?(path)
    return File.join(File.realpath(path), 'appsignal.log')
  end

  if File.writable? SYSTEM_TMP_DIR
    $stdout.puts "appsignal: Unable to log to '#{path}'. Logging to "\
      "'#{SYSTEM_TMP_DIR}' instead. Please check the "\
      "permissions for the application's (log) directory."
    File.join(SYSTEM_TMP_DIR, 'appsignal.log')
  else
    $stdout.puts "appsignal: Unable to log to '#{path}' or the "\
      "'#{SYSTEM_TMP_DIR}' fallback. Please check the permissions "\
      "for the application's (log) directory."
  end
end

#valid?Boolean

Returns:

  • (Boolean)


110
111
112
# File 'lib/appsignal/config.rb', line 110

def valid?
  @valid
end

#write_to_environmentObject



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/appsignal/config.rb', line 118

def write_to_environment
  ENV['APPSIGNAL_ACTIVE']                       = active?.to_s
  ENV['APPSIGNAL_APP_PATH']                     = root_path.to_s
  ENV['APPSIGNAL_AGENT_PATH']                   = File.expand_path('../../../ext', __FILE__).to_s
  ENV['APPSIGNAL_ENVIRONMENT']                  = env
  ENV['APPSIGNAL_AGENT_VERSION']                = Appsignal::Extension.agent_version
  ENV['APPSIGNAL_LANGUAGE_INTEGRATION_VERSION'] = "ruby-#{Appsignal::VERSION}"
  ENV['APPSIGNAL_DEBUG_LOGGING']                = config_hash[:debug].to_s
  ENV['APPSIGNAL_LOG_FILE_PATH']                = log_file_path.to_s if log_file_path
  ENV['APPSIGNAL_PUSH_API_ENDPOINT']            = config_hash[:endpoint]
  ENV['APPSIGNAL_PUSH_API_KEY']                 = config_hash[:push_api_key]
  ENV['APPSIGNAL_APP_NAME']                     = config_hash[:name]
  ENV['APPSIGNAL_HTTP_PROXY']                   = config_hash[:http_proxy]
  ENV['APPSIGNAL_IGNORE_ACTIONS']               = config_hash[:ignore_actions].join(',')
  ENV['APPSIGNAL_FILTER_PARAMETERS']            = config_hash[:filter_parameters].join(',')
  ENV['APPSIGNAL_SEND_PARAMS']                  = config_hash[:send_params].to_s
  ENV['APPSIGNAL_RUNNING_IN_CONTAINER']         = config_hash[:running_in_container].to_s
  ENV['APPSIGNAL_WORKING_DIR_PATH']             = config_hash[:working_dir_path] if config_hash[:working_dir_path]
  ENV['APPSIGNAL_ENABLE_HOST_METRICS']          = config_hash[:enable_host_metrics].to_s
  ENV['APPSIGNAL_ENABLE_MINUTELY_PROBES']       = config_hash[:enable_minutely_probes].to_s
  ENV['APPSIGNAL_HOSTNAME']                     = config_hash[:hostname].to_s
  ENV['APPSIGNAL_PROCESS_NAME']                 = $0
  ENV['APPSIGNAL_CA_FILE_PATH']                 = config_hash[:ca_file_path].to_s
end