class NewRelic::Agent::Transaction::RequestAttributes
Constants
- ATTRIBUTE_PREFIX
- BASE_HEADERS
- HTTP_ACCEPT_HEADER_KEY
Attributes
the HTTP standard has “referrer” mispelled as “referer”
the HTTP standard has “referrer” mispelled as “referer”
the HTTP standard has “referrer” mispelled as “referer”
the HTTP standard has “referrer” mispelled as “referer”
the HTTP standard has “referrer” mispelled as “referer”
the HTTP standard has “referrer” mispelled as “referer”
the HTTP standard has “referrer” mispelled as “referer”
the HTTP standard has “referrer” mispelled as “referer”
the HTTP standard has “referrer” mispelled as “referer”
the HTTP standard has “referrer” mispelled as “referer”
Public Class Methods
# 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 = content_type_attribute_from_request(request) @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
# 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
# File lib/new_relic/agent/transaction/request_attributes.rb, line 148 def allow_other_headers? NewRelic::Agent.config[:allow_all_headers] && !NewRelic::Agent.config[:high_security] end
# File lib/new_relic/agent/transaction/request_attributes.rb, line 142 def attribute_from_env(request, key) if env = attribute_from_request(request, :env) env[key] end end
# 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
# 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
# File lib/new_relic/agent/transaction/request_attributes.rb, line 130 def content_type_attribute_from_request(request) # Rails 7.0 changed the behavior of `content_type`. We want just the MIME type, so use `media_type` if available. # https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#actiondispatch-request-content-type-now-returns-content-type-header-as-it-is content_type = if request.respond_to?(:media_type) :media_type elsif request.respond_to?(:content_type) :content_type end request.send(content_type) if content_type end
# File lib/new_relic/agent/transaction/request_attributes.rb, line 164 def formatted_header(raw_name) "#{ATTRIBUTE_PREFIX}#{NewRelic::LanguageSupport.camelize_with_first_letter_downcased(raw_name)}".to_sym end
# File lib/new_relic/agent/transaction/request_attributes.rb, line 152 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
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
# 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
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