appsignal 2.11.0.alpha.2 → 2.11.0.beta.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/.semaphore/semaphore.yml +94 -10
  4. data/CHANGELOG.md +31 -1
  5. data/README.md +4 -4
  6. data/Rakefile +16 -4
  7. data/appsignal.gemspec +1 -1
  8. data/build_matrix.yml +7 -3
  9. data/ext/Rakefile +2 -0
  10. data/ext/agent.yml +19 -19
  11. data/ext/base.rb +7 -0
  12. data/ext/extconf.rb +2 -0
  13. data/gemfiles/rails-4.2.gemfile +9 -2
  14. data/gemfiles/rails-5.0.gemfile +1 -0
  15. data/gemfiles/rails-5.1.gemfile +1 -0
  16. data/gemfiles/rails-5.2.gemfile +1 -0
  17. data/gemfiles/rails-6.0.gemfile +1 -0
  18. data/gemfiles/resque-1.gemfile +7 -0
  19. data/gemfiles/{resque.gemfile → resque-2.gemfile} +1 -1
  20. data/lib/appsignal.rb +1 -0
  21. data/lib/appsignal/auth_check.rb +4 -2
  22. data/lib/appsignal/cli/diagnose.rb +1 -1
  23. data/lib/appsignal/config.rb +35 -2
  24. data/lib/appsignal/extension.rb +6 -5
  25. data/lib/appsignal/extension/jruby.rb +6 -5
  26. data/lib/appsignal/hooks.rb +25 -0
  27. data/lib/appsignal/hooks/active_job.rb +137 -0
  28. data/lib/appsignal/hooks/puma.rb +0 -1
  29. data/lib/appsignal/hooks/resque.rb +60 -0
  30. data/lib/appsignal/hooks/sidekiq.rb +17 -94
  31. data/lib/appsignal/integrations/delayed_job_plugin.rb +1 -1
  32. data/lib/appsignal/integrations/que.rb +1 -1
  33. data/lib/appsignal/integrations/resque.rb +9 -12
  34. data/lib/appsignal/integrations/resque_active_job.rb +9 -32
  35. data/lib/appsignal/probes.rb +7 -0
  36. data/lib/appsignal/probes/puma.rb +1 -1
  37. data/lib/appsignal/probes/sidekiq.rb +3 -1
  38. data/lib/appsignal/transaction.rb +10 -0
  39. data/lib/appsignal/utils/deprecation_message.rb +6 -2
  40. data/lib/appsignal/version.rb +1 -1
  41. data/spec/lib/appsignal/auth_check_spec.rb +23 -0
  42. data/spec/lib/appsignal/capistrano2_spec.rb +1 -1
  43. data/spec/lib/appsignal/capistrano3_spec.rb +1 -1
  44. data/spec/lib/appsignal/cli/diagnose_spec.rb +42 -0
  45. data/spec/lib/appsignal/config_spec.rb +21 -0
  46. data/spec/lib/appsignal/extension/jruby_spec.rb +31 -28
  47. data/spec/lib/appsignal/extension_install_failure_spec.rb +23 -0
  48. data/spec/lib/appsignal/hooks/activejob_spec.rb +591 -0
  49. data/spec/lib/appsignal/hooks/delayed_job_spec.rb +3 -14
  50. data/spec/lib/appsignal/hooks/resque_spec.rb +185 -0
  51. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +222 -268
  52. data/spec/lib/appsignal/hooks_spec.rb +57 -0
  53. data/spec/lib/appsignal/integrations/que_spec.rb +25 -6
  54. data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +20 -179
  55. data/spec/lib/appsignal/integrations/resque_spec.rb +20 -85
  56. data/spec/lib/appsignal/marker_spec.rb +1 -1
  57. data/spec/lib/appsignal/probes/sidekiq_spec.rb +10 -7
  58. data/spec/lib/appsignal/transaction_spec.rb +5 -7
  59. data/spec/spec_helper.rb +5 -0
  60. data/spec/support/helpers/action_mailer_helpers.rb +25 -0
  61. data/spec/support/helpers/config_helpers.rb +3 -2
  62. data/spec/support/helpers/dependency_helper.rb +9 -2
  63. data/spec/support/helpers/transaction_helpers.rb +6 -0
  64. data/spec/support/stubs/sidekiq/api.rb +1 -1
  65. data/spec/support/testing.rb +19 -19
  66. metadata +16 -4
