Class: OneApm::Agent::Instrumentation::EventedSubscriber

Inherits:
Object
  • Object
show all
Defined in:
lib/one_apm/inst/support/evented_subscriber.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeEventedSubscriber

Returns a new instance of EventedSubscriber.



7
8
9
# File 'lib/one_apm/inst/support/evented_subscriber.rb', line 7

def initialize
  @queue_key = ['OneApm', self.class.name, object_id].join('-')
end

Class Method Details

.subscribe(pattern) ⇒ Object



18
19
20
21
22
# File 'lib/one_apm/inst/support/evented_subscriber.rb', line 18

def self.subscribe(pattern)
  if !subscribed?
    ActiveSupport::Notifications.subscribe(pattern, new)
  end
end

.subscribed?Boolean

Returns:

  • (Boolean)


11
12
13
14
15
16
# File 'lib/one_apm/inst/support/evented_subscriber.rb', line 11

def self.subscribed?
  # TODO: need to talk to Rails core about an API for this,
  # rather than digging through Listener ivars
  ActiveSupport::Notifications.notifier.instance_variable_get(:@subscribers) \
    .find{|s| s.instance_variable_get(:@delegate).class == self }
end

Instance Method Details

#event_stackObject



56
57
58
# File 'lib/one_apm/inst/support/evented_subscriber.rb', line 56

def event_stack
  Thread.current[@queue_key] ||= Hash.new {|h,id| h[id] = [] }
end

#finish(name, id, payload) ⇒ Object



30
31
32
# File 'lib/one_apm/inst/support/evented_subscriber.rb', line 30

def finish(name, id, payload)
  pop_event(id)
end

#log_notification_error(error, name, event_type) ⇒ Object



34
35
36
37
38
39
# File 'lib/one_apm/inst/support/evented_subscriber.rb', line 34

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.
  OneApm::Manager.logger.error("Error during #{event_type} callback for event '#{name}':")
  OneApm::Manager.logger.log_exception(:error, error)
end

#pop_event(transaction_id) ⇒ Object



50
51
52
53
54
# File 'lib/one_apm/inst/support/evented_subscriber.rb', line 50

def pop_event(transaction_id)
  event = event_stack[transaction_id].pop
  event.end = Time.now
  return event
end

#push_event(event) ⇒ Object



41
42
43
44
45
46
47
48
# File 'lib/one_apm/inst/support/evented_subscriber.rb', line 41

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) ⇒ Object



24
25
26
27
28
# File 'lib/one_apm/inst/support/evented_subscriber.rb', line 24

def start(name, id, payload)
  event = ActiveSupport::Notifications::Event.new(name, Time.now, nil, id, payload)
  push_event(event)
  return event
end