class ElasticAPM::Spies::DelayedJobSpy

@api private

Constants

CLASS_SEPARATOR
METHOD_SEPARATOR
TYPE

Public Class Methods

invoke_job(job, *args, &block) click to toggle source
# File lib/elastic_apm/spies/delayed_job.rb, line 40
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
job_name(job) click to toggle source
# File lib/elastic_apm/spies/delayed_job.rb, line 55
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
name_separator(payload_object) click to toggle source
# File lib/elastic_apm/spies/delayed_job.rb, line 84
def self.name_separator(payload_object)
  payload_object.object.is_a?(Class) ? CLASS_SEPARATOR : METHOD_SEPARATOR
end
object_name(payload_object) click to toggle source
# File lib/elastic_apm/spies/delayed_job.rb, line 78
def self.object_name(payload_object)
  object = payload_object.object
  klass = object.is_a?(Class) ? object : object.class
  klass.name
end
performable_method_name(payload_object) click to toggle source
# File lib/elastic_apm/spies/delayed_job.rb, line 71
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

Public Instance Methods

install() click to toggle source
# File lib/elastic_apm/spies/delayed_job.rb, line 29
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
invoke_job(*args, &block) click to toggle source
# File lib/elastic_apm/spies/delayed_job.rb, line 33
def invoke_job(*args, &block)
  ::ElasticAPM::Spies::DelayedJobSpy
    .invoke_job(self, *args, &block)
end