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