class Delayed::Plugins::Tracer::Handler

Attributes

active_span[R]
tracer[R]

Public Class Methods

new(tracer:, active_span: nil, lifecycle:) click to toggle source
# File lib/delayed/plugins/tracer/handler.rb, line 5
def initialize(tracer:, active_span: nil, lifecycle:)
  @tracer = tracer
  @active_span = active_span

  lifecycle.around(:enqueue, &method(:enqueue))
  lifecycle.around(:perform, &method(:perform))
end

Public Instance Methods

enqueue(job, &proceed) click to toggle source
# File lib/delayed/plugins/tracer/handler.rb, line 13
def enqueue(job, &proceed)
  tags = {
    'component' => 'Delayed::Job',
    'span.kind' => 'client',
    'dj.queue' => (job.queue || 'default')
  }
  Method::Tracer.trace(operation_name(job), tracer: tracer, child_of: active_span, tags: tags) do |span|
    inject(span, job)
    proceed.call(job)
  end
end
perform(worker, job, &proceed) click to toggle source
# File lib/delayed/plugins/tracer/handler.rb, line 25
def perform(worker, job, &proceed)
  tags = {
    'component' => 'Delayed::Job',
    'span.kind' => 'server',
    'dj.id' => job.id,
    'dj.queue' => (job.queue || 'default'),
    'dj.attempts' => job.attempts
  }
  parent_span_context = extract(job)

  Method::Tracer.trace(operation_name(job), tracer: tracer, child_of: parent_span_context, tags: tags) do |span|
    proceed.call(worker, job)
  end
end

Private Instance Methods

extract(job) click to toggle source
# File lib/delayed/plugins/tracer/handler.rb, line 48
def extract(job)
  return unless job.metadata
  carrier = MultiJson.load(job.metadata)
  tracer.extract(OpenTracing::FORMAT_TEXT_MAP, carrier)
rescue MultiJson::ParseError
end
inject(span, job) click to toggle source
# File lib/delayed/plugins/tracer/handler.rb, line 42
def inject(span, job)
  carrier = {}
  tracer.inject(span.context, OpenTracing::FORMAT_TEXT_MAP, carrier)
  job.metadata = MultiJson.dump(carrier)
end
operation_name(job) click to toggle source
# File lib/delayed/plugins/tracer/handler.rb, line 55
def operation_name(job)
  YAML.load(job.handler).class.to_s rescue "UnknownJob"
end