Class: TingYun::Instrumentation::Support::EventedSubscriber

Inherits:
Object
  • Object
show all
Defined in:
lib/ting_yun/instrumentation/support/evented_subscriber.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeEventedSubscriber

Returns a new instance of EventedSubscriber.



6
7
8
# File 'lib/ting_yun/instrumentation/support/evented_subscriber.rb', line 6

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

Class Method Details

.subscribe(pattern) ⇒ Object



16
17
18
19
20
# 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?Boolean

Returns:

  • (Boolean)


10
11
12
13
14
# 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

Instance Method Details

#event_stackObject



54
55
56
# 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) ⇒ Object



28
29
30
# 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) ⇒ Object



32
33
34
35
36
37
# 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) ⇒ Object



48
49
50
51
52
# 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) ⇒ Object



39
40
41
42
43
44
45
46
# 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) ⇒ Object



22
23
24
25
26
# 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