-
Notifications
You must be signed in to change notification settings - Fork 369
/
plugin_spec.rb
122 lines (96 loc) · 3.44 KB
/
plugin_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
require 'spec_helper'
require 'active_record'
require 'delayed_job'
require 'delayed_job_active_record'
require 'ddtrace'
require 'ddtrace/contrib/delayed_job/plugin'
require_relative 'delayed_job_active_record'
RSpec.describe Datadog::Contrib::DelayedJob::Plugin, :delayed_job_active_record do
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
Datadog.configure { |c| c.use :delayed_job, tracer: tracer }
Delayed::Worker.delay_jobs = false
end
describe 'instrumenting worker execution' do
let(:worker) { double(:worker, name: 'worker') }
before do
allow(tracer).to receive(:shutdown!).and_call_original
end
it 'execution callback yields control' do
expect { |b| Delayed::Worker.lifecycle.run_callbacks(:execute, worker, &b) }.to yield_with_args(worker)
end
it 'shutdown happens after yielding' do
Delayed::Worker.lifecycle.run_callbacks(:execute, worker) do
expect(tracer).not_to have_received(:shutdown!)
end
expect(tracer).to have_received(:shutdown!)
end
end
describe 'instrumented job invocation' do
let(: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 }
before { job_run }
it 'has service name taken from configuration' do
expect(span.service).not_to be_nil
expect(span.service).to eq(Datadog.configuration[:delayed_job][:service_name])
end
it 'has resource name equal to job name' do
expect(span.resource).to eq('SampleJob')
end
it "span tags doesn't include queue name" do
expect(span.get_tag('delayed_job.queue')).to be_nil
end
it 'span tags include job id' do
expect(span.get_tag('delayed_job.id')).not_to be_nil
end
it 'span tags include priority' do
expect(span.get_tag('delayed_job.priority')).not_to be_nil
end
it 'span tags include number of attempts' do
expect(span.get_tag('delayed_job.attempts')).to eq('0')
end
context 'when queue name is set' do
let(:queue_name) { 'queue_name' }
let(:job_params) { { queue: queue_name } }
it 'span tags include queue name' do
expect(span.get_tag('delayed_job.queue')).to eq(queue_name)
end
end
context 'when priority is set' do
let(:priority) { 12345 }
let(:job_params) { { priority: priority } }
it 'span tags include job id' do
expect(span.get_tag('delayed_job.priority')).to eq(priority.to_s)
end
end
end
end
end