ActiveSupport::Subscriber
is an object set to consume ActiveSupport::Notifications
. The subscriber dispatches notifications to a registered object based on its given namespace.
An example would be an Active Record subscriber responsible for collecting statistics about queries:
module ActiveRecord
class StatsSubscriber < ActiveSupport::Subscriber
attach_to :active_record
def sql(event)
Statsd.timing("sql.#{event.payload[:name]}", event.duration)
end
end
end
After configured, whenever a “sql.active_record” notification is published, it will properly dispatch the event (ActiveSupport::Notifications::Event
) to the sql
method.
Methods
Attributes
[R] | namespace | TODO Change this to private once we've dropped Ruby 2.2 support. Workaround for Ruby 2.2 “private attribute?” warning. |
[R] | notifier | TODO Change this to private once we've dropped Ruby 2.2 support. Workaround for Ruby 2.2 “private attribute?” warning. |
[R] | subscriber | TODO Change this to private once we've dropped Ruby 2.2 support. Workaround for Ruby 2.2 “private attribute?” warning. |
Class Public methods
attach_to(namespace, subscriber = new, notifier = ActiveSupport::Notifications)
Attach the subscriber to a namespace.
📝 Source code
# File activesupport/lib/active_support/subscriber.rb, line 30
def attach_to(namespace, subscriber = new, notifier = ActiveSupport::Notifications)
@namespace = namespace
@subscriber = subscriber
@notifier = notifier
subscribers << subscriber
# Add event subscribers for all existing methods on the class.
subscriber.public_methods(false).each do |event|
add_event_subscriber(event)
end
end
🔎 See on GitHub
method_added(event)
Adds event subscribers for all new methods added to the class.
📝 Source code
# File activesupport/lib/active_support/subscriber.rb, line 44
def method_added(event)
# Only public methods are added as subscribers, and only if a notifier
# has been set up. This means that subscribers will only be set up for
# classes that call #attach_to.
if public_method_defined?(event) && notifier
add_event_subscriber(event)
end
end
🔎 See on GitHub
new()
📝 Source code
# File activesupport/lib/active_support/subscriber.rb, line 80
def initialize
@queue_key = [self.class.name, object_id].join "-"
@patterns = []
super
end
🔎 See on GitHub
subscribers()
📝 Source code
# File activesupport/lib/active_support/subscriber.rb, line 53
def subscribers
@@subscribers ||= []
end
🔎 See on GitHub
Class Private methods
add_event_subscriber(event)
📝 Source code
# File activesupport/lib/active_support/subscriber.rb, line 65
def add_event_subscriber(event) # :doc:
return if %w{ start finish }.include?(event.to_s)
pattern = "#{event}.#{namespace}"
# Don't add multiple subscribers (eg. if methods are redefined).
return if subscriber.patterns.include?(pattern)
subscriber.patterns << pattern
notifier.subscribe(pattern, subscriber)
end
🔎 See on GitHub
Instance Public methods
finish(name, id, payload)
📝 Source code
# File activesupport/lib/active_support/subscriber.rb, line 94
def finish(name, id, payload)
finished = now
event = event_stack.pop
event.end = finished
event.payload.merge!(payload)
method = name.split(".".freeze).first
send(method, event)
end
🔎 See on GitHub
start(name, id, payload)
📝 Source code
# File activesupport/lib/active_support/subscriber.rb, line 86
def start(name, id, payload)
e = ActiveSupport::Notifications::Event.new(name, now, nil, id, payload)
parent = event_stack.last
parent << e if parent
event_stack.push e
end
🔎 See on GitHub