class Skylight::Core::Subscriber

@api private

Attributes

config[R]
normalizers[R]

Public Class Methods

new(config, instrumenter) click to toggle source
# File lib/skylight/core/subscriber.rb, line 8
def initialize(config, instrumenter)
  @config       = config
  @normalizers  = Normalizers.build(config)
  @instrumenter = instrumenter
  @subscribers  = []
end

Public Instance Methods

finish(name, _id, payload) click to toggle source
# File lib/skylight/core/subscriber.rb, line 47
def finish(name, _id, payload)
  return if @instrumenter.disabled?
  return unless (trace = @instrumenter.current_trace)

  while (curr = trace.notifications.pop)
    next unless curr.name == name

    meta = {}
    meta[:exception] = payload[:exception] if payload[:exception]
    meta[:exception_object] = payload[:exception_object] if payload[:exception_object]
    trace.done(curr.span, meta) if curr.span
    normalize_after(trace, curr.span, name, payload)
    return
  end
rescue Exception => e
  error "Subscriber#finish error; msg=%s", e.message
  debug "trace=%s", trace.inspect
  debug "in:  name=%s", name.inspect
  debug "in:  payload=%s", payload.inspect
  t { e.backtrace.join("\n") }
  nil
end
publish(name, *args) click to toggle source
# File lib/skylight/core/subscriber.rb, line 70
def publish(name, *args)
  # Ignored for now because nothing in rails uses it
end
register!() click to toggle source
# File lib/skylight/core/subscriber.rb, line 15
def register!
  unregister!
  @normalizers.keys.each do |key|
    @subscribers << ActiveSupport::Notifications.subscribe(key, self)
  end
end
start(name, _id, payload) click to toggle source
# File lib/skylight/core/subscriber.rb, line 41
def start(name, _id, payload)
  return if @instrumenter.disabled?
  return unless (trace = @instrumenter.current_trace)
  _start(trace, name, payload)
end
unregister!() click to toggle source
# File lib/skylight/core/subscriber.rb, line 22
def unregister!
  ActiveSupport::Notifications.unsubscribe @subscribers.shift until @subscribers.empty?
end

Private Instance Methods

_start(trace, name, payload) click to toggle source
# File lib/skylight/core/subscriber.rb, line 84
def _start(trace, name, payload)
  result = normalize(trace, name, payload)

  unless result == :skip
    case result.size
    when 3, 4
      cat, title, desc, meta = result
    else
      raise "Invalid normalizer result: #{result.inspect}"
    end

    span = trace.instrument(cat, title, desc, meta)
  end
rescue Exception => e
  error "Subscriber#start error; msg=%s", e.message
  debug "trace=%s", trace.inspect
  debug "in:  name=%s", name.inspect
  debug "in:  payload=%s", payload.inspect
  debug "out: cat=%s, title=%s, desc=%s", cat.inspect, name.inspect, desc.inspect
  t { e.backtrace.join("\n") }
  nil
ensure
  trace.notifications << Notification.new(name, span)
end
normalize(*args) click to toggle source
# File lib/skylight/core/subscriber.rb, line 76
def normalize(*args)
  @normalizers.normalize(*args)
end
normalize_after(*args) click to toggle source
# File lib/skylight/core/subscriber.rb, line 80
def normalize_after(*args)
  @normalizers.normalize_after(*args)
end