@@ -4,7 +4,7 @@ describe Appsignal::Marker do
4
4
  described_class.new(
5
5
  {
6
6
  :revision => "503ce0923ed177a3ce000005",
7
- :repository => "master",
7
+ :repository => "main",
8
8
  :user => "batman",
9
9
  :rails_env => "production"
10
10
  },
@@ -7,7 +7,7 @@ describe Appsignal::Probes::SidekiqProbe do
7
7
  let(:expected_default_tags) { { :hostname => "localhost" } }
8
8
  before do
9
9
  Appsignal.config = project_fixture_config
10
- module Sidekiq
10
+ module SidekiqMock
11
11
  def self.redis_info
12
12
  {
13
13
  "connected_clients" => 2,
@@ -88,15 +88,14 @@ describe Appsignal::Probes::SidekiqProbe do
88
88
  end
89
89
  end
90
90
  end
91
+ stub_const("Sidekiq", SidekiqMock)
91
92
  end
92
- after { Object.send(:remove_const, "Sidekiq") }
93
+ after { Object.send(:remove_const, :SidekiqMock) }
93
94
 
94
95
  describe ".dependencies_present?" do
95
96
  before do
96
- class Redis; end
97
- Redis.const_set(:VERSION, version)
97
+ stub_const("Redis::VERSION", version)
98
98
  end
99
- after { Object.send(:remove_const, "Redis") }
100
99
 
101
100
  context "when Redis version is < 3.3.5" do
102
101
  let(:version) { "3.3.4" }
@@ -116,9 +115,13 @@ describe Appsignal::Probes::SidekiqProbe do
116
115
  end
117
116
 
118
117
  it "loads Sidekiq::API" do
119
- expect(defined?(Sidekiq::API)).to be_falsy
118
+ # Hide the Sidekiq constant if it was already loaded. It will be
119
+ # redefined by loading "sidekiq/api" in the probe.
120
+ hide_const "Sidekiq::Stats"
121
+
122
+ expect(defined?(Sidekiq::Stats)).to be_falsy
120
123
  probe
121
- expect(defined?(Sidekiq::API)).to be_truthy
124
+ expect(defined?(Sidekiq::Stats)).to be_truthy
122
125
  end
123
126
 
124
127
  it "logs config on initialize" do
@@ -473,22 +473,20 @@ describe Appsignal::Transaction do
473
473
  end
474
474
  end
475
475
 
476
- describe "set_queue_start" do
477
- it "should set the queue start in extension" do
478
- expect(transaction.ext).to receive(:set_queue_start).with(
479
- 10.0
480
- ).once
476
+ describe "#set_queue_start" do
477
+ it "sets the queue start in extension" do
478
+ expect(transaction.ext).to receive(:set_queue_start).with(10.0).once
481
479
 
482
480
  transaction.set_queue_start(10.0)
483
481
  end
484
482
 
485
- it "should not set the queue start in extension when value is nil" do
483
+ it "does not set the queue start in extension when value is nil" do
486
484
  expect(transaction.ext).to_not receive(:set_queue_start)
487
485
 
488
486
  transaction.set_queue_start(nil)
489
487
  end
490
488
 
491
- it "should not raise an error when the queue start is too big" do
489
+ it "does not raise an error when the queue start is too big" do
492
490
  expect(transaction.ext).to receive(:set_queue_start).and_raise(RangeError)
493
491
 
494
492
  expect(Appsignal.logger).to receive(:warn).with("Queue start value 10 is too big")
@@ -65,6 +65,10 @@ RSpec.configure do |config|
65
65
 
66
66
  config.example_status_persistence_file_path = "spec/examples.txt"
67
67
  config.fail_if_no_examples = true
68
+ config.filter_run_excluding(
69
+ :extension_installation_failure => true,
70
+ :jruby => !DependencyHelper.running_jruby?
71
+ )
68
72
  config.mock_with :rspec do |mocks|
69
73
  mocks.syntax = :expect
70
74
  end
@@ -111,6 +115,7 @@ RSpec.configure do |config|
111
115
  # in the diagnose task, so add it manually to the list of to-be cleaned up
112
116
  # keys.
113
117
  env_keys << "_APPSIGNAL_DIAGNOSE"
118
+ env_keys << "_TEST_APPSIGNAL_EXTENSION_FAILURE"
114
119
  env_keys.each do |key|
115
120
  # First set the ENV var to an empty string and then delete the key from
116
121
  # the env. We set the env var to an empty string first as JRuby doesn't
@@ -0,0 +1,25 @@
1
+ module ActionMailerHelpers
2
+ def perform_action_mailer(mailer, method, args = nil)
3
+ if DependencyHelper.rails_version >= Gem::Version.new("5.2.0")
4
+ case args
5
+ when Array
6
+ mailer.send(method, *args).deliver_later
7
+ when Hash
8
+ mailer.with(args).send(method).deliver_later
9
+ when NilClass
10
+ mailer.send(method).deliver_later
11
+ else
12
+ raise "Unknown scenario for arguments: #{args}"
13
+ end
14
+ else
15
+ # Rails 5.1 and lower
16
+ mailer_object =
17
+ if args
18
+ mailer.send(method, *args)
19
+ else
20
+ mailer.send(method)
21
+ end
22
+ mailer_object.deliver_later
23
+ end
24
+ end
25
+ end
@@ -5,12 +5,13 @@ module ConfigHelpers
5
5
  )
6
6
  end
7
7
 
8
- def project_fixture_config(env = "production", initial_config = {}, logger = Appsignal.logger)
8
+ def project_fixture_config(env = "production", initial_config = {}, logger = Appsignal.logger, config_file = nil)
9
9
  Appsignal::Config.new(
10
10
  project_fixture_path,
11
11
  env,
12
12
  initial_config,
13
- logger
13
+ logger,
14
+ config_file
14
15
  )
15
16
  end
16
17
 
@@ -1,6 +1,10 @@
1
1
  module DependencyHelper
2
2
  module_function
3
3
 
4
+ def ruby_version
5
+ Gem::Version.new(RUBY_VERSION)
6
+ end
7
+
4
8
  def running_jruby?
5
9
  defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
6
10
  end
@@ -10,8 +14,11 @@ module DependencyHelper
10
14
  end
11
15
 
12
16
  def rails6_present?
13
- rails_present? &&
14
- Gem.loaded_specs["rails"].version >= Gem::Version.new("6.0.0")
17
+ rails_present? && rails_version >= Gem::Version.new("6.0.0")
18
+ end
19
+
20
+ def rails_version
21
+ Gem.loaded_specs["rails"].version
15
22
  end
16
23
 
17
24
  def sequel_present?
@@ -44,6 +44,12 @@ module TransactionHelpers
44
44
  created_transactions.last
45
45
  end
46
46
 
47
+ # Set current transaction manually.
48
+ # Cleared by {clear_current_transaction!}
49
+ def set_current_transaction(transaction) # rubocop:disable Naming/AccessorMethodName
50
+ Thread.current[:appsignal_transaction] = transaction
51
+ end
52
+
47
53
  # Use when {Appsignal::Transaction.clear_current_transaction!} is stubbed to
48
54
  # clear the current transaction on the current thread.
49
55
  def clear_current_transaction!
@@ -1,4 +1,4 @@
1
1
  module Sidekiq
2
- class API
2
+ class Stats
3
3
  end
4
4
  end
@@ -38,25 +38,9 @@ module Appsignal
38
38
  end
39
39
  end
40
40
 
41
- class Transaction
42
- class << self
43
- alias original_new new
44
-
45
- # Override the {Appsignal::Transaction.new} method so we can track which
46
- # transactions are created on the {Appsignal::Testing.transactions} list.
47
- #
48
- # @see TransactionHelpers#last_transaction
49
- def new(*args)
50
- transaction = original_new(*args)
51
- Appsignal::Testing.transactions << transaction
52
- transaction
53
- end
54
- end
55
- end
56
-
57
41
  class Extension
58
42
  class Transaction
59
- alias original_finish finish
43
+ alias original_finish finish if method_defined? :finish
60
44
 
61
45
  # Override default {Extension::Transaction#finish} behavior to always
62
46
  # return true, which tells the transaction to add its sample data (unless
@@ -72,7 +56,7 @@ module Appsignal
72
56
  return_value
73
57
  end
74
58
 
75
- alias original_complete complete
59
+ alias original_complete complete if method_defined? :complete
76
60
 
77
61
  # Override default {Extension::Transaction#complete} behavior to
78
62
  # store the transaction JSON before the transaction is completed
@@ -94,7 +78,7 @@ module Appsignal
94
78
  @completed || false
95
79
  end
96
80
 
97
- alias original_to_json to_json
81
+ alias original_to_json to_json if method_defined? :to_json
98
82
 
99
83
  # Override default {Extension::Transaction#to_json} behavior to
100
84
  # return the stored the transaction JSON when the transaction was
@@ -111,3 +95,19 @@ module Appsignal
111
95
  end
112
96
  end
113
97
  end
98
+
99
+ module AppsignalTest
100
+ module Transaction
101
+ # Override the {Appsignal::Transaction.new} method so we can track which
102
+ # transactions are created on the {Appsignal::Testing.transactions} list.
103
+ #
104
+ # @see TransactionHelpers#last_transaction
105
+ def new(*_args)
106
+ transaction = super
107
+ Appsignal::Testing.transactions << transaction
108
+ transaction
109
+ end
110
+ end
111
+ end
112
+
113
+ Appsignal::Transaction.extend(AppsignalTest::Transaction)
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: 2.11.0.alpha.2
4
+ version: 2.11.0.beta.5
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: 2020-07-02 00:00:00.000000000 Z
13
+ date: 2020-07-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -172,7 +172,8 @@ files:
172
172
  - gemfiles/rails-5.1.gemfile
173
173
  - gemfiles/rails-5.2.gemfile
174
174
  - gemfiles/rails-6.0.gemfile
175
- - gemfiles/resque.gemfile
175
+ - gemfiles/resque-1.gemfile
176
+ - gemfiles/resque-2.gemfile
176
177
  - gemfiles/sequel-435.gemfile
177
178
  - gemfiles/sequel.gemfile
178
179
  - gemfiles/sinatra.gemfile
@@ -206,6 +207,7 @@ files:
206
207
  - lib/appsignal/helpers/metrics.rb
207
208
  - lib/appsignal/hooks.rb
208
209
  - lib/appsignal/hooks/action_cable.rb
210
+ - lib/appsignal/hooks/active_job.rb
209
211
  - lib/appsignal/hooks/active_support_notifications.rb
210
212
  - lib/appsignal/hooks/celluloid.rb
211
213
  - lib/appsignal/hooks/data_mapper.rb
@@ -217,6 +219,7 @@ files:
217
219
  - lib/appsignal/hooks/que.rb
218
220
  - lib/appsignal/hooks/rake.rb
219
221
  - lib/appsignal/hooks/redis.rb
222
+ - lib/appsignal/hooks/resque.rb
220
223
  - lib/appsignal/hooks/sequel.rb
221
224
  - lib/appsignal/hooks/shoryuken.rb
222
225
  - lib/appsignal/hooks/sidekiq.rb
@@ -241,6 +244,7 @@ files:
241
244
  - lib/appsignal/logger.rb
242
245
  - lib/appsignal/marker.rb
243
246
  - lib/appsignal/minutely.rb
247
+ - lib/appsignal/probes.rb
244
248
  - lib/appsignal/probes/puma.rb
245
249
  - lib/appsignal/probes/sidekiq.rb
246
250
  - lib/appsignal/rack/generic_instrumentation.rb
@@ -287,10 +291,12 @@ files:
287
291
  - spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb
288
292
  - spec/lib/appsignal/event_formatter_spec.rb
289
293
  - spec/lib/appsignal/extension/jruby_spec.rb
294
+ - spec/lib/appsignal/extension_install_failure_spec.rb
290
295
  - spec/lib/appsignal/extension_spec.rb
291
296
  - spec/lib/appsignal/garbage_collection_profiler_spec.rb
292
297
  - spec/lib/appsignal/hooks/action_cable_spec.rb
293
298
  - spec/lib/appsignal/hooks/active_support_notifications_spec.rb
299
+ - spec/lib/appsignal/hooks/activejob_spec.rb
294
300
  - spec/lib/appsignal/hooks/celluloid_spec.rb
295
301
  - spec/lib/appsignal/hooks/data_mapper_spec.rb
296
302
  - spec/lib/appsignal/hooks/delayed_job_spec.rb
@@ -301,6 +307,7 @@ files:
301
307
  - spec/lib/appsignal/hooks/que_spec.rb
302
308
  - spec/lib/appsignal/hooks/rake_spec.rb
303
309
  - spec/lib/appsignal/hooks/redis_spec.rb
310
+ - spec/lib/appsignal/hooks/resque_spec.rb
304
311
  - spec/lib/appsignal/hooks/sequel_spec.rb
305
312
  - spec/lib/appsignal/hooks/shoryuken_spec.rb
306
313
  - spec/lib/appsignal/hooks/sidekiq_spec.rb
@@ -348,6 +355,7 @@ files:
348
355
  - spec/support/fixtures/projects/valid/config/environments/test.rb
349
356
  - spec/support/fixtures/projects/valid/log/.gitkeep
350
357
  - spec/support/fixtures/uploaded_file.txt
358
+ - spec/support/helpers/action_mailer_helpers.rb
351
359
  - spec/support/helpers/api_request_helper.rb
352
360
  - spec/support/helpers/cli_helpers.rb
353
361
  - spec/support/helpers/config_helpers.rb
@@ -382,7 +390,7 @@ licenses:
382
390
  - MIT
383
391
  metadata:
384
392
  bug_tracker_uri: https://github.com/appsignal/appsignal-ruby/issues
385
- changelog_uri: https://github.com/appsignal/appsignal-ruby/blob/master/CHANGELOG.md
393
+ changelog_uri: https://github.com/appsignal/appsignal-ruby/blob/main/CHANGELOG.md
386
394
  documentation_uri: https://docs.appsignal.com/ruby/
387
395
  homepage_uri: https://docs.appsignal.com/ruby/
388
396
  source_code_uri: https://github.com/appsignal/appsignal-ruby
@@ -431,10 +439,12 @@ test_files:
431
439
  - spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb
432
440
  - spec/lib/appsignal/event_formatter_spec.rb
433
441
  - spec/lib/appsignal/extension/jruby_spec.rb
442
+ - spec/lib/appsignal/extension_install_failure_spec.rb
434
443
  - spec/lib/appsignal/extension_spec.rb
435
444
  - spec/lib/appsignal/garbage_collection_profiler_spec.rb
436
445
  - spec/lib/appsignal/hooks/action_cable_spec.rb
437
446
  - spec/lib/appsignal/hooks/active_support_notifications_spec.rb
447
+ - spec/lib/appsignal/hooks/activejob_spec.rb
438
448
  - spec/lib/appsignal/hooks/celluloid_spec.rb
439
449
  - spec/lib/appsignal/hooks/data_mapper_spec.rb
440
450
  - spec/lib/appsignal/hooks/delayed_job_spec.rb
@@ -445,6 +455,7 @@ test_files:
445
455
  - spec/lib/appsignal/hooks/que_spec.rb
446
456
  - spec/lib/appsignal/hooks/rake_spec.rb
447
457
  - spec/lib/appsignal/hooks/redis_spec.rb
458
+ - spec/lib/appsignal/hooks/resque_spec.rb
448
459
  - spec/lib/appsignal/hooks/sequel_spec.rb
449
460
  - spec/lib/appsignal/hooks/shoryuken_spec.rb
450
461
  - spec/lib/appsignal/hooks/sidekiq_spec.rb
@@ -492,6 +503,7 @@ test_files:
492
503
  - spec/support/fixtures/projects/valid/config/environments/test.rb
493
504
  - spec/support/fixtures/projects/valid/log/.gitkeep
494
505
  - spec/support/fixtures/uploaded_file.txt
506
+ - spec/support/helpers/action_mailer_helpers.rb
495
507
  - spec/support/helpers/api_request_helper.rb
496
508
  - spec/support/helpers/cli_helpers.rb
497
509
  - spec/support/helpers/config_helpers.rb