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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user