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