From 21bb306d38709cd75070ee9a8cbcfd3965ac2bbb Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Sun, 8 Nov 2015 15:46:08 -0600 Subject: [PATCH] Keep Logging in the ActiveModelSerializers namespace --- docs/general/instrumentation.md | 17 +++---- docs/general/logging.md | 4 +- lib/active_model/serializable_resource.rb | 18 +------- lib/active_model/serializer.rb | 2 - lib/active_model/serializer/logging.rb | 26 ----------- lib/active_model/serializer/railtie.rb | 6 ++- lib/active_model_serializers.rb | 8 ++-- lib/active_model_serializers/logging.rb | 45 +++++++++++++++++++ .../logging_test.rb | 0 9 files changed, 66 insertions(+), 60 deletions(-) delete mode 100644 lib/active_model/serializer/logging.rb create mode 100644 lib/active_model_serializers/logging.rb rename test/{ => active_model_serializers}/logging_test.rb (100%) diff --git a/docs/general/instrumentation.md b/docs/general/instrumentation.md index d1296f68..3adaefbd 100644 --- a/docs/general/instrumentation.md +++ b/docs/general/instrumentation.md @@ -1,18 +1,19 @@ # Instrumentation -AMS uses the instrumentation API provided by Active Support this way we -can choose to be notified when AMS events occur inside our application. +ActiveModelSerializers uses the ActiveSupport::Notification API, which +allows for subscribing to events, such as for logging. -## render.active_model_serializers +## Events -|key | value | -|-------------|----------------------| -|:serializer | The serializer class | -|:adapter | The adapter instance | +Name: + +`render.active_model_serializers` + +Payload (example): ```ruby { serializer: PostSerializer, - adapter: # + adapter: ActiveModel::Serializer::Adapter::Attributes } ``` diff --git a/docs/general/logging.md b/docs/general/logging.md index a4feedb8..010ae01a 100644 --- a/docs/general/logging.md +++ b/docs/general/logging.md @@ -1,6 +1,6 @@ # Logging -If we are using AMS on Rails app by default the `Rails.logger` will be used. +If we are using ActiveModel::Serializers on Rails app by default the `Rails.logger` will be used. On a non Rails enviroment by default the `ActiveSupport::TaggedLogging` will be used. @@ -8,5 +8,5 @@ used. If we need to customize the logger we can define this in an initializer: ```ruby -ActiveModel::Serializer.logger = Logger.new(STDOUT) +ActiveModelSerializers.logger = Logger.new(STDOUT) ``` diff --git a/lib/active_model/serializable_resource.rb b/lib/active_model/serializable_resource.rb index 1ec49e79..d016adae 100644 --- a/lib/active_model/serializable_resource.rb +++ b/lib/active_model/serializable_resource.rb @@ -2,15 +2,7 @@ require 'set' module ActiveModel class SerializableResource ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :meta, :meta_key, :links]) - extend ActiveModel::Callbacks - - define_model_callbacks :render - - around_render do |_, block, _| - notify_active_support do - block.call - end - end + include ActiveModelSerializers::Logging # Primary interface to composing a resource with a serializer and adapter. # @return the serializable_resource, ready for #as_json/#to_json/#serializable_hash. @@ -89,13 +81,5 @@ module ActiveModel protected attr_reader :resource, :adapter_opts, :serializer_opts - - def notify_active_support - event_name = 'render.active_model_serializers'.freeze - payload = { serializer: serializer, adapter: adapter } - ActiveSupport::Notifications.instrument(event_name, payload) do - yield - end - end end end diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 15c29f2b..b513216f 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -6,7 +6,6 @@ require 'active_model/serializer/associations' require 'active_model/serializer/configuration' require 'active_model/serializer/fieldset' require 'active_model/serializer/lint' -require 'active_model/serializer/logging' # ActiveModel::Serializer is an abstract class that is # reified when subclassed to decorate a resource. @@ -14,7 +13,6 @@ module ActiveModel class Serializer include Configuration include Associations - include Logging require 'active_model/serializer/adapter' # Matches diff --git a/lib/active_model/serializer/logging.rb b/lib/active_model/serializer/logging.rb deleted file mode 100644 index e9b9c543..00000000 --- a/lib/active_model/serializer/logging.rb +++ /dev/null @@ -1,26 +0,0 @@ -module ActiveModel - class Serializer - module Logging - extend ActiveSupport::Concern - - class LogSubscriber < ActiveSupport::LogSubscriber - def render(event) - logger.tagged('AMS') do - info do - serializer = event.payload[:serializer] - adapter = event.payload[:adapter] - duration = event.duration.round(2) - "Rendered #{serializer.name} with #{adapter.class} (#{duration}ms)" - end - end - end - - def logger - ActiveModelSerializers.logger - end - end - end - end -end - -ActiveModel::Serializer::Logging::LogSubscriber.attach_to :active_model_serializers diff --git a/lib/active_model/serializer/railtie.rb b/lib/active_model/serializer/railtie.rb index cade0354..f6c2d27c 100644 --- a/lib/active_model/serializer/railtie.rb +++ b/lib/active_model/serializer/railtie.rb @@ -1,9 +1,11 @@ +require 'active_model_serializers' require 'rails/railtie' + module ActiveModel class Railtie < Rails::Railtie initializer 'active_model_serializers.logger' do - ActiveSupport.on_load(:action_controller) do - ActiveModelSerializers.logger = ActionController::Base.logger + ActiveSupport.on_load(:active_model_serializers) do + self.logger = ActionController::Base.logger end end diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index 922fd876..d2eb0fab 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -1,14 +1,15 @@ -require 'logger' require 'active_model' require 'active_support' +require 'active_support/tagged_logging' +require 'active_support/logger' require 'action_controller' require 'action_controller/railtie' module ActiveModelSerializers - mattr_accessor :logger - self.logger = Rails.logger || Logger.new(IO::NULL) + mattr_accessor(:logger) { ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) } extend ActiveSupport::Autoload autoload :Model + autoload :Logging module_function @@ -50,6 +51,7 @@ require 'active_model/serializer/version' require 'action_controller/serialization' ActiveSupport.on_load(:action_controller) do + ActiveSupport.run_load_hooks(:active_model_serializers, ActiveModelSerializers) include ::ActionController::Serialization ActionDispatch::Reloader.to_prepare do ActiveModel::Serializer.serializers_cache.clear diff --git a/lib/active_model_serializers/logging.rb b/lib/active_model_serializers/logging.rb new file mode 100644 index 00000000..e80fb5d5 --- /dev/null +++ b/lib/active_model_serializers/logging.rb @@ -0,0 +1,45 @@ +## +# Adapted from: +# https://github.com/rails/rails/blob/280654ef88/activejob/lib/active_job/logging.rb +module ActiveModelSerializers::Logging + extend ActiveSupport::Concern + + included do + extend ActiveModel::Callbacks + define_model_callbacks :render + around_render do |_, block, _| + notify_active_support do + block.call + end + end + end + + def notify_active_support + event_name = 'render.active_model_serializers'.freeze + payload = { serializer: serializer, adapter: adapter } + ActiveSupport::Notifications.instrument(event_name, payload) do + yield + end + end + + private + + class LogSubscriber < ActiveSupport::LogSubscriber + def render(event) + logger.tagged('AMS') do + info do + serializer = event.payload[:serializer] + adapter = event.payload[:adapter] + duration = event.duration.round(2) + "Rendered #{serializer.name} with #{adapter.class} (#{duration}ms)" + end + end + end + + def logger + ActiveModelSerializers.logger + end + end +end + +ActiveModelSerializers::Logging::LogSubscriber.attach_to :active_model_serializers diff --git a/test/logging_test.rb b/test/active_model_serializers/logging_test.rb similarity index 100% rename from test/logging_test.rb rename to test/active_model_serializers/logging_test.rb