Skip to content

Commit e8efc4e

Browse files
committed
Refactor callbacks in ams::logging
1 parent 84c3b11 commit e8efc4e

File tree

1 file changed

+64
-22
lines changed

1 file changed

+64
-22
lines changed

lib/active_model_serializers/logging.rb

Lines changed: 64 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,59 @@
11
##
22
# Adapted from:
3+
# https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb
34
# https://github.com/rails/rails/blob/280654ef88/activejob/lib/active_job/logging.rb
5+
#
6+
# Provides a single method +notify+ to be used to declare when
7+
# something a method notifies.
8+
#
9+
# class Adapter
10+
# def self.klass_method
11+
# # ...
12+
# end
13+
#
14+
# def instance_method
15+
# # ...
16+
# end
17+
#
18+
# extend ActiveModelSerializers::Logging
19+
# notify :instance_method, :render
20+
#
21+
# class << self
22+
# extend ActiveModelSerializers::Logging
23+
# notify :klass_method, :render
24+
# end
25+
# end
426
module ActiveModelSerializers::Logging
5-
def self.included(base)
6-
base.send(:include, ActiveSupport::Callbacks)
7-
base.extend ClassMethods
8-
base.class_eval do
27+
extend ActiveSupport::Concern
28+
29+
included do
30+
include ActiveSupport::Callbacks
31+
instrument_around_render
32+
end
33+
34+
module ClassMethods
35+
def instrument_around_render
936
define_callbacks :render
10-
around_render do |_, block|
11-
notify_active_support do
12-
block.call
37+
around_render do |args, block|
38+
tag_logger do
39+
notify_render do
40+
block.call(args)
41+
end
1342
end
1443
end
1544
end
16-
end
1745

18-
module ClassMethods
1946
def around_render(*filters, &blk)
2047
set_callback(:render, :around, *filters, &blk)
2148
end
49+
2250
##
2351
# Simple notify method that wraps up +name+
24-
# in a dummy method. It notifies on each call to the dummy method
25-
# telling what the current serializer and adapter are being rendered.
52+
# in a dummy method. It notifies on with the +callback_name+ notifier on
53+
# each call to the dummy method, telling what the current serializer and adapter
54+
# are being rendered.
2655
# Adapted from:
2756
# https://github.com/rubygems/rubygems/blob/cb28f5e991/lib/rubygems/deprecate.rb
28-
2957
def notify(name, callback_name)
3058
class_eval do
3159
old = "_notifying_#{callback_name}_#{name}"
@@ -39,25 +67,39 @@ def notify(name, callback_name)
3967
end
4068
end
4169

42-
def notify_active_support
70+
def notify_render(*)
4371
event_name = 'render.active_model_serializers'.freeze
44-
payload = { serializer: serializer, adapter: adapter }
45-
ActiveSupport::Notifications.instrument(event_name, payload) do
72+
ActiveSupport::Notifications.instrument(event_name, notify_render_payload) do
4673
yield
4774
end
4875
end
4976

77+
def notify_render_payload
78+
{ serializer: serializer, adapter: adapter }
79+
end
80+
5081
private
5182

83+
def tag_logger(*tags)
84+
if ActiveModelSerializers.logger.respond_to?(:tagged)
85+
tags.unshift 'AMS'.freeze unless logger_tagged_by_active_model_serializers?
86+
ActiveModelSerializers.logger.tagged(*tags) { yield }
87+
else
88+
yield
89+
end
90+
end
91+
92+
def logger_tagged_by_active_model_serializers?
93+
ActiveModelSerializers.logger.formatter.current_tags.include?('AMS'.freeze)
94+
end
95+
5296
class LogSubscriber < ActiveSupport::LogSubscriber
5397
def render(event)
54-
logger.tagged('AMS') do
55-
info do
56-
serializer = event.payload[:serializer]
57-
adapter = event.payload[:adapter]
58-
duration = event.duration.round(2)
59-
"Rendered #{serializer.name} with #{adapter.class} (#{duration}ms)"
60-
end
98+
info do
99+
serializer = event.payload[:serializer]
100+
adapter = event.payload[:adapter]
101+
duration = event.duration.round(2)
102+
"Rendered #{serializer.name} with #{adapter.class} (#{duration}ms)"
61103
end
62104
end
63105

0 commit comments

Comments
 (0)