class NewRelic::Agent::RulesEngine

Constants

LEADING_SLASH_REGEX
SEGMENT_SEPARATOR

Public Class Methods

create_metric_rules(connect_response) click to toggle source
# File lib/new_relic/agent/rules_engine.rb, line 20
def self.create_metric_rules(connect_response)
  specs = connect_response['metric_name_rules'] || []
  rules = specs.map { |spec| ReplacementRule.new(spec) }
  self.new(rules)
end
create_transaction_rules(connect_response) click to toggle source
# File lib/new_relic/agent/rules_engine.rb, line 26
def self.create_transaction_rules(connect_response)
  txn_name_specs = connect_response['transaction_name_rules'] || []
  segment_rule_specs = connect_response['transaction_segment_terms'] || []

  txn_name_rules = txn_name_specs.map { |s| ReplacementRule.new(s) }

  segment_rules = []

  segment_rule_specs.each do |spec|
    if spec[SegmentTermsRule::PREFIX_KEY] && SegmentTermsRule.valid?(spec)
      # Build segment_rules in reverse order from which they're provided,
      # so that when we eliminate duplicates with #uniq!, we retain the last
      # instances of repeated rules.
      segment_rules.unshift(SegmentTermsRule.new(spec))
    end
  end

  reject_rules_with_duplicate_prefixes!(segment_rules)

  segment_rules.reverse! # Reset the rules to their original order.

  self.new(txn_name_rules, segment_rules)
end
new(rules = [], segment_term_rules = []) click to toggle source
# File lib/new_relic/agent/rules_engine.rb, line 57
def initialize(rules = [], segment_term_rules = [])
  @rules = rules.sort
  @segment_term_rules = segment_term_rules
end
reject_rules_with_duplicate_prefixes!(rules) click to toggle source

When multiple rules share the same prefix, only apply the rule with the last instance of the prefix. Note that the incoming rules are in reverse order to facilitate this.

# File lib/new_relic/agent/rules_engine.rb, line 53
def self.reject_rules_with_duplicate_prefixes!(rules)
  rules.uniq! { |rule| rule.prefix }
end

Public Instance Methods

apply_rules(rules, string) click to toggle source
# File lib/new_relic/agent/rules_engine.rb, line 62
def apply_rules(rules, string)
  rules.each do |rule|
    if rule.matches?(string)
      string = rule.apply(string)
      break if rule.terminal?
    end
  end
  string
end
rename(original_string) click to toggle source
# File lib/new_relic/agent/rules_engine.rb, line 72
def rename(original_string)
  renamed = apply_rules(@rules, original_string)
  return nil unless renamed

  renamed = apply_rules(@segment_term_rules, renamed)
  renamed
end