class ElasticAPM::Spies::DelayedJobSpy

@api private

def self.invoke_job(job, *args, &block)

def self.invoke_job(job, *args, &block)
  job_name = job_name(job)
  transaction = ElasticAPM.start_transaction(job_name, TYPE)
  job.invoke_job_without_apm(*args, &block)
  transaction&.done 'success'
  transaction&.outcome = Transaction::Outcome::SUCCESS
rescue ::Exception => e
  ElasticAPM.report(e, handled: false)
  transaction&.done 'error'
  transaction&.outcome = Transaction::Outcome::FAILURE
  raise
ensure
  ElasticAPM.end_transaction
end

def self.job_name(job)

def self.job_name(job)
  payload_object = job.payload_object
  if payload_object.is_a?(::Delayed::PerformableMethod)
    performable_method_name(payload_object)
  elsif payload_object.instance_of?(
    ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper
  )
    payload_object.job_data['job_class']
  else
    payload_object.class.name
  end
rescue
  job.name
end

def self.name_separator(payload_object)

def self.name_separator(payload_object)
  payload_object.object.is_a?(Class) ? CLASS_SEPARATOR : METHOD_SEPARATOR
end

def self.object_name(payload_object)

def self.object_name(payload_object)
  object = payload_object.object
  klass = object.is_a?(Class) ? object : object.class
  klass.name
end

def self.performable_method_name(payload_object)

def self.performable_method_name(payload_object)
  class_name = object_name(payload_object)
  separator = name_separator(payload_object)
  method_name = payload_object.method_name
  "#{class_name}#{separator}#{method_name}"
end

def install

def install
  ::Delayed::Backend::Base.class_eval do
    alias invoke_job_without_apm invoke_job
    def invoke_job(*args, &block)
      ::ElasticAPM::Spies::DelayedJobSpy
        .invoke_job(self, *args, &block)
    end
  end
end

def invoke_job(*args, &block)

def invoke_job(*args, &block)
  ::ElasticAPM::Spies::DelayedJobSpy
    .invoke_job(self, *args, &block)
end