class Datadog::Contrib::ActiveSupport::Notifications::Subscription

An ActiveSupport::Notification subscription that wraps events with tracing.

Attributes

callbacks[R]
handler[R]
options[RW]
span_name[RW]

Public Class Methods

new(tracer, span_name, options, &block) click to toggle source
# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 12
def initialize(tracer, span_name, options, &block)
  raise ArgumentError, 'Must be given a block!' unless block

  @tracer = tracer
  @span_name = span_name
  @options = options
  @handler = Handler.new(&block)
  @callbacks = Callbacks.new
end

Public Instance Methods

after_trace(&block) click to toggle source
# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 46
def after_trace(&block)
  callbacks.add(:after_trace, &block) if block
end
before_trace(&block) click to toggle source
# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 42
def before_trace(&block)
  callbacks.add(:before_trace, &block) if block
end
call(name, start, finish, id, payload) click to toggle source

ActiveSupport 3.x calls this

# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 27
def call(name, start, finish, id, payload)
  start_span(name, id, payload, start)
  finish_span(name, id, payload, finish)
end
finish(name, id, payload) click to toggle source

ActiveSupport 4+ calls this on finish

# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 38
def finish(name, id, payload)
  finish_span(name, id, payload)
end
start(name, id, payload) click to toggle source

ActiveSupport 4+ calls this on start

# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 33
def start(name, id, payload)
  start_span(name, id, payload)
end
subscribe(pattern) click to toggle source
# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 50
def subscribe(pattern)
  return false if subscribers.key?(pattern)

  subscribers[pattern] = ::ActiveSupport::Notifications.subscribe(pattern, self)
  true
end
tracer() click to toggle source
# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 22
def tracer
  @tracer.is_a?(Proc) ? @tracer.call : @tracer
end
unsubscribe(pattern) click to toggle source
# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 57
def unsubscribe(pattern)
  return false unless subscribers.key?(pattern)

  ::ActiveSupport::Notifications.unsubscribe(subscribers[pattern])
  subscribers.delete(pattern)
  true
end
unsubscribe_all() click to toggle source
# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 65
def unsubscribe_all
  return false if subscribers.empty?

  subscribers.each_key { |pattern| unsubscribe(pattern) }
  true
end

Protected Instance Methods

finish_span(name, id, payload, finish = nil) click to toggle source
# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 90
def finish_span(name, id, payload, finish = nil)
  payload[:datadog_span].tap do |span|
    # If no active span, return.
    return nil if span.nil?

    # Run handler for event
    handler.run(span, name, id, payload)

    # Finish the span
    span.finish(finish)

    # Run callbacks
    callbacks.run(name, :after_trace, span, id, payload, finish)
  end
end
start_span(name, id, payload, start = nil) click to toggle source
# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 78
def start_span(name, id, payload, start = nil)
  # Run callbacks
  callbacks.run(name, :before_trace, id, payload, start)

  # Start a trace
  tracer.trace(@span_name, @options.dup).tap do |span|
    # Start span if time is provided
    span.start(start) unless start.nil?
    payload[:datadog_span] = span
  end
end
subscribers() click to toggle source

Pattern => ActiveSupport:Notifications::Subscribers

# File lib/ddtrace/contrib/active_support/notifications/subscription.rb, line 107
def subscribers
  @subscribers ||= {}
end