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
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 = 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
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 txn.add_agent_attribute(:'request.uri', request_path, default_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
Source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 143 def allow_other_headers? NewRelic::Agent.config[:allow_all_headers] && !NewRelic::Agent.config[:high_security] end
Source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 137 def attribute_from_env(request, key) if env = attribute_from_request(request, :env) env[key] end end
Source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 119 def attribute_from_request(request, attribute_method) if request.respond_to?(attribute_method) request.send(attribute_method) end end
Source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 107 def content_length_from_request(request) if content_length = attribute_from_request(request, :content_length) content_length.to_i end end
Source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 125 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
Source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 159 def formatted_header(raw_name) "#{ATTRIBUTE_PREFIX}#{NewRelic::LanguageSupport.camelize_with_first_letter_downcased(raw_name)}".to_sym end
Source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 147 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
Source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 101 def path_from_request(request) path = attribute_from_request(request, :path) || '' path = HTTPClients::URIUtil.strip_query_string(path) path.empty? ? NewRelic::ROOT : path 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.
Source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 113 def port_from_request(request) if port = attribute_from_request(request, :port) port.to_i end end
Source
# File lib/new_relic/agent/transaction/request_attributes.rb, line 87 def referer_from_request(request) if referer = attribute_from_request(request, :referer) HTTPClients::URIUtil.strip_query_string(referer.to_s) end end
Make a safe attempt to get the referer from a request object, generally successful when it’s a Rack
request.