ActiveSupport::Subscriber (original) (raw)

Active Support 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.

We can detach a subscriber as well:

ActiveRecord::StatsSubscriber.detach_from(:active_record)

Methods

A

C

D

M

N

R

S

Class Public methods

Attach the subscriber to a namespace.

Source: show | on GitHub

def attach_to(namespace, subscriber = new, notifier = ActiveSupport::Notifications, inherit_all: false) @namespace = namespace @subscriber = subscriber @notifier = notifier @inherit_all = inherit_all

subscribers << subscriber

fetch_public_methods(subscriber, inherit_all).each do |event| add_event_subscriber(event) end end

Detach the subscriber from a namespace.

Source: show | on GitHub

def detach_from(namespace, notifier = ActiveSupport::Notifications) @namespace = namespace @subscriber = find_attached_subscriber @notifier = notifier

return unless subscriber

subscribers.delete(subscriber)

fetch_public_methods(subscriber, true).each do |event| remove_event_subscriber(event) end

@notifier = nil end

Adds event subscribers for all new methods added to the class.

Source: show | on GitHub

def method_added(event) super

if public_method_defined?(event) && notifier add_event_subscriber(event) end end

Class Private methods

Source: show | on GitHub

def add_event_subscriber(event) return if invalid_event?(event)

pattern = prepare_pattern(event)

return if pattern_subscribed?(pattern)

subscriber.patterns[pattern] = notifier.subscribe(pattern, subscriber) end

Source: show | on GitHub

def remove_event_subscriber(event) return if invalid_event?(event)

pattern = prepare_pattern(event)

return unless pattern_subscribed?(pattern)

notifier.unsubscribe(subscriber.patterns[pattern]) subscriber.patterns.delete(pattern) end

Instance Public methods

Source: show | on GitHub

def call(event) method = event.name[0, event.name.index(".")] send(method, event) end