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.

[View source]

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

[View source]

118
119
120
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 118

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

#convert_environment_key_to_config_key(key) ⇒ Object

[View source]

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

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:

[View source]

126
127
128
# File 'lib/new_relic/agent/configuration/environment_source.rb', line 126

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

#set_aliases(config_setting, value) ⇒ Object

[View source]

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

[View source]

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

[View source]

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

[View source]

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
108
109
110
111
# 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] = if DEFAULTS[config_key].key?(:transform)
      DEFAULTS[config_key][:transform].call(value)
    else
      value.split(/\s*,\s*/)
    end
  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

[View source]

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

[View source]

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

[View source]

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