Refactor callbacks in ams::logging

This commit is contained in:
Benjamin Fleischer 2015-11-08 20:41:48 -06:00
parent 84c3b11491
commit e8efc4eff4

View File

@ -1,31 +1,59 @@
## ##
# Adapted from: # Adapted from:
# https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb
# https://github.com/rails/rails/blob/280654ef88/activejob/lib/active_job/logging.rb # https://github.com/rails/rails/blob/280654ef88/activejob/lib/active_job/logging.rb
#
# Provides a single method +notify+ to be used to declare when
# something a method notifies.
#
# class Adapter
# def self.klass_method
# # ...
# end
#
# def instance_method
# # ...
# end
#
# extend ActiveModelSerializers::Logging
# notify :instance_method, :render
#
# class << self
# extend ActiveModelSerializers::Logging
# notify :klass_method, :render
# end
# end
module ActiveModelSerializers::Logging module ActiveModelSerializers::Logging
def self.included(base) extend ActiveSupport::Concern
base.send(:include, ActiveSupport::Callbacks)
base.extend ClassMethods included do
base.class_eval do include ActiveSupport::Callbacks
define_callbacks :render instrument_around_render
around_render do |_, block|
notify_active_support do
block.call
end
end
end
end end
module ClassMethods module ClassMethods
def instrument_around_render
define_callbacks :render
around_render do |args, block|
tag_logger do
notify_render do
block.call(args)
end
end
end
end
def around_render(*filters, &blk) def around_render(*filters, &blk)
set_callback(:render, :around, *filters, &blk) set_callback(:render, :around, *filters, &blk)
end end
## ##
# Simple notify method that wraps up +name+ # Simple notify method that wraps up +name+
# in a dummy method. It notifies on each call to the dummy method # in a dummy method. It notifies on with the +callback_name+ notifier on
# telling what the current serializer and adapter are being rendered. # each call to the dummy method, telling what the current serializer and adapter
# are being rendered.
# Adapted from: # Adapted from:
# https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb # https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb
def notify(name, callback_name) def notify(name, callback_name)
class_eval do class_eval do
old = "_notifying_#{callback_name}_#{name}" old = "_notifying_#{callback_name}_#{name}"
@ -39,25 +67,39 @@ module ActiveModelSerializers::Logging
end end
end end
def notify_active_support def notify_render(*)
event_name = 'render.active_model_serializers'.freeze event_name = 'render.active_model_serializers'.freeze
payload = { serializer: serializer, adapter: adapter } ActiveSupport::Notifications.instrument(event_name, notify_render_payload) do
ActiveSupport::Notifications.instrument(event_name, payload) do
yield yield
end end
end end
def notify_render_payload
{ serializer: serializer, adapter: adapter }
end
private private
def tag_logger(*tags)
if ActiveModelSerializers.logger.respond_to?(:tagged)
tags.unshift 'AMS'.freeze unless logger_tagged_by_active_model_serializers?
ActiveModelSerializers.logger.tagged(*tags) { yield }
else
yield
end
end
def logger_tagged_by_active_model_serializers?
ActiveModelSerializers.logger.formatter.current_tags.include?('AMS'.freeze)
end
class LogSubscriber < ActiveSupport::LogSubscriber class LogSubscriber < ActiveSupport::LogSubscriber
def render(event) def render(event)
logger.tagged('AMS') do info do
info do serializer = event.payload[:serializer]
serializer = event.payload[:serializer] adapter = event.payload[:adapter]
adapter = event.payload[:adapter] duration = event.duration.round(2)
duration = event.duration.round(2) "Rendered #{serializer.name} with #{adapter.class} (#{duration}ms)"
"Rendered #{serializer.name} with #{adapter.class} (#{duration}ms)"
end
end end
end end