On this page
class ActiveSupport::Subscriber
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.
Attributes
TODO Change this to private once we've dropped Ruby 2.2 support. Workaround for Ruby 2.2 “private attribute?” warning.
TODO Change this to private once we've dropped Ruby 2.2 support. Workaround for Ruby 2.2 “private attribute?” warning.
TODO Change this to private once we've dropped Ruby 2.2 support. Workaround for Ruby 2.2 “private attribute?” warning.
Public Class Methods
# File activesupport/lib/active_support/subscriber.rb, line 28
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
Attach the subscriber to a namespace.
# File activesupport/lib/active_support/subscriber.rb, line 42
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
Adds event subscribers for all new methods added to the class.
# File activesupport/lib/active_support/subscriber.rb, line 78
def initialize
@queue_key = [self.class.name, object_id].join "-"
@patterns = []
super
end
# File activesupport/lib/active_support/subscriber.rb, line 51
def subscribers
@@subscribers ||= []
end
Private Class Methods
# File activesupport/lib/active_support/subscriber.rb, line 63
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
Public Instance Methods
# File activesupport/lib/active_support/subscriber.rb, line 92
def finish(name, id, payload)
finished = Time.now
event = event_stack.pop
event.end = finished
event.payload.merge!(payload)
method = name.split(".".freeze).first
send(method, event)
end
# File activesupport/lib/active_support/subscriber.rb, line 84
def start(name, id, payload)
e = ActiveSupport::Notifications::Event.new(name, Time.now, nil, id, payload)
parent = event_stack.last
parent << e if parent
event_stack.push e
end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.