newrelic: log additional request headers.

Log the Referer header, as well as the Sec-Fetch-* headers. These are
only sent by recent versions of Chrome; see https://www.w3.org/TR/fetch-metadata.
This commit is contained in:
evazion
2020-12-28 01:19:09 -06:00
parent 59c61f249f
commit 6a52216631

View File

@@ -1,4 +1,6 @@
class DanbooruLogger
HEADERS = %w[referer sec-fetch-dest sec-fetch-mode sec-fetch-site sec-fetch-user]
def self.info(message, params = {})
Rails.logger.info(message)
@@ -22,9 +24,29 @@ class DanbooruLogger
end
def self.add_session_attributes(request, session, user)
request_params = request.parameters.with_indifferent_access.except(:controller, :action)
session_params = session.to_h.with_indifferent_access.slice(:session_id, :started_at)
user_params = {
add_attributes("request.headers", header_params(request))
add_attributes("request.params", request_params(request))
add_attributes("session.params", session_params(session))
add_attributes("user", user_params(request, user))
end
def self.header_params(request)
headers = request.headers.to_h.select { |header, value| header.match?(/\AHTTP_/) }
headers = headers.transform_keys { |header| header.delete_prefix("HTTP_").downcase }
headers = headers.select { |header, value| header.in?(HEADERS) }
headers
end
def self.request_params(request)
request.parameters.with_indifferent_access.except(:controller, :action)
end
def self.session_params(session)
session.to_h.with_indifferent_access.slice(:session_id, :started_at)
end
def self.user_params(request, user)
{
id: user&.id,
name: user&.name,
level: user&.level_string,
@@ -32,22 +54,21 @@ class DanbooruLogger
country: request.headers["CF-IPCountry"],
safe_mode: CurrentUser.safe_mode?
}
add_attributes("request.params", request_params)
add_attributes("session.params", session_params)
add_attributes("user", user_params)
end
def self.add_attributes(prefix, hash)
return unless defined?(::NewRelic)
attributes = flatten_hash(hash).transform_keys { |key| "#{prefix}.#{key}" }
attributes.delete_if { |key, value| key.end_with?(*Rails.application.config.filter_parameters.map(&:to_s)) }
::NewRelic::Agent.add_custom_attributes(attributes)
add_custom_attributes(attributes)
end
private_class_method
def self.add_custom_attributes(attributes)
return unless defined?(::NewRelic)
::NewRelic::Agent.add_custom_attributes(attributes)
end
# flatten_hash({ foo: { bar: { baz: 42 } } })
# => { "foo.bar.baz" => 42 }
def self.flatten_hash(hash)