class ActiveSupport::Notifications::Instrumenter

Instrumenters are stored in a thread local.

Attributes

id[R]

Public Class Methods

new(notifier) click to toggle source
# File lib/active_support/notifications/instrumenter.rb, line 12
def initialize(notifier)
  unless notifier.respond_to?(:build_handle)
    notifier = LegacyHandle::Wrapper.new(notifier)
  end

  @id       = unique_id
  @notifier = notifier
end

Public Instance Methods

build_handle(name, payload) click to toggle source

Returns a “handle” for an event with the given name and payload.

start and finish must each be called exactly once on the returned object.

Where possible, it's best to use instrument, which will record the start and finish of the event and correctly handle any exceptions. build_handle is a low-level API intended for cases where using instrument isn't possible.

See ActiveSupport::Notifications::Fanout::Handle.

# File lib/active_support/notifications/instrumenter.rb, line 78
def build_handle(name, payload)
  @notifier.build_handle(name, @id, payload)
end
finish(name, payload) click to toggle source

Send a finish notification with name and payload.

# File lib/active_support/notifications/instrumenter.rb, line 92
def finish(name, payload)
  @notifier.finish name, @id, payload
end
finish_with_state(listeners_state, name, payload) click to toggle source
# File lib/active_support/notifications/instrumenter.rb, line 96
def finish_with_state(listeners_state, name, payload)
  @notifier.finish name, @id, payload, listeners_state
end
instrument(name, payload = {}) { |payload| ... } click to toggle source

Given a block, instrument it by measuring the time taken to execute and publish it. Without a block, simply send a message via the notifier. Notice that events get sent even if an error occurs in the passed-in block.

# File lib/active_support/notifications/instrumenter.rb, line 54
def instrument(name, payload = {})
  handle = build_handle(name, payload)
  handle.start
  begin
    yield payload if block_given?
  rescue Exception => e
    payload[:exception] = [e.class.name, e.message]
    payload[:exception_object] = e
    raise e
  ensure
    handle.finish
  end
end
start(name, payload) click to toggle source

Send a start notification with name and payload.

# File lib/active_support/notifications/instrumenter.rb, line 87
def start(name, payload)
  @notifier.start name, @id, payload
end

Private Instance Methods

unique_id() click to toggle source
# File lib/active_support/notifications/instrumenter.rb, line 101
def unique_id
  SecureRandom.hex(10)
end