class TingYun::Instrumentation::Support::EventedSubscriber

Public Class Methods

new() click to toggle source
# File lib/ting_yun/instrumentation/support/evented_subscriber.rb, line 6
def initialize
  @queue_key = ['TingYun', self.class.name, object_id].join('-')
end
subscribe(pattern) click to toggle source
# File lib/ting_yun/instrumentation/support/evented_subscriber.rb, line 16
def self.subscribe(pattern)
  unless subscribed?
    ActiveSupport::Notifications.subscribe(pattern, new)
  end
end
subscribed?() click to toggle source
# File lib/ting_yun/instrumentation/support/evented_subscriber.rb, line 10
def self.subscribed?
  # rather than digging through Listener ivars
  ActiveSupport::Notifications.notifier.instance_variable_get(:@subscribers) \
    .find{|s| s.instance_variable_get(:@delegate).class == self }
end

Public Instance Methods

event_stack() click to toggle source
# File lib/ting_yun/instrumentation/support/evented_subscriber.rb, line 54
def event_stack
  Thread.current[@queue_key] ||= Hash.new {|h,id| h[id] = [] }
end
finish(name, id, payload) click to toggle source
# File lib/ting_yun/instrumentation/support/evented_subscriber.rb, line 28
def finish(name, id, payload)
  pop_event(id)
end
log_notification_error(error, name, event_type) click to toggle source
# File lib/ting_yun/instrumentation/support/evented_subscriber.rb, line 32
def log_notification_error(error, name, event_type)
  # These are important enough failures that we want the backtraces
  # logged at error level, hence the explicit log_exception call.
  TingYun::Agent.logger.error("Error during #{event_type} callback for event '#{name}':")
  TingYun::Agent.logger.log_exception(:error, error)
end
pop_event(transaction_id) click to toggle source
# File lib/ting_yun/instrumentation/support/evented_subscriber.rb, line 48
def pop_event(transaction_id)
  event = event_stack[transaction_id].pop
  event.end = Time.now
  event
end
push_event(event) click to toggle source
# File lib/ting_yun/instrumentation/support/evented_subscriber.rb, line 39
def push_event(event)
  parent = event_stack[event.transaction_id].last
  if parent && event.respond_to?(:parent=)
    event.parent = parent
    parent << event
  end
  event_stack[event.transaction_id].push event
end
start(name, id, payload) click to toggle source
# File lib/ting_yun/instrumentation/support/evented_subscriber.rb, line 22
def start(name, id, payload)
  event = ActiveSupport::Notifications::Event.new(name, Time.now, nil, id, payload)
  push_event(event)
  event
end