class NewRelic::Agent::AttributeFilter

Constants

DST_ALL
DST_BROWSER_MONITORING
DST_DEVELOPER_MODE
DST_ERROR_COLLECTOR
DST_NONE
DST_TRANSACTION_EVENTS
DST_TRANSACTION_TRACER

Attributes

rules[R]

Public Class Methods

new(config) click to toggle source
# File lib/new_relic/agent/attribute_filter.rb, line 76
def initialize(config)
  @enabled_destinations = DST_NONE

  @enabled_destinations |= DST_TRANSACTION_TRACER if config[:'transaction_tracer.attributes.enabled']
  @enabled_destinations |= DST_TRANSACTION_EVENTS if config[:'transaction_events.attributes.enabled']
  @enabled_destinations |= DST_ERROR_COLLECTOR    if config[:'error_collector.attributes.enabled']
  @enabled_destinations |= DST_BROWSER_MONITORING if config[:'browser_monitoring.attributes.enabled']

  @enabled_destinations = DST_NONE unless config[:'attributes.enabled']

  @rules = []

  build_rule(config[:'attributes.exclude'], DST_ALL, false)
  build_rule(config[:'transaction_tracer.attributes.exclude'], DST_TRANSACTION_TRACER, false)
  build_rule(config[:'transaction_events.attributes.exclude'], DST_TRANSACTION_EVENTS, false)
  build_rule(config[:'error_collector.attributes.exclude'],    DST_ERROR_COLLECTOR,    false)
  build_rule(config[:'browser_monitoring.attributes.exclude'], DST_BROWSER_MONITORING, false)

  build_rule(['request.parameters.*'], include_destinations_for_capture_params(config[:capture_params]), true)
  build_rule(['job.resque.args.*'],    include_destinations_for_capture_params(config[:'resque.capture_params']), true)
  build_rule(['job.sidekiq.args.*'],   include_destinations_for_capture_params(config[:'sidekiq.capture_params']), true)

  build_rule(config[:'attributes.include'], DST_ALL, true)
  build_rule(config[:'transaction_tracer.attributes.include'], DST_TRANSACTION_TRACER, true)
  build_rule(config[:'transaction_events.attributes.include'], DST_TRANSACTION_EVENTS, true)
  build_rule(config[:'error_collector.attributes.include'],    DST_ERROR_COLLECTOR,    true)
  build_rule(config[:'browser_monitoring.attributes.include'], DST_BROWSER_MONITORING, true)

  @rules.sort!

  # We're ok to cache high security for fast lookup because the attribute
  # filter is re-generated on any significant config change.
  @high_security = config[:high_security]

  cache_prefix_blacklist
end

Public Instance Methods

allows?(allowed_destinations, requested_destination) click to toggle source
# File lib/new_relic/agent/attribute_filter.rb, line 147
def allows?(allowed_destinations, requested_destination)
  allowed_destinations & requested_destination == requested_destination
end
apply(attribute_name, default_destinations) click to toggle source
# File lib/new_relic/agent/attribute_filter.rb, line 128
def apply(attribute_name, default_destinations)
  return DST_NONE if @enabled_destinations == DST_NONE

  destinations   = default_destinations
  attribute_name = attribute_name.to_s

  @rules.each do |rule|
    if rule.match?(attribute_name)
      if rule.is_include
        destinations |= rule.destinations
      else
        destinations &= rule.destinations
      end
    end
  end

  destinations & @enabled_destinations
end
build_rule(attribute_names, destinations, is_include) click to toggle source
# File lib/new_relic/agent/attribute_filter.rb, line 121
def build_rule(attribute_names, destinations, is_include)
  attribute_names.each do |attribute_name|
    rule = AttributeFilterRule.new(attribute_name, destinations, is_include)
    @rules << rule unless rule.empty?
  end
end
cache_prefix_blacklist() click to toggle source

For attribute prefixes where we know the default destinations will always be DST_NONE, we can statically determine that any attribute starting with the prefix will not be allowed unless there's an include rule that might match attributes starting with it.

This allows us to skip significant preprocessing work (hash/array flattening and type coercion) for HTTP request parameters and job arguments for Sidekiq and Resque in the common case, since none of these attributes are captured by default.

# File lib/new_relic/agent/attribute_filter.rb, line 165
def cache_prefix_blacklist
  @prefix_blacklist = {}
  @prefix_blacklist[:'request.parameters'] = true unless might_allow_prefix_uncached?(:'request.parameters')
  @prefix_blacklist[:'job.sidekiq.args']   = true unless might_allow_prefix_uncached?(:'job.sidekiq.args')
  @prefix_blacklist[:'job.resque.args']    = true unless might_allow_prefix_uncached?(:'job.resque.args')
end
high_security?() click to toggle source
# File lib/new_relic/agent/attribute_filter.rb, line 151
def high_security?
  @high_security
end
include_destinations_for_capture_params(capturing) click to toggle source
# File lib/new_relic/agent/attribute_filter.rb, line 113
def include_destinations_for_capture_params(capturing)
  if capturing
    DST_TRANSACTION_TRACER | DST_ERROR_COLLECTOR
  else
    DST_NONE
  end
end
might_allow_prefix?(prefix) click to toggle source

Note that the given prefix must be a Symbol

# File lib/new_relic/agent/attribute_filter.rb, line 173
def might_allow_prefix?(prefix)
  !@prefix_blacklist.include?(prefix)
end
might_allow_prefix_uncached?(prefix) click to toggle source
# File lib/new_relic/agent/attribute_filter.rb, line 177
def might_allow_prefix_uncached?(prefix)
  prefix = prefix.to_s
  @rules.any? do |rule|
    if rule.is_include
      if rule.wildcard
        if rule.attribute_name.size > prefix.size
          rule.attribute_name.start_with?(prefix)
        else
          prefix.start_with?(rule.attribute_name)
        end
      else
        rule.attribute_name.start_with?(prefix)
      end
    end
  end
end