From 0c7b262062277012a4b61371071dadfba070a21b Mon Sep 17 00:00:00 2001 From: agirlnamedsophia Date: Fri, 2 Nov 2018 14:33:24 -0400 Subject: [PATCH] If `job` is of type ActiveJob pull underlying job name from the wrapper --- lib/ddtrace/contrib/delayed_job/plugin.rb | 10 +++++- .../contrib/delayed_job/plugin_spec.rb | 36 +++++++++++++++---- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/lib/ddtrace/contrib/delayed_job/plugin.rb b/lib/ddtrace/contrib/delayed_job/plugin.rb index 615fbab1a81..bef91e6f7b6 100644 --- a/lib/ddtrace/contrib/delayed_job/plugin.rb +++ b/lib/ddtrace/contrib/delayed_job/plugin.rb @@ -9,7 +9,15 @@ class Plugin < Delayed::Plugin def self.instrument(job, &block) return block.call(job) unless tracer && tracer.enabled - tracer.trace(Ext::SPAN_JOB, service: configuration[:service_name], resource: job.name) do |span| + # When DelayedJob is used through ActiveJob, we need to parse the payload differentely + # to get the actual job name + job_name = if job.payload_object.respond_to?(:job_data) + job.payload_object.job_data['job_class'] + else + job.name + end + + tracer.trace(Ext::SPAN_JOB, service: configuration[:service_name], resource: job_name) do |span| span.set_tag(Ext::TAG_ID, job.id) span.set_tag(Ext::TAG_QUEUE, job.queue) if job.queue span.set_tag(Ext::TAG_PRIORITY, job.priority) diff --git a/spec/ddtrace/contrib/delayed_job/plugin_spec.rb b/spec/ddtrace/contrib/delayed_job/plugin_spec.rb index 05b000c85eb..23a70b01f69 100644 --- a/spec/ddtrace/contrib/delayed_job/plugin_spec.rb +++ b/spec/ddtrace/contrib/delayed_job/plugin_spec.rb @@ -7,13 +7,26 @@ require_relative 'delayed_job_active_record' RSpec.describe Datadog::Contrib::DelayedJob::Plugin, :delayed_job_active_record do - let(:sample_job_object) { double('sample_job', perform: nil) } - let(:sample_job_class) { class_double('SampleJob', new: sample_job_object) } + let(:sample_job_object) do + stub_const('SampleJob', Class.new do + def perform; end + end) + end + let(:active_job_sample_job_object) do + stub_const('ActiveJobSampleJob', Class.new do + def perform; end + + def job_data + { + 'job_class' => 'UnderlyingJobClass' + } + end + end) + end + let(:tracer) { ::Datadog::Tracer.new(writer: FauxWriter.new) } before do - sample_job_class.as_stubbed_const - Datadog.configure { |c| c.use :delayed_job, tracer: tracer } Delayed::Worker.delay_jobs = false @@ -40,12 +53,23 @@ describe 'instrumented job invocation' do let(:job_params) { {} } - subject(:job_run) { Delayed::Job.enqueue(SampleJob.new, job_params) } + subject(:job_run) { Delayed::Job.enqueue(sample_job_object.new, job_params) } it 'creates a span' do expect { job_run }.to change { tracer.writer.spans.first }.to be_instance_of(Datadog::Span) end + context 'when the job looks like Active Job' do + subject(:job_run) { Delayed::Job.enqueue(active_job_sample_job_object.new, job_params) } + subject(:span) { tracer.writer.spans.first } + + before { job_run } + + it 'has resource name equal to underlying ActiveJob class name' do + expect(span.resource).to eq('UnderlyingJobClass') + end + end + describe 'created span' do subject(:span) { tracer.writer.spans.first } @@ -57,7 +81,7 @@ end it 'has resource name equal to job name' do - expect(span.resource).to eq(RSpec::Mocks::Double.name) + expect(span.resource).to eq('SampleJob') end it "span tags doesn't include queue name" do