appsignal 3.7.2 → 3.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/Gemfile +4 -0
- data/gemfiles/no_dependencies.gemfile +7 -5
- data/gemfiles/rails-6.0.gemfile +7 -3
- data/gemfiles/rails-6.1.gemfile +5 -1
- data/gemfiles/rails-7.0.gemfile +8 -4
- data/gemfiles/rails-7.1.gemfile +4 -0
- data/lib/appsignal/config.rb +5 -0
- data/lib/appsignal/hooks/active_job.rb +30 -2
- data/lib/appsignal/version.rb +1 -1
- data/spec/lib/appsignal/config_spec.rb +24 -0
- data/spec/lib/appsignal/hooks/activejob_spec.rb +125 -26
- data/spec/lib/appsignal/hooks/resque_spec.rb +5 -5
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +7 -7
- data/spec/lib/appsignal/integrations/que_spec.rb +5 -5
- data/spec/lib/appsignal/integrations/sidekiq_spec.rb +15 -15
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 68aa8e0a32d494192799fdb4deb139a9e0fd0820d0c319c7ff9508f0f031c180
|
4
|
+
data.tar.gz: 73d42e3fc21d20f6d4b5e4e4606bcafcb7a084c05ecfca2200e6c3e2bbcefc97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c642513ac8122f2d2adbe248cc1c6c77383579dd52ac9bd327bfa64b984110e2b5eb21b3e2bf9498d7090c957f8df7c052cfa4baf6b52174e02cb9f753cfa3b
|
7
|
+
data.tar.gz: 400074db43e66759d091b4623e000fb63a9e45365b813ede6935289c917778f0e91918de528d1b4dd2a200558884cb9d56a0032f9cfa66ce2047b0a647851081
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
# AppSignal for Ruby gem Changelog
|
2
2
|
|
3
|
+
## 3.7.3
|
4
|
+
|
5
|
+
_Published on 2024-05-08._
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
- [28a36ba1](https://github.com/appsignal/appsignal-ruby/commit/28a36ba17c236cf3f2f4991f3ff224a98c76eec7) patch - Add option to `activejob_report_errors` option to only report errors when a job is discard by Active Job. In the example below the job is retried twice. If it fails with an error twice the job is discarded. If `activejob_report_errors` is set to `discard`, you will only get an error reported when the job is discarded. This new `discard` value only works for Active Job 7.1 and newer.
|
10
|
+
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
class ExampleJob < ActiveJob::Base
|
14
|
+
retry_on StandardError, :attempts => 2
|
15
|
+
|
16
|
+
# ...
|
17
|
+
end
|
18
|
+
```
|
19
|
+
- [d6d233de](https://github.com/appsignal/appsignal-ruby/commit/d6d233de8d1dd6aa203924e66db0635287aaea7b) patch - Track Active Job executions per job. When a job is retried the "executions" metadata for Active Job jobs goes up by one for every retry. We now track this as the `executions` tag on the job sample.
|
20
|
+
|
3
21
|
## 3.7.2
|
4
22
|
|
5
23
|
_Published on 2024-05-06._
|
data/Gemfile
CHANGED
@@ -1,8 +1,10 @@
|
|
1
|
-
source
|
1
|
+
source "https://rubygems.org"
|
2
2
|
|
3
3
|
ruby_version = Gem::Version.new(RUBY_VERSION)
|
4
|
-
if ruby_version < Gem::Version.new("2.3.0")
|
5
|
-
gem 'rack', '~> 1.6'
|
6
|
-
end
|
4
|
+
gem "rack", "~> 1.6" if ruby_version < Gem::Version.new("2.3.0")
|
7
5
|
|
8
|
-
|
6
|
+
# Fix install issue for jruby on gem 3.1.8.
|
7
|
+
# No java stub is published.
|
8
|
+
gem "bigdecimal", "3.1.7" if RUBY_PLATFORM == "java"
|
9
|
+
|
10
|
+
gemspec :path => "../"
|
data/gemfiles/rails-6.0.gemfile
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
-
source
|
1
|
+
source "https://rubygems.org"
|
2
2
|
|
3
|
-
gem
|
3
|
+
gem "rails", "~> 6.0.0"
|
4
4
|
gem "sidekiq"
|
5
5
|
|
6
|
-
|
6
|
+
# Fix install issue for jruby on gem 3.1.8.
|
7
|
+
# No java stub is published.
|
8
|
+
gem "bigdecimal", "3.1.7" if RUBY_PLATFORM == "java"
|
9
|
+
|
10
|
+
gemspec :path => "../"
|
data/gemfiles/rails-6.1.gemfile
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
source "https://rubygems.org"
|
2
2
|
|
3
|
+
gem "net-smtp", :require => false
|
3
4
|
gem "rails", "~> 6.1.0"
|
4
|
-
gem "net-smtp", require: false
|
5
5
|
gem "sidekiq"
|
6
6
|
|
7
|
+
# Fix install issue for jruby on gem 3.1.8.
|
8
|
+
# No java stub is published.
|
9
|
+
gem "bigdecimal", "3.1.7" if RUBY_PLATFORM == "java"
|
10
|
+
|
7
11
|
gemspec :path => "../"
|
data/gemfiles/rails-7.0.gemfile
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
-
source
|
1
|
+
source "https://rubygems.org"
|
2
2
|
|
3
|
-
gem
|
4
|
-
gem "sidekiq"
|
3
|
+
gem "rails", "~> 7.0.1"
|
5
4
|
gem "rake", "> 12.2"
|
5
|
+
gem "sidekiq"
|
6
|
+
|
7
|
+
# Fix install issue for jruby on gem 3.1.8.
|
8
|
+
# No java stub is published.
|
9
|
+
gem "bigdecimal", "3.1.7" if RUBY_PLATFORM == "java"
|
6
10
|
|
7
|
-
gemspec :path =>
|
11
|
+
gemspec :path => "../"
|
data/gemfiles/rails-7.1.gemfile
CHANGED
data/lib/appsignal/config.rb
CHANGED
@@ -558,6 +558,11 @@ module Appsignal
|
|
558
558
|
config[:send_session_data] = !skip_session_data if send_session_data.nil?
|
559
559
|
end
|
560
560
|
|
561
|
+
if config_hash[:activejob_report_errors] == "discard" &&
|
562
|
+
!Appsignal::Hooks::ActiveJobHook.version_7_1_or_higher?
|
563
|
+
config[:activejob_report_errors] = "all"
|
564
|
+
end
|
565
|
+
|
561
566
|
config
|
562
567
|
end
|
563
568
|
|
@@ -6,14 +6,38 @@ module Appsignal
|
|
6
6
|
class ActiveJobHook < Appsignal::Hooks::Hook
|
7
7
|
register :active_job
|
8
8
|
|
9
|
-
def
|
9
|
+
def self.version_7_1_or_higher?
|
10
|
+
@version_7_1_or_higher ||=
|
11
|
+
if dependencies_present?
|
12
|
+
major = ::ActiveJob::VERSION::MAJOR
|
13
|
+
minor = ::ActiveJob::VERSION::MINOR
|
14
|
+
major > 7 || (major == 7 && minor >= 1)
|
15
|
+
else
|
16
|
+
false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.dependencies_present?
|
10
21
|
defined?(::ActiveJob)
|
11
22
|
end
|
12
23
|
|
24
|
+
def dependencies_present?
|
25
|
+
self.class.dependencies_present?
|
26
|
+
end
|
27
|
+
|
13
28
|
def install
|
14
29
|
ActiveSupport.on_load(:active_job) do
|
15
30
|
::ActiveJob::Base
|
16
31
|
.extend ::Appsignal::Hooks::ActiveJobHook::ActiveJobClassInstrumentation
|
32
|
+
|
33
|
+
return unless Appsignal::Hooks::ActiveJobHook.version_7_1_or_higher?
|
34
|
+
|
35
|
+
# Only works on Active Job 7.1 and newer
|
36
|
+
::ActiveJob::Base.after_discard do |_job, exception|
|
37
|
+
next unless Appsignal.config[:activejob_report_errors] == "discard"
|
38
|
+
|
39
|
+
Appsignal::Transaction.current.set_error(exception)
|
40
|
+
end
|
17
41
|
end
|
18
42
|
end
|
19
43
|
|
@@ -86,7 +110,9 @@ module Appsignal
|
|
86
110
|
private
|
87
111
|
|
88
112
|
def transaction_set_error(transaction, exception)
|
89
|
-
|
113
|
+
# Only report errors when the config option is set to "all".
|
114
|
+
# To report errors on discard, see the `after_discard` callback.
|
115
|
+
return unless Appsignal.config[:activejob_report_errors] == "all"
|
90
116
|
|
91
117
|
transaction.set_error(exception)
|
92
118
|
end
|
@@ -136,6 +162,8 @@ module Appsignal
|
|
136
162
|
tags[:queue] = queue if queue
|
137
163
|
priority = job["priority"]
|
138
164
|
tags[:priority] = priority if priority
|
165
|
+
executions = job["executions"]
|
166
|
+
tags[:executions] = executions.to_i + 1 if executions
|
139
167
|
tags
|
140
168
|
end
|
141
169
|
|
data/lib/appsignal/version.rb
CHANGED
@@ -559,6 +559,30 @@ describe Appsignal::Config do
|
|
559
559
|
end
|
560
560
|
end
|
561
561
|
end
|
562
|
+
|
563
|
+
if DependencyHelper.rails_present?
|
564
|
+
require "active_job"
|
565
|
+
|
566
|
+
context "activejob_report_errors" do
|
567
|
+
let(:config_options) { { :activejob_report_errors => "discard" } }
|
568
|
+
|
569
|
+
if DependencyHelper.rails_version >= Gem::Version.new("7.1.0")
|
570
|
+
context "when Active Job >= 7.1 and 'discard'" do
|
571
|
+
it "does not override the activejob_report_errors value" do
|
572
|
+
expect(config[:activejob_report_errors]).to eq("discard")
|
573
|
+
expect(config.override_config[:activejob_report_errors]).to be_nil
|
574
|
+
end
|
575
|
+
end
|
576
|
+
else
|
577
|
+
context "when Active Job < 7.1 and 'discard'" do
|
578
|
+
it "sets activejob_report_errors to 'all'" do
|
579
|
+
expect(config[:activejob_report_errors]).to eq("all")
|
580
|
+
expect(config.override_config[:activejob_report_errors]).to eq("all")
|
581
|
+
end
|
582
|
+
end
|
583
|
+
end
|
584
|
+
end
|
585
|
+
end
|
562
586
|
end
|
563
587
|
|
564
588
|
describe "config keys" do
|
@@ -88,6 +88,14 @@ if DependencyHelper.active_job_present?
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
|
91
|
+
class ActiveJobErrorWithRetryTestJob < ActiveJob::Base
|
92
|
+
retry_on StandardError, :wait => 0.seconds, :attempts => 2
|
93
|
+
|
94
|
+
def perform
|
95
|
+
raise "uh oh"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
91
99
|
class ActiveJobCustomQueueTestJob < ActiveJob::Base
|
92
100
|
queue_as :custom_queue
|
93
101
|
|
@@ -99,6 +107,7 @@ if DependencyHelper.active_job_present?
|
|
99
107
|
after do
|
100
108
|
Object.send(:remove_const, :ActiveJobTestJob)
|
101
109
|
Object.send(:remove_const, :ActiveJobErrorTestJob)
|
110
|
+
Object.send(:remove_const, :ActiveJobErrorWithRetryTestJob)
|
102
111
|
Object.send(:remove_const, :ActiveJobCustomQueueTestJob)
|
103
112
|
end
|
104
113
|
|
@@ -107,7 +116,7 @@ if DependencyHelper.active_job_present?
|
|
107
116
|
expect(Appsignal).to receive(:increment_counter)
|
108
117
|
.with("active_job_queue_job_count", 1, tags.merge(:status => :processed))
|
109
118
|
|
110
|
-
|
119
|
+
queue_job(ActiveJobTestJob)
|
111
120
|
|
112
121
|
transaction = last_transaction
|
113
122
|
transaction_hash = transaction.to_h
|
@@ -120,7 +129,8 @@ if DependencyHelper.active_job_present?
|
|
120
129
|
"params" => [],
|
121
130
|
"tags" => {
|
122
131
|
"active_job_id" => kind_of(String),
|
123
|
-
"queue" => queue
|
132
|
+
"queue" => queue,
|
133
|
+
"executions" => 1
|
124
134
|
}
|
125
135
|
)
|
126
136
|
)
|
@@ -136,7 +146,7 @@ if DependencyHelper.active_job_present?
|
|
136
146
|
tags = { :queue => "custom_queue" }
|
137
147
|
expect(Appsignal).to receive(:increment_counter)
|
138
148
|
.with("active_job_queue_job_count", 1, tags.merge(:status => :processed))
|
139
|
-
|
149
|
+
queue_job(ActiveJobCustomQueueTestJob)
|
140
150
|
|
141
151
|
transaction = last_transaction
|
142
152
|
transaction_hash = transaction.to_h
|
@@ -170,7 +180,7 @@ if DependencyHelper.active_job_present?
|
|
170
180
|
.with("active_job_queue_priority_job_count", 1, tags.merge(:priority => 10,
|
171
181
|
:status => :processed))
|
172
182
|
|
173
|
-
|
183
|
+
queue_job(ActiveJobPriorityTestJob)
|
174
184
|
|
175
185
|
transaction = last_transaction
|
176
186
|
transaction_hash = transaction.to_h
|
@@ -193,7 +203,7 @@ if DependencyHelper.active_job_present?
|
|
193
203
|
.with("active_job_queue_job_count", 1, tags.merge(:status => :processed))
|
194
204
|
|
195
205
|
expect do
|
196
|
-
|
206
|
+
queue_job(ActiveJobErrorTestJob)
|
197
207
|
end.to raise_error(RuntimeError, "uh oh")
|
198
208
|
|
199
209
|
transaction = last_transaction
|
@@ -211,7 +221,8 @@ if DependencyHelper.active_job_present?
|
|
211
221
|
"params" => [],
|
212
222
|
"tags" => {
|
213
223
|
"active_job_id" => kind_of(String),
|
214
|
-
"queue" => queue
|
224
|
+
"queue" => queue,
|
225
|
+
"executions" => 1
|
215
226
|
}
|
216
227
|
)
|
217
228
|
)
|
@@ -227,23 +238,76 @@ if DependencyHelper.active_job_present?
|
|
227
238
|
Appsignal.config = project_fixture_config("production")
|
228
239
|
Appsignal.config[:activejob_report_errors] = "none"
|
229
240
|
|
230
|
-
# Other calls we're testing in another test
|
231
241
|
allow(Appsignal).to receive(:increment_counter)
|
232
242
|
tags = { :queue => queue }
|
233
243
|
expect(Appsignal).to receive(:increment_counter)
|
234
244
|
.with("active_job_queue_job_count", 1, tags.merge(:status => :failed))
|
235
|
-
expect(Appsignal).to receive(:increment_counter)
|
236
|
-
.with("active_job_queue_job_count", 1, tags.merge(:status => :processed))
|
237
245
|
|
238
246
|
expect do
|
239
|
-
|
247
|
+
queue_job(ActiveJobErrorTestJob)
|
240
248
|
end.to raise_error(RuntimeError, "uh oh")
|
241
249
|
|
242
250
|
transaction = last_transaction
|
243
251
|
transaction_hash = transaction.to_h
|
244
|
-
expect(transaction_hash).to include(
|
245
|
-
|
246
|
-
|
252
|
+
expect(transaction_hash).to include("error" => nil)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
if DependencyHelper.rails_version >= Gem::Version.new("7.1.0")
|
257
|
+
context "with activejob_report_errors set to discard" do
|
258
|
+
before do
|
259
|
+
Appsignal.config = project_fixture_config("production")
|
260
|
+
Appsignal.config[:activejob_report_errors] = "discard"
|
261
|
+
end
|
262
|
+
|
263
|
+
it "does not report error on first failure" do
|
264
|
+
with_test_adapter do
|
265
|
+
# Prevent the job from being instantly retried so we can test
|
266
|
+
# what happens before it's retried
|
267
|
+
allow_any_instance_of(ActiveJobErrorWithRetryTestJob).to receive(:retry_job)
|
268
|
+
|
269
|
+
queue_job(ActiveJobErrorWithRetryTestJob)
|
270
|
+
end
|
271
|
+
|
272
|
+
transaction = last_transaction
|
273
|
+
transaction_hash = transaction.to_h
|
274
|
+
expect(transaction_hash).to include(
|
275
|
+
"error" => nil,
|
276
|
+
"sample_data" => hash_including(
|
277
|
+
"tags" => hash_including(
|
278
|
+
"executions" => 1
|
279
|
+
)
|
280
|
+
)
|
281
|
+
)
|
282
|
+
end
|
283
|
+
|
284
|
+
it "reports error when discarding the job" do
|
285
|
+
allow(Appsignal).to receive(:increment_counter)
|
286
|
+
tags = { :queue => queue }
|
287
|
+
expect(Appsignal).to receive(:increment_counter)
|
288
|
+
.with("active_job_queue_job_count", 1, tags.merge(:status => :failed))
|
289
|
+
|
290
|
+
with_test_adapter do
|
291
|
+
expect do
|
292
|
+
queue_job(ActiveJobErrorWithRetryTestJob)
|
293
|
+
end.to raise_error(RuntimeError, "uh oh")
|
294
|
+
end
|
295
|
+
|
296
|
+
transaction = last_transaction
|
297
|
+
transaction_hash = transaction.to_h
|
298
|
+
expect(transaction_hash).to include(
|
299
|
+
"error" => {
|
300
|
+
"name" => "RuntimeError",
|
301
|
+
"message" => "uh oh",
|
302
|
+
"backtrace" => kind_of(String)
|
303
|
+
},
|
304
|
+
"sample_data" => hash_including(
|
305
|
+
"tags" => hash_including(
|
306
|
+
"executions" => 2
|
307
|
+
)
|
308
|
+
)
|
309
|
+
)
|
310
|
+
end
|
247
311
|
end
|
248
312
|
end
|
249
313
|
|
@@ -276,7 +340,7 @@ if DependencyHelper.active_job_present?
|
|
276
340
|
:status => :failed))
|
277
341
|
|
278
342
|
expect do
|
279
|
-
|
343
|
+
queue_job(ActiveJobErrorPriorityTestJob)
|
280
344
|
end.to raise_error(RuntimeError, "uh oh")
|
281
345
|
|
282
346
|
transaction = last_transaction
|
@@ -291,13 +355,31 @@ if DependencyHelper.active_job_present?
|
|
291
355
|
end
|
292
356
|
end
|
293
357
|
|
358
|
+
context "with retries" do
|
359
|
+
it "reports the number of retries as executions" do
|
360
|
+
with_test_adapter do
|
361
|
+
expect do
|
362
|
+
queue_job(ActiveJobErrorWithRetryTestJob)
|
363
|
+
end.to raise_error(RuntimeError, "uh oh")
|
364
|
+
end
|
365
|
+
|
366
|
+
transaction = last_transaction
|
367
|
+
transaction_hash = transaction.to_h
|
368
|
+
expect(transaction_hash).to include(
|
369
|
+
"sample_data" => hash_including(
|
370
|
+
"tags" => hash_including("executions" => 2)
|
371
|
+
)
|
372
|
+
)
|
373
|
+
end
|
374
|
+
end
|
375
|
+
|
294
376
|
context "when wrapped in another transaction" do
|
295
377
|
it "does not create a new transaction or close the currently open one" do
|
296
378
|
current_transaction = background_job_transaction
|
297
379
|
allow(current_transaction).to receive(:complete).and_call_original
|
298
380
|
set_current_transaction current_transaction
|
299
381
|
|
300
|
-
|
382
|
+
queue_job(ActiveJobTestJob)
|
301
383
|
|
302
384
|
expect(created_transactions.count).to eql(1)
|
303
385
|
expect(current_transaction).to_not have_received(:complete)
|
@@ -316,7 +398,8 @@ if DependencyHelper.active_job_present?
|
|
316
398
|
"params" => [],
|
317
399
|
"tags" => {
|
318
400
|
"active_job_id" => kind_of(String),
|
319
|
-
"queue" => queue
|
401
|
+
"queue" => queue,
|
402
|
+
"executions" => 1
|
320
403
|
}
|
321
404
|
)
|
322
405
|
)
|
@@ -333,7 +416,7 @@ if DependencyHelper.active_job_present?
|
|
333
416
|
it "filters the configured params" do
|
334
417
|
Appsignal.config = project_fixture_config("production")
|
335
418
|
Appsignal.config[:filter_parameters] = ["foo"]
|
336
|
-
|
419
|
+
queue_job(ActiveJobTestJob, method_given_args)
|
337
420
|
|
338
421
|
transaction = last_transaction
|
339
422
|
transaction_hash = transaction.to_h
|
@@ -382,7 +465,7 @@ if DependencyHelper.active_job_present?
|
|
382
465
|
end
|
383
466
|
|
384
467
|
it "sets provider_job_id as tag" do
|
385
|
-
|
468
|
+
queue_job(ProviderWrappedActiveJobTestJob)
|
386
469
|
|
387
470
|
transaction = last_transaction
|
388
471
|
transaction_hash = transaction.to_h
|
@@ -424,7 +507,7 @@ if DependencyHelper.active_job_present?
|
|
424
507
|
|
425
508
|
it "sets queue time on transaction" do
|
426
509
|
allow_any_instance_of(Appsignal::Transaction).to receive(:set_queue_start).and_call_original
|
427
|
-
|
510
|
+
queue_job(ProviderWrappedActiveJobTestJob)
|
428
511
|
|
429
512
|
transaction = last_transaction
|
430
513
|
queue_time = Time.parse("2020-10-10T10:10:10Z")
|
@@ -459,7 +542,8 @@ if DependencyHelper.active_job_present?
|
|
459
542
|
"deliver_now"] + active_job_args_wrapper,
|
460
543
|
"tags" => {
|
461
544
|
"active_job_id" => kind_of(String),
|
462
|
-
"queue" => "mailers"
|
545
|
+
"queue" => "mailers",
|
546
|
+
"executions" => 1
|
463
547
|
}
|
464
548
|
)
|
465
549
|
)
|
@@ -479,7 +563,8 @@ if DependencyHelper.active_job_present?
|
|
479
563
|
"deliver_now"] + active_job_args_wrapper(:args => method_expected_args),
|
480
564
|
"tags" => {
|
481
565
|
"active_job_id" => kind_of(String),
|
482
|
-
"queue" => "mailers"
|
566
|
+
"queue" => "mailers",
|
567
|
+
"executions" => 1
|
483
568
|
}
|
484
569
|
)
|
485
570
|
)
|
@@ -503,7 +588,8 @@ if DependencyHelper.active_job_present?
|
|
503
588
|
] + active_job_args_wrapper(:params => parameterized_expected_args),
|
504
589
|
"tags" => {
|
505
590
|
"active_job_id" => kind_of(String),
|
506
|
-
"queue" => "mailers"
|
591
|
+
"queue" => "mailers",
|
592
|
+
"executions" => 1
|
507
593
|
}
|
508
594
|
)
|
509
595
|
)
|
@@ -544,7 +630,8 @@ if DependencyHelper.active_job_present?
|
|
544
630
|
],
|
545
631
|
"tags" => {
|
546
632
|
"active_job_id" => kind_of(String),
|
547
|
-
"queue" => "mailers"
|
633
|
+
"queue" => "mailers",
|
634
|
+
"executions" => 1
|
548
635
|
}
|
549
636
|
)
|
550
637
|
)
|
@@ -570,7 +657,8 @@ if DependencyHelper.active_job_present?
|
|
570
657
|
],
|
571
658
|
"tags" => {
|
572
659
|
"active_job_id" => kind_of(String),
|
573
|
-
"queue" => "mailers"
|
660
|
+
"queue" => "mailers",
|
661
|
+
"executions" => 1
|
574
662
|
}
|
575
663
|
)
|
576
664
|
)
|
@@ -598,7 +686,8 @@ if DependencyHelper.active_job_present?
|
|
598
686
|
],
|
599
687
|
"tags" => {
|
600
688
|
"active_job_id" => kind_of(String),
|
601
|
-
"queue" => "mailers"
|
689
|
+
"queue" => "mailers",
|
690
|
+
"executions" => 1
|
602
691
|
}
|
603
692
|
)
|
604
693
|
)
|
@@ -607,11 +696,21 @@ if DependencyHelper.active_job_present?
|
|
607
696
|
end
|
608
697
|
end
|
609
698
|
|
699
|
+
def with_test_adapter
|
700
|
+
ActiveJob::Base.queue_adapter = :test
|
701
|
+
ActiveJob::Base.queue_adapter.performed_jobs.clear
|
702
|
+
ActiveJob::Base.queue_adapter.perform_enqueued_jobs = true
|
703
|
+
ActiveJob::Base.queue_adapter.perform_enqueued_at_jobs = true
|
704
|
+
yield
|
705
|
+
ensure
|
706
|
+
ActiveJob::Base.queue_adapter = :inline # Restore to default
|
707
|
+
end
|
708
|
+
|
610
709
|
def perform_active_job(&block)
|
611
710
|
Timecop.freeze(time, &block)
|
612
711
|
end
|
613
712
|
|
614
|
-
def
|
713
|
+
def queue_job(job_class, args = nil)
|
615
714
|
perform_active_job do
|
616
715
|
if args
|
617
716
|
job_class.perform_later(args)
|
@@ -17,7 +17,7 @@ describe Appsignal::Hooks::ResqueHook do
|
|
17
17
|
|
18
18
|
if DependencyHelper.resque_present?
|
19
19
|
describe "#install" do
|
20
|
-
def
|
20
|
+
def perform_rescue_job(klass, options = {})
|
21
21
|
payload = { "class" => klass.to_s }.merge(options)
|
22
22
|
job = ::Resque::Job.new(queue, payload)
|
23
23
|
keep_transactions { job.perform }
|
@@ -50,7 +50,7 @@ describe Appsignal::Hooks::ResqueHook do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
it "tracks a transaction on perform" do
|
53
|
-
|
53
|
+
perform_rescue_job(ResqueTestJob)
|
54
54
|
|
55
55
|
transaction = last_transaction
|
56
56
|
transaction_hash = transaction.to_h
|
@@ -72,7 +72,7 @@ describe Appsignal::Hooks::ResqueHook do
|
|
72
72
|
context "with error" do
|
73
73
|
it "tracks the error on the transaction" do
|
74
74
|
expect do
|
75
|
-
|
75
|
+
perform_rescue_job(ResqueErrorTestJob)
|
76
76
|
end.to raise_error(RuntimeError, "resque job error")
|
77
77
|
|
78
78
|
transaction = last_transaction
|
@@ -102,7 +102,7 @@ describe Appsignal::Hooks::ResqueHook do
|
|
102
102
|
end
|
103
103
|
|
104
104
|
it "filters out configured arguments" do
|
105
|
-
|
105
|
+
perform_rescue_job(
|
106
106
|
ResqueTestJob,
|
107
107
|
"args" => [
|
108
108
|
"foo",
|
@@ -161,7 +161,7 @@ describe Appsignal::Hooks::ResqueHook do
|
|
161
161
|
after { Object.send(:remove_const, :ActiveJobMock) }
|
162
162
|
|
163
163
|
it "does not set arguments but lets the ActiveJob integration handle it" do
|
164
|
-
|
164
|
+
perform_rescue_job(
|
165
165
|
ResqueTestJob,
|
166
166
|
"class" => "ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper",
|
167
167
|
"args" => [
|
@@ -10,7 +10,7 @@ describe Appsignal::Hooks::ShoryukenMiddleware do
|
|
10
10
|
before(:context) { start_agent }
|
11
11
|
around { |example| keep_transactions { example.run } }
|
12
12
|
|
13
|
-
def
|
13
|
+
def perform_shoryuken_job(&block)
|
14
14
|
block ||= lambda {}
|
15
15
|
Timecop.freeze(Time.parse(time)) do
|
16
16
|
Appsignal::Hooks::ShoryukenMiddleware.new.call(
|
@@ -34,7 +34,7 @@ describe Appsignal::Hooks::ShoryukenMiddleware do
|
|
34
34
|
|
35
35
|
it "wraps the job in a transaction with the correct params" do
|
36
36
|
allow_any_instance_of(Appsignal::Transaction).to receive(:set_queue_start).and_call_original
|
37
|
-
expect {
|
37
|
+
expect { perform_shoryuken_job }.to change { created_transactions.length }.by(1)
|
38
38
|
|
39
39
|
transaction = last_transaction
|
40
40
|
expect(transaction).to be_completed
|
@@ -80,7 +80,7 @@ describe Appsignal::Hooks::ShoryukenMiddleware do
|
|
80
80
|
end
|
81
81
|
|
82
82
|
it "filters selected arguments" do
|
83
|
-
|
83
|
+
perform_shoryuken_job
|
84
84
|
|
85
85
|
transaction_hash = last_transaction.to_h
|
86
86
|
expect(transaction_hash["sample_data"]).to include(
|
@@ -94,7 +94,7 @@ describe Appsignal::Hooks::ShoryukenMiddleware do
|
|
94
94
|
let(:body) { "foo bar" }
|
95
95
|
|
96
96
|
it "handles string arguments" do
|
97
|
-
|
97
|
+
perform_shoryuken_job
|
98
98
|
|
99
99
|
transaction_hash = last_transaction.to_h
|
100
100
|
expect(transaction_hash["sample_data"]).to include(
|
@@ -107,7 +107,7 @@ describe Appsignal::Hooks::ShoryukenMiddleware do
|
|
107
107
|
let(:body) { 1 }
|
108
108
|
|
109
109
|
it "handles primitive types as arguments" do
|
110
|
-
|
110
|
+
perform_shoryuken_job
|
111
111
|
|
112
112
|
transaction_hash = last_transaction.to_h
|
113
113
|
expect(transaction_hash["sample_data"]).to include(
|
@@ -121,7 +121,7 @@ describe Appsignal::Hooks::ShoryukenMiddleware do
|
|
121
121
|
it "sets the exception on the transaction" do
|
122
122
|
expect do
|
123
123
|
expect do
|
124
|
-
|
124
|
+
perform_shoryuken_job { raise ExampleException, "error message" }
|
125
125
|
end.to raise_error(ExampleException)
|
126
126
|
end.to change { created_transactions.length }.by(1)
|
127
127
|
|
@@ -167,7 +167,7 @@ describe Appsignal::Hooks::ShoryukenMiddleware do
|
|
167
167
|
it "creates a transaction for the batch" do
|
168
168
|
allow_any_instance_of(Appsignal::Transaction).to receive(:set_queue_start).and_call_original
|
169
169
|
expect do
|
170
|
-
|
170
|
+
perform_shoryuken_job {} # rubocop:disable Lint/EmptyBlock
|
171
171
|
end.to change { created_transactions.length }.by(1)
|
172
172
|
|
173
173
|
transaction = last_transaction
|
@@ -43,14 +43,14 @@ if DependencyHelper.que_present?
|
|
43
43
|
end
|
44
44
|
around { |example| keep_transactions { example.run } }
|
45
45
|
|
46
|
-
def
|
46
|
+
def perform_que_job(job)
|
47
47
|
job._run
|
48
48
|
end
|
49
49
|
|
50
50
|
context "success" do
|
51
51
|
it "creates a transaction for a job" do
|
52
52
|
expect do
|
53
|
-
|
53
|
+
perform_que_job(instance)
|
54
54
|
end.to change { created_transactions.length }.by(1)
|
55
55
|
|
56
56
|
expect(last_transaction).to be_completed
|
@@ -96,7 +96,7 @@ if DependencyHelper.que_present?
|
|
96
96
|
|
97
97
|
expect do
|
98
98
|
expect do
|
99
|
-
|
99
|
+
perform_que_job(instance)
|
100
100
|
end.to raise_error(ExampleException)
|
101
101
|
end.to change { created_transactions.length }.by(1)
|
102
102
|
|
@@ -131,7 +131,7 @@ if DependencyHelper.que_present?
|
|
131
131
|
it "reports errors and not re-raise them" do
|
132
132
|
allow(instance).to receive(:run).and_raise(error)
|
133
133
|
|
134
|
-
expect {
|
134
|
+
expect { perform_que_job(instance) }.to change { created_transactions.length }.by(1)
|
135
135
|
|
136
136
|
expect(last_transaction).to be_completed
|
137
137
|
transaction_hash = last_transaction.to_h
|
@@ -168,7 +168,7 @@ if DependencyHelper.que_present?
|
|
168
168
|
end
|
169
169
|
|
170
170
|
it "uses the custom action" do
|
171
|
-
|
171
|
+
perform_que_job(instance)
|
172
172
|
|
173
173
|
expect(last_transaction).to be_completed
|
174
174
|
transaction_hash = last_transaction.to_h
|
@@ -95,7 +95,7 @@ describe Appsignal::Integrations::SidekiqMiddleware, :with_yaml_parse_error => f
|
|
95
95
|
|
96
96
|
describe "internal Sidekiq job values" do
|
97
97
|
it "does not save internal Sidekiq values as metadata on transaction" do
|
98
|
-
|
98
|
+
perform_sidekiq_job
|
99
99
|
|
100
100
|
transaction_hash = transaction.to_h
|
101
101
|
expect(transaction_hash["metadata"].keys)
|
@@ -110,7 +110,7 @@ describe Appsignal::Integrations::SidekiqMiddleware, :with_yaml_parse_error => f
|
|
110
110
|
end
|
111
111
|
|
112
112
|
it "filters selected arguments" do
|
113
|
-
|
113
|
+
perform_sidekiq_job
|
114
114
|
|
115
115
|
transaction_hash = transaction.to_h
|
116
116
|
expect(transaction_hash["sample_data"]).to include(
|
@@ -133,7 +133,7 @@ describe Appsignal::Integrations::SidekiqMiddleware, :with_yaml_parse_error => f
|
|
133
133
|
end
|
134
134
|
|
135
135
|
it "replaces the last argument (the secret bag) with an [encrypted data] string" do
|
136
|
-
|
136
|
+
perform_sidekiq_job
|
137
137
|
|
138
138
|
transaction_hash = transaction.to_h
|
139
139
|
expect(transaction_hash["sample_data"]).to include(
|
@@ -159,7 +159,7 @@ describe Appsignal::Integrations::SidekiqMiddleware, :with_yaml_parse_error => f
|
|
159
159
|
end
|
160
160
|
|
161
161
|
it "uses the delayed class and method name for the action" do
|
162
|
-
|
162
|
+
perform_sidekiq_job
|
163
163
|
|
164
164
|
transaction_hash = transaction.to_h
|
165
165
|
expect(transaction_hash["action"]).to eq("DelayedTestClass.foo_method")
|
@@ -172,7 +172,7 @@ describe Appsignal::Integrations::SidekiqMiddleware, :with_yaml_parse_error => f
|
|
172
172
|
before { item["args"] = [] }
|
173
173
|
|
174
174
|
it "logs a warning and uses the default argument" do
|
175
|
-
|
175
|
+
perform_sidekiq_job
|
176
176
|
|
177
177
|
transaction_hash = transaction.to_h
|
178
178
|
expect(transaction_hash["action"]).to eq("Sidekiq::Extensions::DelayedClass#perform")
|
@@ -199,7 +199,7 @@ describe Appsignal::Integrations::SidekiqMiddleware, :with_yaml_parse_error => f
|
|
199
199
|
end
|
200
200
|
|
201
201
|
it "uses the delayed class and method name for the action" do
|
202
|
-
|
202
|
+
perform_sidekiq_job
|
203
203
|
|
204
204
|
transaction_hash = transaction.to_h
|
205
205
|
expect(transaction_hash["action"]).to eq("DelayedTestClass#foo_method")
|
@@ -212,7 +212,7 @@ describe Appsignal::Integrations::SidekiqMiddleware, :with_yaml_parse_error => f
|
|
212
212
|
before { item["args"] = [] }
|
213
213
|
|
214
214
|
it "logs a warning and uses the default argument" do
|
215
|
-
|
215
|
+
perform_sidekiq_job
|
216
216
|
|
217
217
|
transaction_hash = transaction.to_h
|
218
218
|
expect(transaction_hash["action"]).to eq("Sidekiq::Extensions::DelayedModel#perform")
|
@@ -233,7 +233,7 @@ describe Appsignal::Integrations::SidekiqMiddleware, :with_yaml_parse_error => f
|
|
233
233
|
expect(Appsignal).to receive(:increment_counter)
|
234
234
|
.with("sidekiq_queue_job_count", 1, { :queue => "default", :status => :processed })
|
235
235
|
expect do
|
236
|
-
|
236
|
+
perform_sidekiq_job { raise error, "uh oh" }
|
237
237
|
end.to raise_error(error)
|
238
238
|
|
239
239
|
transaction_hash = transaction.to_h
|
@@ -271,7 +271,7 @@ describe Appsignal::Integrations::SidekiqMiddleware, :with_yaml_parse_error => f
|
|
271
271
|
it "reports the worker name as the action, copies the namespace and tags" do
|
272
272
|
Appsignal.config = project_fixture_config("production")
|
273
273
|
with_rails_error_reporter do
|
274
|
-
|
274
|
+
perform_sidekiq_job do
|
275
275
|
Appsignal.tag_job("test_tag" => "value")
|
276
276
|
Rails.error.handle do
|
277
277
|
raise ExampleStandardError, "uh oh"
|
@@ -301,7 +301,7 @@ describe Appsignal::Integrations::SidekiqMiddleware, :with_yaml_parse_error => f
|
|
301
301
|
# https://github.com/rspec/rspec-mocks/issues/1460
|
302
302
|
expect(Appsignal).to receive(:increment_counter)
|
303
303
|
.with("sidekiq_queue_job_count", 1, { :queue => "default", :status => :processed })
|
304
|
-
|
304
|
+
perform_sidekiq_job
|
305
305
|
|
306
306
|
transaction_hash = transaction.to_h
|
307
307
|
expect(transaction_hash).to include(
|
@@ -330,7 +330,7 @@ describe Appsignal::Integrations::SidekiqMiddleware, :with_yaml_parse_error => f
|
|
330
330
|
end
|
331
331
|
end
|
332
332
|
|
333
|
-
def
|
333
|
+
def perform_sidekiq_job
|
334
334
|
Timecop.freeze(Time.parse("2001-01-01 10:01:00UTC")) do
|
335
335
|
exception = nil
|
336
336
|
plugin.call(worker, item, queue) do
|
@@ -407,7 +407,7 @@ if DependencyHelper.active_job_present?
|
|
407
407
|
end
|
408
408
|
end
|
409
409
|
let(:expected_tags) do
|
410
|
-
{}.tap do |hash|
|
410
|
+
{ "executions" => 1 }.tap do |hash|
|
411
411
|
hash["active_job_id"] = kind_of(String)
|
412
412
|
if DependencyHelper.rails_version >= Gem::Version.new("5.0.0")
|
413
413
|
hash["provider_job_id"] = kind_of(String)
|
@@ -460,7 +460,7 @@ if DependencyHelper.active_job_present?
|
|
460
460
|
end
|
461
461
|
|
462
462
|
it "reports the transaction from the ActiveJob integration" do
|
463
|
-
|
463
|
+
perform_sidekiq_job(ActiveJobSidekiqTestJob, given_args)
|
464
464
|
|
465
465
|
transaction = last_transaction
|
466
466
|
transaction_hash = transaction.to_h
|
@@ -488,7 +488,7 @@ if DependencyHelper.active_job_present?
|
|
488
488
|
context "with error" do
|
489
489
|
it "reports the error on the transaction from the ActiveRecord integration" do
|
490
490
|
expect do
|
491
|
-
|
491
|
+
perform_sidekiq_job(ActiveJobSidekiqErrorTestJob, given_args)
|
492
492
|
end.to raise_error(RuntimeError, "uh oh")
|
493
493
|
|
494
494
|
transaction = last_transaction
|
@@ -557,7 +557,7 @@ if DependencyHelper.active_job_present?
|
|
557
557
|
end
|
558
558
|
end
|
559
559
|
|
560
|
-
def
|
560
|
+
def perform_sidekiq_job(job_class, args)
|
561
561
|
perform_sidekiq { job_class.perform_later(args) }
|
562
562
|
end
|
563
563
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appsignal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.7.
|
4
|
+
version: 3.7.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Beekman
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-05-
|
13
|
+
date: 2024-05-08 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|
@@ -452,7 +452,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
452
452
|
- !ruby/object:Gem::Version
|
453
453
|
version: '0'
|
454
454
|
requirements: []
|
455
|
-
rubygems_version: 3.5.
|
455
|
+
rubygems_version: 3.5.10
|
456
456
|
signing_key:
|
457
457
|
specification_version: 4
|
458
458
|
summary: Logs performance and exception data from your app to appsignal.com
|