class NewRelic::Agent::Transaction::RequestAttributes

Constants

ATTRIBUTE_PREFIX
BASE_HEADERS
HTTP_ACCEPT_HEADER_KEY

Attributes

accept[R]

the HTTP standard has “referrer” mispelled as “referer”

content_length[R]

the HTTP standard has “referrer” mispelled as “referer”

content_type[R]

the HTTP standard has “referrer” mispelled as “referer”

host[R]

the HTTP standard has “referrer” mispelled as “referer”

other_headers[R]

the HTTP standard has “referrer” mispelled as “referer”

port[R]

the HTTP standard has “referrer” mispelled as “referer”

referer[R]

the HTTP standard has “referrer” mispelled as “referer”

request_method[R]

the HTTP standard has “referrer” mispelled as “referer”

request_path[R]

the HTTP standard has “referrer” mispelled as “referer”

user_agent[R]

the HTTP standard has “referrer” mispelled as “referer”

Public Class Methods

new(request) click to toggle source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 22
def initialize(request)
  @request_path = path_from_request(request)
  @referer = referer_from_request(request)
  @accept = attribute_from_env(request, HTTP_ACCEPT_HEADER_KEY)
  @content_length = content_length_from_request(request)
  @content_type = attribute_from_request(request, :content_type)
  @host = attribute_from_request(request, :host)
  @port = port_from_request(request)
  @user_agent = attribute_from_request(request, :user_agent)
  @request_method = attribute_from_request(request, :request_method)
  @other_headers = other_headers_from_request(request)
end

Public Instance Methods

assign_agent_attributes(txn) click to toggle source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 35
def assign_agent_attributes(txn)
  default_destinations = AttributeFilter::DST_TRANSACTION_TRACER |
    AttributeFilter::DST_TRANSACTION_EVENTS |
    AttributeFilter::DST_ERROR_COLLECTOR

  if referer
    destinations = allow_other_headers? ? default_destinations : AttributeFilter::DST_ERROR_COLLECTOR
    txn.add_agent_attribute(:'request.headers.referer', referer, destinations)
  end

  if request_path
    destinations = if allow_other_headers?
      default_destinations
    else
      AttributeFilter::DST_TRANSACTION_TRACER | AttributeFilter::DST_ERROR_COLLECTOR
    end
    txn.add_agent_attribute(:'request.uri', request_path, destinations)
  end

  if accept
    txn.add_agent_attribute(:'request.headers.accept', accept, default_destinations)
  end

  if content_length
    txn.add_agent_attribute(:'request.headers.contentLength', content_length, default_destinations)
  end

  if content_type
    txn.add_agent_attribute(:'request.headers.contentType', content_type, default_destinations)
  end

  if host
    txn.add_agent_attribute(:'request.headers.host', host, default_destinations)
  end

  if user_agent
    txn.add_agent_attribute(:'request.headers.userAgent', user_agent, default_destinations)
  end

  if request_method
    txn.add_agent_attribute(:'request.method', request_method, default_destinations)
  end

  if port && allow_other_headers?
    txn.add_agent_attribute(:'request.headers.port', port, default_destinations)
  end

  other_headers.each do |header, value|
    txn.add_agent_attribute(header, value, default_destinations)
  end
end

Private Instance Methods

allow_other_headers?() click to toggle source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 136
def allow_other_headers?
  NewRelic::Agent.config[:allow_all_headers] && !NewRelic::Agent.config[:high_security]
end
attribute_from_env(request, key) click to toggle source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 130
def attribute_from_env(request, key)
  if env = attribute_from_request(request, :env)
    env[key]
  end
end
attribute_from_request(request, attribute_method) click to toggle source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 124
def attribute_from_request(request, attribute_method)
  if request.respond_to?(attribute_method)
    request.send(attribute_method)
  end
end
content_length_from_request(request) click to toggle source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 112
def content_length_from_request(request)
  if content_length = attribute_from_request(request, :content_length)
    content_length.to_i
  end
end
formatted_header(raw_name) click to toggle source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 152
def formatted_header(raw_name)
  "#{ATTRIBUTE_PREFIX}#{NewRelic::LanguageSupport.camelize_with_first_letter_downcased(raw_name)}".to_sym
end
other_headers_from_request(request) click to toggle source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 140
def other_headers_from_request(request)
  # confirm that `request` is an instance of `Rack::Request` by checking
  # for #each_header
  return NewRelic::EMPTY_HASH unless allow_other_headers? && request.respond_to?(:each_header)

  request.each_header.with_object({}) do |(header, value), hash|
    next if BASE_HEADERS.include?(header)

    hash[formatted_header(header)] = value
  end
end
path_from_request(request) click to toggle source

In practice we expect req to be a Rack::Request or ActionController::AbstractRequest (for older Rails versions). But anything that responds to path can be passed to perform_action_with_newrelic_trace.

We don’t expect the path to include a query string, however older test helpers for rails construct the PATH_INFO enviroment variable improperly and we’re generally being defensive.

# File lib/new_relic/agent/transaction/request_attributes.rb, line 106
def path_from_request(request)
  path = attribute_from_request(request, :path) || ''
  path = HTTPClients::URIUtil.strip_query_string(path)
  path.empty? ? NewRelic::ROOT : path
end
port_from_request(request) click to toggle source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 118
def port_from_request(request)
  if port = attribute_from_request(request, :port)
    port.to_i
  end
end
referer_from_request(request) click to toggle source

Make a safe attempt to get the referer from a request object, generally successful when it’s a Rack request.

# File lib/new_relic/agent/transaction/request_attributes.rb, line 92
def referer_from_request(request)
  if referer = attribute_from_request(request, :referer)
    HTTPClients::URIUtil.strip_query_string(referer.to_s)
  end
end