Skip to content

Commit 21bb306

Browse files
committed
Keep Logging in the ActiveModelSerializers namespace
1 parent 5142496 commit 21bb306

File tree

9 files changed

+66
-60
lines changed

9 files changed

+66
-60
lines changed

docs/general/instrumentation.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
# Instrumentation
22

3-
AMS uses the instrumentation API provided by Active Support this way we
4-
can choose to be notified when AMS events occur inside our application.
3+
ActiveModelSerializers uses the ActiveSupport::Notification API, which
4+
allows for subscribing to events, such as for logging.
55

6-
## render.active_model_serializers
6+
## Events
77

8-
|key | value |
9-
|-------------|----------------------|
10-
|:serializer | The serializer class |
11-
|:adapter | The adapter instance |
8+
Name:
9+
10+
`render.active_model_serializers`
11+
12+
Payload (example):
1213

1314
```ruby
1415
{
1516
serializer: PostSerializer,
16-
adapter: #<ActiveModel::Serializer::Adapter::Attributes:0x007f96e81eb730>
17+
adapter: ActiveModel::Serializer::Adapter::Attributes
1718
}
1819
```

docs/general/logging.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# Logging
22

3-
If we are using AMS on Rails app by default the `Rails.logger` will be used.
3+
If we are using ActiveModel::Serializers on Rails app by default the `Rails.logger` will be used.
44

55
On a non Rails enviroment by default the `ActiveSupport::TaggedLogging` will be
66
used.
77

88
If we need to customize the logger we can define this in an initializer:
99

1010
```ruby
11-
ActiveModel::Serializer.logger = Logger.new(STDOUT)
11+
ActiveModelSerializers.logger = Logger.new(STDOUT)
1212
```

lib/active_model/serializable_resource.rb

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,7 @@
22
module ActiveModel
33
class SerializableResource
44
ADAPTER_OPTION_KEYS = Set.new([:include, :fields, :adapter, :meta, :meta_key, :links])
5-
extend ActiveModel::Callbacks
6-
7-
define_model_callbacks :render
8-
9-
around_render do |_, block, _|
10-
notify_active_support do
11-
block.call
12-
end
13-
end
5+
include ActiveModelSerializers::Logging
146

157
# Primary interface to composing a resource with a serializer and adapter.
168
# @return the serializable_resource, ready for #as_json/#to_json/#serializable_hash.
@@ -89,13 +81,5 @@ def serializer?
8981
protected
9082

9183
attr_reader :resource, :adapter_opts, :serializer_opts
92-
93-
def notify_active_support
94-
event_name = 'render.active_model_serializers'.freeze
95-
payload = { serializer: serializer, adapter: adapter }
96-
ActiveSupport::Notifications.instrument(event_name, payload) do
97-
yield
98-
end
99-
end
10084
end
10185
end

lib/active_model/serializer.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@
66
require 'active_model/serializer/configuration'
77
require 'active_model/serializer/fieldset'
88
require 'active_model/serializer/lint'
9-
require 'active_model/serializer/logging'
109

1110
# ActiveModel::Serializer is an abstract class that is
1211
# reified when subclassed to decorate a resource.
1312
module ActiveModel
1413
class Serializer
1514
include Configuration
1615
include Associations
17-
include Logging
1816
require 'active_model/serializer/adapter'
1917

2018
# Matches

lib/active_model/serializer/logging.rb

Lines changed: 0 additions & 26 deletions
This file was deleted.

lib/active_model/serializer/railtie.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
require 'active_model_serializers'
12
require 'rails/railtie'
3+
24
module ActiveModel
35
class Railtie < Rails::Railtie
46
initializer 'active_model_serializers.logger' do
5-
ActiveSupport.on_load(:action_controller) do
6-
ActiveModelSerializers.logger = ActionController::Base.logger
7+
ActiveSupport.on_load(:active_model_serializers) do
8+
self.logger = ActionController::Base.logger
79
end
810
end
911

lib/active_model_serializers.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
require 'logger'
21
require 'active_model'
32
require 'active_support'
3+
require 'active_support/tagged_logging'
4+
require 'active_support/logger'
45
require 'action_controller'
56
require 'action_controller/railtie'
67
module ActiveModelSerializers
7-
mattr_accessor :logger
8-
self.logger = Rails.logger || Logger.new(IO::NULL)
8+
mattr_accessor(:logger) { ActiveSupport::TaggedLogging.new(ActiveSupport::Logger.new(STDOUT)) }
99

1010
extend ActiveSupport::Autoload
1111
autoload :Model
12+
autoload :Logging
1213

1314
module_function
1415

@@ -50,6 +51,7 @@ def silence_warnings
5051

5152
require 'action_controller/serialization'
5253
ActiveSupport.on_load(:action_controller) do
54+
ActiveSupport.run_load_hooks(:active_model_serializers, ActiveModelSerializers)
5355
include ::ActionController::Serialization
5456
ActionDispatch::Reloader.to_prepare do
5557
ActiveModel::Serializer.serializers_cache.clear
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
##
2+
# Adapted from:
3+
# https://github.com/rails/rails/blob/280654ef88/activejob/lib/active_job/logging.rb
4+
module ActiveModelSerializers::Logging
5+
extend ActiveSupport::Concern
6+
7+
included do
8+
extend ActiveModel::Callbacks
9+
define_model_callbacks :render
10+
around_render do |_, block, _|
11+
notify_active_support do
12+
block.call
13+
end
14+
end
15+
end
16+
17+
def notify_active_support
18+
event_name = 'render.active_model_serializers'.freeze
19+
payload = { serializer: serializer, adapter: adapter }
20+
ActiveSupport::Notifications.instrument(event_name, payload) do
21+
yield
22+
end
23+
end
24+
25+
private
26+
27+
class LogSubscriber < ActiveSupport::LogSubscriber
28+
def render(event)
29+
logger.tagged('AMS') do
30+
info do
31+
serializer = event.payload[:serializer]
32+
adapter = event.payload[:adapter]
33+
duration = event.duration.round(2)
34+
"Rendered #{serializer.name} with #{adapter.class} (#{duration}ms)"
35+
end
36+
end
37+
end
38+
39+
def logger
40+
ActiveModelSerializers.logger
41+
end
42+
end
43+
end
44+
45+
ActiveModelSerializers::Logging::LogSubscriber.attach_to :active_model_serializers
File renamed without changes.

0 commit comments

Comments
 (0)