lib/datadog/core/configuration/option.rb in datadog-2.0.0 vs lib/datadog/core/configuration/option.rb in datadog-2.1.0

- old
+ new

@@ -12,11 +12,11 @@ # The definition object that matches this option. # @return [Configuration::OptionDefinition] # @!attribute [r] precedence_set # When this option was last set, what was the value precedence used? # @return [Precedence::Value] - attr_reader :definition, :precedence_set + attr_reader :definition, :precedence_set, :resolved_env # Option setting precedence. module Precedence # Represents an Option precedence level. # Each precedence has a `numeric` value; higher values means higher precedence. @@ -48,10 +48,11 @@ def initialize(definition, context) @definition = definition @context = context @value = nil @is_set = false + @resolved_env = nil # One value is stored per precedence, to allow unsetting a higher # precedence value and falling back to a lower precedence one. @value_per_precedence = Hash.new(UNSET) @@ -63,11 +64,11 @@ # the previously set value. # The first call to `#set` will always store the value regardless of precedence. # # @param value [Object] the new value to be associated with this option # @param precedence [Precedence] from what precedence order this new value comes from - def set(value, precedence: Precedence::PROGRAMMATIC) + def set(value, precedence: Precedence::PROGRAMMATIC, resolved_env: nil) # Is there a higher precedence value set? if @precedence_set > precedence # This should be uncommon, as higher precedence values tend to # happen later in the application lifecycle. Datadog.logger.info do @@ -82,11 +83,11 @@ @value_per_precedence[precedence] = value return @value end - internal_set(value, precedence) + internal_set(value, precedence, resolved_env) end def unset(precedence) @value_per_precedence[precedence] = UNSET @@ -100,11 +101,11 @@ next unless p < precedence # Look for value that is set. # The hash `@value_per_precedence` has a custom default value of `UNSET`. if (value = @value_per_precedence[p]) != UNSET - internal_set(value, p) + internal_set(value, p, nil) return nil end end # If no value is left to fall back on, reset this option @@ -258,15 +259,16 @@ raise ArgumentError, "The option #{@definition.name} is using an unsupported type option `#{@definition.type}`" end end # Directly manipulates the current value and currently set precedence. - def internal_set(value, precedence) + def internal_set(value, precedence, resolved_env) old_value = @value (@value = context_exec(validate_type(value), old_value, &definition.setter)).tap do |v| @is_set = true @precedence_set = precedence + @resolved_env = resolved_env # Store original value to ensure we can always safely call `#internal_set` # when restoring a value from `@value_per_precedence`, and we are only running `definition.setter` # on the original value, not on a valud that has already been processed by `definition.setter`. @value_per_precedence[precedence] = value context_exec(v, old_value, precedence, &definition.after_set) if definition.after_set @@ -282,34 +284,39 @@ end def set_value_from_env_or_default value = nil precedence = nil - effective_env = nil + resolved_env = nil - if definition.env && ENV[definition.env] - effective_env = definition.env - value = coerce_env_variable(ENV[definition.env]) - precedence = Precedence::PROGRAMMATIC + if definition.env + Array(definition.env).each do |env| + next if ENV[env].nil? + + resolved_env = env + value = coerce_env_variable(ENV[env]) + precedence = Precedence::PROGRAMMATIC + break + end end if value.nil? && definition.deprecated_env && ENV[definition.deprecated_env] - effective_env = definition.deprecated_env + resolved_env = definition.deprecated_env value = coerce_env_variable(ENV[definition.deprecated_env]) precedence = Precedence::PROGRAMMATIC Datadog::Core.log_deprecation do "#{definition.deprecated_env} environment variable is deprecated, use #{definition.env} instead." end end option_value = value.nil? ? default_value : value - set(option_value, precedence: precedence || Precedence::DEFAULT) + set(option_value, precedence: precedence || Precedence::DEFAULT, resolved_env: resolved_env) rescue ArgumentError raise ArgumentError, - "Expected environment variable #{effective_env} to be a #{@definition.type}, " \ - "but '#{ENV[effective_env]}' was provided" + "Expected environment variable #{resolved_env} to be a #{@definition.type}, " \ + "but '#{ENV[resolved_env]}' was provided" end # Anchor object that represents a value that is not set. # This is necessary because `nil` is a valid value to be set. UNSET = Object.new