Class: NewRelic::Agent::Configuration::EnvironmentSource

Inherits:
DottedHash
  • Object
show all
Defined in:
lib/new_relic/agent/configuration/environment_source.rb

Constant Summary collapse

SUPPORTED_PREFIXES =
/^new_relic_|^newrelic_/i
SPECIAL_CASE_KEYS =
[
  'NEW_RELIC_ENV', # read by NewRelic::Control::Frameworks::Ruby
  'NEW_RELIC_LOG', # read by set_log_file
  /^NEW_RELIC_METADATA_/ # read by NewRelic::Agent::Connect::RequestBuilder
]

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from DottedHash

#inspect, symbolize, #to_hash

Constructor Details

#initializeEnvironmentSource

Returns a new instance of EnvironmentSource.



18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 18

def initialize
  set_log_file
  set_config_file

  @alias_map = {}
  @type_map = {}

  DEFAULTS.each do |config_setting, value|
    self.type_map[config_setting] = value[:type]
    set_aliases(config_setting, value)
  end

  set_values_from_new_relic_environment_variables
end

Instance Attribute Details

#alias_mapObject



16
17
18
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 16

def alias_map
  @alias_map
end

#type_mapObject



16
17
18
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 16

def type_map
  @type_map
end

Instance Method Details

#collect_new_relic_environment_variable_keysObject



114
115
116
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 114

def collect_new_relic_environment_variable_keys
  ENV.keys.select { |key| key.match(SUPPORTED_PREFIXES) }
end

#convert_environment_key_to_config_key(key) ⇒ Object



109
110
111
112
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 109

def convert_environment_key_to_config_key(key)
  stripped_key = key.gsub(SUPPORTED_PREFIXES, '').downcase.to_sym
  self.alias_map[stripped_key] || stripped_key
end

#serverless?Boolean

we can’t rely on the :‘serverless_mode.enabled’ config parameter being set yet to signify serverless mode given that we’re in the midst of building the config but we can always rely on the env var being set by the Lambda layer

Returns:



122
123
124
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 122

def serverless?
  NewRelic::Agent::ServerlessHandler.env_var_set?
end

#set_aliases(config_setting, value) ⇒ Object



33
34
35
36
37
38
39
40
41
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 33

def set_aliases(config_setting, value)
  set_dotted_alias(config_setting)

  return unless value[:aliases]

  value[:aliases].each do |config_alias|
    self.alias_map[config_alias] = config_setting
  end
end

#set_config_fileObject



63
64
65
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 63

def set_config_file
  self[:config_path] = ENV['NRCONFIG'] if ENV['NRCONFIG']
end

#set_dotted_alias(original_config_setting) ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 43

def set_dotted_alias(original_config_setting)
  config_setting = original_config_setting.to_s

  if config_setting.include?('.')
    config_alias = config_setting.tr('.', '_').to_sym
    self.alias_map[config_alias] = original_config_setting
  end
end

#set_key_by_type(config_key, environment_key) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 82

def set_key_by_type(config_key, environment_key)
  value = ENV[environment_key]
  type = self.type_map[config_key]

  if type == String
    self[config_key] = value
  elsif type == Integer
    self[config_key] = value.to_i
  elsif type == Float
    self[config_key] = value.to_f
  elsif type == Symbol
    self[config_key] = value.to_sym
  elsif type == Array
    self[config_key] = value.split(/\s*,\s*/)
  elsif type == NewRelic::Agent::Configuration::Boolean
    if /false|off|no/i.match?(value)
      self[config_key] = false
    elsif !value.nil?
      self[config_key] = true
    end
  elsif !serverless?
    ::NewRelic::Agent.logger.info("#{environment_key} does not have a corresponding configuration setting (#{config_key} does not exist).")
    ::NewRelic::Agent.logger.info('Run `rake newrelic:config:docs` or visit https://docs.newrelic.com/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration to see a list of available configuration settings.')
    self[config_key] = value
  end
end

#set_log_fileObject



52
53
54
55
56
57
58
59
60
61
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 52

def set_log_file
  if ENV['NEW_RELIC_LOG']
    if ENV['NEW_RELIC_LOG'].casecmp(NewRelic::STANDARD_OUT) == 0
      self[:log_file_path] = self[:log_file_name] = NewRelic::STANDARD_OUT
    else
      self[:log_file_path] = File.dirname(ENV['NEW_RELIC_LOG'])
      self[:log_file_name] = File.basename(ENV['NEW_RELIC_LOG'])
    end
  end
end

#set_value_from_environment_variable(key) ⇒ Object



77
78
79
80
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 77

def set_value_from_environment_variable(key)
  config_key = convert_environment_key_to_config_key(key)
  set_key_by_type(config_key, key)
end

#set_values_from_new_relic_environment_variablesObject



67
68
69
70
71
72
73
74
75
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 67

def set_values_from_new_relic_environment_variables
  nr_env_var_keys = collect_new_relic_environment_variable_keys

  nr_env_var_keys.each do |key|
    next if SPECIAL_CASE_KEYS.any? { |pattern| pattern === key.upcase }

    set_value_from_environment_variable(key)
  end
end