lib/new_relic/agent/configuration/manager.rb in newrelic_rpm-3.9.5.251 vs lib/new_relic/agent/configuration/manager.rb in newrelic_rpm-3.9.6.257

- old
+ new

@@ -113,29 +113,59 @@ def fetch(key) config_stack.each do |config| next unless config accessor = key.to_sym + if config.has_key?(accessor) - if config[accessor].respond_to?(:call) - return instance_eval(&config[accessor]) - else - return config[accessor] + evaluated = evaluate_procs(config[accessor]) + + begin + return apply_transformations(accessor, evaluated) + rescue + next end end end + nil end + def evaluate_procs(value) + if value.respond_to?(:call) + instance_eval(&value) + else + value + end + end + + def apply_transformations(key, value) + if transform = transform_from_default(key) + begin + transform.call(value) + rescue => e + ::NewRelic::Agent.logger.error("Error applying transformation for #{key}, falling back to #{value}.", e) + raise e + end + else + value + end + end + + def transform_from_default(key) + ::NewRelic::Agent::Configuration::DefaultSource.transform_for(key) + end + def register_callback(key, &proc) @callbacks[key] << proc proc.call(@cache[key]) end def invoke_callbacks(direction, source) return unless source source.keys.each do |key| + if @cache[key] != source[key] @callbacks[key].each do |proc| if direction == :add proc.call(source[key]) else @@ -222,14 +252,13 @@ label_pairs = break_label_string_into_pairs(labels) make_label_hash(label_pairs, labels) end def break_label_string_into_pairs(labels) - # Strip whitespaces immediately before and after colons or semicolons - stripped_labels = labels.gsub(/\s*(:|;)\s*/, '\1') + stripped_labels = labels.strip stripped_labels.split(';').map do |pair| - pair.split(':') + pair.split(':').map(&:strip) end end def valid_label_pairs?(label_pairs) label_pairs.all? do |pair| @@ -257,10 +286,11 @@ NewRelic::Agent.logger.warn("#{MALFORMED_LABELS_WARNING}: #{labels||pairs}") return [] end pairs = limit_number_of_labels(pairs) + pairs = remove_duplicates(pairs) pairs.map do |key, value| { 'label_type' => truncate(key), 'label_value' => truncate(value.to_s, key) } @@ -286,9 +316,15 @@ NewRelic::Agent.logger.warn("Too many labels defined. Only taking first #{MAX_LABEL_COUNT}") pairs[0...64] else pairs end + end + + # We only take the last value provided for a given label type key + def remove_duplicates(pairs) + grouped_by_type = pairs.group_by(&:first) + grouped_by_type.values.map(&:last) end def parse_labels_from_dictionary make_label_hash(NewRelic::Agent.config[:labels]) end