appsignal 3.13.0 → 4.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +499 -487
  3. data/CHANGELOG.md +113 -0
  4. data/Rakefile +31 -7
  5. data/benchmark.rake +4 -6
  6. data/build_matrix.yml +45 -39
  7. data/ext/agent.rb +27 -27
  8. data/ext/appsignal_extension.c +25 -0
  9. data/gemfiles/rails-7.2.gemfile +11 -0
  10. data/lib/appsignal/check_in/cron.rb +2 -15
  11. data/lib/appsignal/cli/diagnose.rb +37 -28
  12. data/lib/appsignal/cli/install.rb +5 -1
  13. data/lib/appsignal/config.rb +57 -119
  14. data/lib/appsignal/demo.rb +2 -2
  15. data/lib/appsignal/extension/jruby.rb +14 -0
  16. data/lib/appsignal/helpers/instrumentation.rb +139 -417
  17. data/lib/appsignal/helpers/metrics.rb +0 -16
  18. data/lib/appsignal/hooks/action_cable.rb +8 -8
  19. data/lib/appsignal/hooks/active_job.rb +2 -2
  20. data/lib/appsignal/hooks/at_exit.rb +37 -0
  21. data/lib/appsignal/hooks.rb +1 -16
  22. data/lib/appsignal/integrations/action_cable.rb +2 -2
  23. data/lib/appsignal/integrations/capistrano/appsignal.cap +2 -4
  24. data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +1 -4
  25. data/lib/appsignal/integrations/delayed_job_plugin.rb +3 -3
  26. data/lib/appsignal/integrations/que.rb +2 -2
  27. data/lib/appsignal/integrations/railtie.rb +26 -59
  28. data/lib/appsignal/integrations/rake.rb +2 -2
  29. data/lib/appsignal/integrations/resque.rb +2 -2
  30. data/lib/appsignal/integrations/shoryuken.rb +4 -4
  31. data/lib/appsignal/integrations/sidekiq.rb +3 -3
  32. data/lib/appsignal/integrations/webmachine.rb +2 -2
  33. data/lib/appsignal/loaders.rb +1 -1
  34. data/lib/appsignal/probes.rb +0 -9
  35. data/lib/appsignal/rack/abstract_middleware.rb +4 -26
  36. data/lib/appsignal/rack/event_handler.rb +4 -4
  37. data/lib/appsignal/rack/rails_instrumentation.rb +1 -1
  38. data/lib/appsignal/rack.rb +0 -25
  39. data/lib/appsignal/sample_data.rb +95 -0
  40. data/lib/appsignal/transaction.rb +235 -361
  41. data/lib/appsignal/utils/rails_helper.rb +4 -0
  42. data/lib/appsignal/version.rb +1 -1
  43. data/lib/appsignal.rb +19 -71
  44. data/spec/lib/appsignal/auth_check_spec.rb +1 -1
  45. data/spec/lib/appsignal/capistrano2_spec.rb +1 -1
  46. data/spec/lib/appsignal/capistrano3_spec.rb +53 -13
  47. data/spec/lib/appsignal/check_in_spec.rb +1 -207
  48. data/spec/lib/appsignal/cli/demo_spec.rb +7 -27
  49. data/spec/lib/appsignal/cli/diagnose_spec.rb +145 -110
  50. data/spec/lib/appsignal/config_spec.rb +304 -379
  51. data/spec/lib/appsignal/extension_install_failure_spec.rb +5 -1
  52. data/spec/lib/appsignal/extension_spec.rb +5 -1
  53. data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +1 -1
  54. data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +1 -2
  55. data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +1 -0
  56. data/spec/lib/appsignal/hooks/activejob_spec.rb +7 -12
  57. data/spec/lib/appsignal/hooks/at_exit_spec.rb +72 -0
  58. data/spec/lib/appsignal/hooks/gvl_spec.rb +10 -5
  59. data/spec/lib/appsignal/hooks/http_spec.rb +3 -3
  60. data/spec/lib/appsignal/hooks/net_http_spec.rb +3 -3
  61. data/spec/lib/appsignal/hooks/rake_spec.rb +6 -9
  62. data/spec/lib/appsignal/hooks/redis_client_spec.rb +5 -10
  63. data/spec/lib/appsignal/hooks/redis_spec.rb +4 -7
  64. data/spec/lib/appsignal/hooks/resque_spec.rb +3 -5
  65. data/spec/lib/appsignal/hooks_spec.rb +0 -41
  66. data/spec/lib/appsignal/integrations/data_mapper_spec.rb +29 -20
  67. data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +4 -9
  68. data/spec/lib/appsignal/integrations/railtie_spec.rb +179 -157
  69. data/spec/lib/appsignal/integrations/shoryuken_spec.rb +3 -5
  70. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +48 -62
  71. data/spec/lib/appsignal/loaders/hanami_spec.rb +6 -9
  72. data/spec/lib/appsignal/loaders/padrino_spec.rb +6 -10
  73. data/spec/lib/appsignal/loaders/sinatra_spec.rb +6 -9
  74. data/spec/lib/appsignal/loaders_spec.rb +8 -1
  75. data/spec/lib/appsignal/marker_spec.rb +1 -1
  76. data/spec/lib/appsignal/probes_spec.rb +4 -83
  77. data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +4 -63
  78. data/spec/lib/appsignal/rack/event_handler_spec.rb +18 -15
  79. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +3 -11
  80. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +4 -5
  81. data/spec/lib/appsignal/sample_data_spec.rb +174 -0
  82. data/spec/lib/appsignal/transaction_spec.rb +791 -1031
  83. data/spec/lib/appsignal/transmitter_spec.rb +6 -8
  84. data/spec/lib/appsignal_spec.rb +294 -643
  85. data/spec/spec_helper.rb +1 -3
  86. data/spec/support/fixtures/projects/valid/config/appsignal.yml +4 -7
  87. data/spec/support/fixtures/projects/valid_with_rails_app/config/application.rb +16 -0
  88. data/spec/support/fixtures/projects/valid_with_rails_app/config/appsignal.yml +56 -0
  89. data/spec/support/fixtures/projects/valid_with_rails_app/config/environment.rb +5 -0
  90. data/spec/support/helpers/api_request_helper.rb +3 -2
  91. data/spec/support/helpers/config_helpers.rb +41 -11
  92. data/spec/support/helpers/dependency_helper.rb +8 -0
  93. data/spec/support/helpers/log_helpers.rb +1 -0
  94. data/spec/support/helpers/rails_helper.rb +6 -6
  95. data/spec/support/helpers/transaction_helpers.rb +2 -24
  96. data/spec/support/matchers/transaction.rb +3 -3
  97. data/spec/support/mocks/appsignal_mock.rb +3 -3
  98. data/spec/support/mocks/mock_probe.rb +2 -0
  99. data/spec/support/testing.rb +2 -2
  100. metadata +12 -22
  101. data/gemfiles/que_beta.gemfile +0 -5
  102. data/lib/appsignal/helpers/heartbeat.rb +0 -20
  103. data/lib/appsignal/integrations/grape.rb +0 -35
  104. data/lib/appsignal/integrations/hanami.rb +0 -13
  105. data/lib/appsignal/integrations/padrino.rb +0 -13
  106. data/lib/appsignal/integrations/sinatra.rb +0 -13
  107. data/lib/appsignal/rack/generic_instrumentation.rb +0 -22
  108. data/lib/appsignal/rack/streaming_listener.rb +0 -28
  109. data/spec/lib/appsignal/integrations/grape_spec.rb +0 -36
  110. data/spec/lib/appsignal/integrations/hanami_spec.rb +0 -17
  111. data/spec/lib/appsignal/integrations/padrino_spec.rb +0 -15
  112. data/spec/lib/appsignal/integrations/sinatra_spec.rb +0 -15
  113. data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +0 -81
  114. data/spec/lib/appsignal/rack/streaming_listener_spec.rb +0 -69
  115. data/spec/support/fixtures/projects/valid/config/environments/development.rb +0 -0
  116. data/spec/support/fixtures/projects/valid/config/environments/production.rb +0 -0
  117. data/spec/support/fixtures/projects/valid/config/environments/test.rb +0 -0
  118. data/spec/support/rails/my_app.rb +0 -6
  119. /data/spec/support/fixtures/projects/{valid/config/application.rb → valid_with_rails_app/log/.gitkeep} +0 -0
@@ -3,19 +3,9 @@ if DependencyHelper.rails_present?
3
3
 
4
4
  describe Appsignal::Integrations::Railtie do
5
5
  include RailsHelper
6
-
6
+ before { Appsignal.clear! }
7
7
  after { clear_rails_error_reporter! }
8
8
 
9
- module RailtieHelper
10
- def self.ensure_initialize!
11
- return if @initialized
12
-
13
- MyApp::Application.config.root = ConfigHelpers.project_fixture_path
14
- MyApp::Application.initialize!
15
- @initialized = true
16
- end
17
- end
18
-
19
9
  def expect_middleware_to_match(middleware, klass, args)
20
10
  expect(middleware.klass).to eq(klass)
21
11
  expect(middleware.args).to match(args)
@@ -26,23 +16,32 @@ if DependencyHelper.rails_present?
26
16
  expect(Appsignal::Integrations::Railtie).to receive(:on_load).and_call_original
27
17
  expect(Appsignal::Integrations::Railtie).to receive(:after_initialize).and_call_original
28
18
 
29
- RailtieHelper.ensure_initialize!
19
+ if MyApp::Application.initialized?
20
+ run_appsignal_railtie
21
+ else
22
+ MyApp::Application.initialize!
23
+ end
30
24
  end
31
25
  end
32
26
 
33
27
  describe "initializer" do
34
28
  let(:app) { MyApp::Application.new }
35
29
  before do
36
- RailtieHelper.ensure_initialize!
37
- Appsignal.config = nil
30
+ # Make sure it's initialized at least once
31
+ MyApp::Application.initialize!
32
+ Appsignal.clear!
38
33
  end
39
34
 
40
35
  def initialize_railtie(event)
41
- MyApp::Application.config.root = project_fixture_path
36
+ MyApp::Application.config.root = rails_project_fixture_path
42
37
  case event
43
38
  when :on_load
44
39
  described_class.on_load(app)
45
40
  when :after_initialize
41
+ # Must call both so no steps are missed
42
+ described_class.on_load(app)
43
+ described_class.after_initialize(app)
44
+ when :only_after_initialize
46
45
  described_class.after_initialize(app)
47
46
  else
48
47
  raise "Unsupported test event '#{event}'"
@@ -56,19 +55,6 @@ if DependencyHelper.rails_present?
56
55
  expect(Appsignal.active?).to be_truthy
57
56
  end
58
57
 
59
- it "doesn't overwrite the config if a config is already present " do
60
- Appsignal.config = Appsignal::Config.new(
61
- Dir.pwd,
62
- "my_env",
63
- :some_config => "some value"
64
- )
65
- initialize_railtie(event)
66
-
67
- expect(Appsignal.config.env).to eq("my_env")
68
- expect(Appsignal.config.root_path).to eq(Dir.pwd)
69
- expect(Appsignal.config[:some_config]).to eq("some value")
70
- end
71
-
72
58
  it "sets the detected environment" do
73
59
  initialize_railtie(event)
74
60
 
@@ -85,13 +71,17 @@ if DependencyHelper.rails_present?
85
71
  it "sets the Rails app path as root_path" do
86
72
  initialize_railtie(event)
87
73
 
88
- expect(Appsignal.config.root_path).to eq(Pathname.new(project_fixture_path))
74
+ expect(Appsignal.config.root_path).to eq(Pathname.new(rails_project_fixture_path))
89
75
  end
90
76
 
91
77
  it "loads the Rails app name in the initial config" do
92
78
  initialize_railtie(event)
93
79
 
94
- expect(Appsignal.config.initial_config[:name]).to eq "MyApp"
80
+ rails_defaults = Appsignal::Config.loader_defaults
81
+ .find { |loader| loader[:name] == :rails }
82
+ expect(rails_defaults[:options][:name]).to eq("MyApp")
83
+ expect(rails_defaults[:options][:log_path])
84
+ .to eq(Pathname.new(File.join(rails_project_fixture_path, "log")))
95
85
  end
96
86
 
97
87
  it "loads the app name from the project's appsignal.yml file" do
@@ -104,7 +94,7 @@ if DependencyHelper.rails_present?
104
94
  initialize_railtie(event)
105
95
 
106
96
  expect(Appsignal.config[:log_path])
107
- .to eq(Pathname.new(File.join(project_fixture_path, "log")))
97
+ .to eq(Pathname.new(File.join(rails_project_fixture_path, "log")))
108
98
  end
109
99
 
110
100
  it "adds the middleware" do
@@ -182,7 +172,7 @@ if DependencyHelper.rails_present?
182
172
  app.config.appsignal.start_at = :after_initialize
183
173
  initialize_railtie(event)
184
174
 
185
- expect(Appsignal.active?).to be_falsy
175
+ expect(Appsignal.started?).to be_falsy
186
176
  expect(Appsignal.config).to be_nil
187
177
  end
188
178
  end
@@ -200,11 +190,16 @@ if DependencyHelper.rails_present?
200
190
  end
201
191
 
202
192
  context "when start_at == :on_load" do
193
+ before do
194
+ Appsignal.clear_started!
195
+ Appsignal.clear_config!
196
+ end
197
+
203
198
  it "does not start AppSignal" do
204
199
  app.config.appsignal.start_at = :on_load
205
- initialize_railtie(event)
200
+ initialize_railtie(:only_after_initialize)
206
201
 
207
- expect(Appsignal.active?).to be_falsy
202
+ expect(Appsignal.started?).to be_falsy
208
203
  expect(Appsignal.config).to be_nil
209
204
  end
210
205
  end
@@ -216,36 +211,84 @@ if DependencyHelper.rails_present?
216
211
  before { start_agent }
217
212
  around { |example| keep_transactions { example.run } }
218
213
 
219
- context "when error is not handled (reraises the error)" do
220
- it "does nothing" do
214
+ it "reports the error when the error is not handled (reraises the error)" do
215
+ with_rails_error_reporter do
216
+ expect do
217
+ Rails.error.record { raise ExampleStandardError, "error message" }
218
+ end.to raise_error(ExampleStandardError, "error message")
219
+ end
220
+
221
+ expect(last_transaction).to have_error("ExampleStandardError", "error message")
222
+ end
223
+
224
+ it "reports the error when the error is handled (not reraised)" do
225
+ with_rails_error_reporter do
226
+ Rails.error.handle { raise ExampleStandardError, "error message" }
227
+ end
228
+
229
+ expect(last_transaction).to have_error("ExampleStandardError", "error message")
230
+ end
231
+
232
+ context "when no transaction is active" do
233
+ it "reports the error on a new transaction" do
221
234
  with_rails_error_reporter do
222
235
  expect do
223
- Rails.error.record { raise ExampleStandardError, "error message" }
224
- end.to raise_error(ExampleStandardError, "error message")
225
- end
236
+ Rails.error.handle { raise ExampleStandardError, "error message" }
237
+ end.to change { created_transactions.count }.by(1)
226
238
 
227
- expect(created_transactions).to be_empty
239
+ transaction = last_transaction
240
+ expect(transaction).to have_namespace(Appsignal::Transaction::HTTP_REQUEST)
241
+ expect(transaction).to_not have_action
242
+ expect(transaction).to have_error("ExampleStandardError", "error message")
243
+ end
228
244
  end
229
245
  end
230
246
 
231
- context "when error is handled (not reraised)" do
232
- context "when a transaction is active" do
233
- it "duplicates the transaction namespace, action and tags" do
247
+ context "when a transaction is active" do
248
+ it "reports the error on the transaction when a transaction is active" do
249
+ current_transaction = http_request_transaction
250
+ current_transaction.set_namespace "custom"
251
+ current_transaction.set_action "CustomAction"
252
+ current_transaction.add_tags(:duplicated_tag => "duplicated value")
253
+
254
+ with_rails_error_reporter do
255
+ with_current_transaction current_transaction do
256
+ Rails.error.handle { raise ExampleStandardError, "error message" }
257
+ expect do
258
+ current_transaction.complete
259
+ end.to_not(change { created_transactions.count })
260
+
261
+ transaction = current_transaction
262
+ expect(transaction).to have_namespace("custom")
263
+ expect(transaction).to have_action("CustomAction")
264
+ expect(transaction).to have_error("ExampleStandardError", "error message")
265
+ expect(transaction).to include_tags(
266
+ "duplicated_tag" => "duplicated value",
267
+ "severity" => "warning"
268
+ )
269
+ end
270
+ end
271
+ end
272
+
273
+ context "when the current transaction has an error" do
274
+ it "reports the error on a new transaction" do
234
275
  current_transaction = http_request_transaction
235
276
  current_transaction.set_namespace "custom"
236
277
  current_transaction.set_action "CustomAction"
237
- current_transaction.set_tags(
238
- :duplicated_tag => "duplicated value"
239
- )
278
+ current_transaction.add_tags(:duplicated_tag => "duplicated value")
279
+ current_transaction.add_error(ExampleStandardError.new("error message"))
240
280
 
241
281
  with_rails_error_reporter do
242
282
  with_current_transaction current_transaction do
243
- Rails.error.handle { raise ExampleStandardError, "error message" }
283
+ Rails.error.handle { raise ExampleStandardError, "other message" }
284
+ expect do
285
+ current_transaction.complete
286
+ end.to change { created_transactions.count }.by(1)
244
287
 
245
288
  transaction = last_transaction
246
289
  expect(transaction).to have_namespace("custom")
247
290
  expect(transaction).to have_action("CustomAction")
248
- expect(transaction).to have_error("ExampleStandardError", "error message")
291
+ expect(transaction).to have_error("ExampleStandardError", "other message")
249
292
  expect(transaction).to include_tags(
250
293
  "duplicated_tag" => "duplicated value",
251
294
  "severity" => "warning"
@@ -254,148 +297,127 @@ if DependencyHelper.rails_present?
254
297
  end
255
298
  end
256
299
 
257
- it "overwrites duplicated tags with tags from context" do
258
- current_transaction = http_request_transaction
259
- current_transaction.set_tags(:tag1 => "duplicated value")
260
-
261
- with_rails_error_reporter do
262
- with_current_transaction current_transaction do
263
- given_context = { :tag1 => "value1", :tag2 => "value2" }
264
- Rails.error.handle(:context => given_context) { raise ExampleStandardError }
265
-
266
- expect(last_transaction).to include_tags(
267
- "tag1" => "value1",
268
- "tag2" => "value2",
269
- "severity" => "warning"
270
- )
271
- end
272
- end
273
- end
274
-
275
- it "sends tags stored in :appsignal -> :custom_data as custom data" do
276
- current_transaction = http_request_transaction
277
-
278
- with_rails_error_reporter do
279
- with_current_transaction current_transaction do
280
- given_context = {
281
- :appsignal => {
282
- :custom_data => {
283
- :array => [1, 2],
284
- :hash => { :one => 1, :two => 2 }
285
- }
286
- }
287
- }
288
- Rails.error.handle(:context => given_context) { raise ExampleStandardError }
289
-
290
- transaction = last_transaction
291
- expect(transaction).to include_custom_data(
292
- "array" => [1, 2],
293
- "hash" => { "one" => 1, "two" => 2 }
294
- )
295
- end
296
- end
297
- end
298
-
299
- it "overwrites duplicated namespace and action with custom from context" do
300
+ it "reports the error on a new transaction with the given context" do
300
301
  current_transaction = http_request_transaction
301
302
  current_transaction.set_namespace "custom"
302
303
  current_transaction.set_action "CustomAction"
304
+ current_transaction.add_tags(:duplicated_tag => "duplicated value")
305
+ current_transaction.add_custom_data(:original => "custom value")
306
+ current_transaction.add_error(ExampleStandardError.new("error message"))
303
307
 
304
308
  with_rails_error_reporter do
305
309
  with_current_transaction current_transaction do
306
310
  given_context = {
307
- :appsignal => { :namespace => "context", :action => "ContextAction" }
311
+ :appsignal => {
312
+ :namespace => "context",
313
+ :action => "ContextAction",
314
+ :custom_data => { :context => "context data" }
315
+
316
+ }
308
317
  }
309
- Rails.error.handle(:context => given_context) { raise ExampleStandardError }
318
+ Rails.error.handle(:context => given_context) do
319
+ raise ExampleStandardError, "other message"
320
+ end
321
+ expect do
322
+ current_transaction.complete
323
+ end.to change { created_transactions.count }.by(1)
310
324
 
311
325
  transaction = last_transaction
312
326
  expect(transaction).to have_namespace("context")
313
327
  expect(transaction).to have_action("ContextAction")
328
+ expect(transaction).to have_error("ExampleStandardError", "other message")
329
+ expect(transaction).to include_tags(
330
+ "duplicated_tag" => "duplicated value",
331
+ "severity" => "warning"
332
+ )
333
+ expect(transaction).to include_custom_data(
334
+ "original" => "custom value",
335
+ "context" => "context data"
336
+ )
314
337
  end
315
338
  end
316
339
  end
317
340
  end
318
341
 
319
- context "when no transaction is active" do
320
- class ExampleRailsRequestMock
321
- def path
322
- "path"
323
- end
324
-
325
- def method
326
- "GET"
327
- end
328
-
329
- def filtered_parameters
330
- { :user_id => 123, :password => "[FILTERED]" }
331
- end
332
- end
333
-
334
- class ExampleRailsControllerMock
335
- def action_name
336
- "index"
337
- end
342
+ it "overwrites duplicate tags with tags from context" do
343
+ current_transaction = http_request_transaction
344
+ current_transaction.add_tags(:tag1 => "duplicated value")
338
345
 
339
- def request
340
- @request ||= ExampleRailsRequestMock.new
341
- end
342
- end
343
-
344
- class ExampleRailsJobMock
345
- end
346
+ with_rails_error_reporter do
347
+ with_current_transaction current_transaction do
348
+ given_context = { :tag1 => "value1", :tag2 => "value2" }
349
+ Rails.error.handle(:context => given_context) { raise ExampleStandardError }
350
+ current_transaction.complete
346
351
 
347
- class ExampleRailsMailerMock < ActionMailer::MailDeliveryJob
348
- def arguments
349
- ["ExampleRailsMailerMock", "send_mail"]
352
+ expect(current_transaction).to include_tags(
353
+ "tag1" => "value1",
354
+ "tag2" => "value2",
355
+ "severity" => "warning"
356
+ )
350
357
  end
351
358
  end
359
+ end
352
360
 
353
- before do
354
- clear_current_transaction!
355
- end
361
+ it "sets namespace, action and custom data with values from context" do
362
+ current_transaction = http_request_transaction
363
+ current_transaction.set_namespace "custom"
364
+ current_transaction.set_action "CustomAction"
356
365
 
357
- it "fetches the action, path and method from the controller in the context" do
358
- # The controller key is set by Rails when raised in a controller
359
- given_context = { :controller => ExampleRailsControllerMock.new }
360
- with_rails_error_reporter do
366
+ with_rails_error_reporter do
367
+ with_current_transaction current_transaction do
368
+ given_context = {
369
+ :appsignal => {
370
+ :namespace => "context",
371
+ :action => "ContextAction",
372
+ :custom_data => { :data => "context data" }
373
+ }
374
+ }
361
375
  Rails.error.handle(:context => given_context) { raise ExampleStandardError }
362
- end
376
+ current_transaction.complete
363
377
 
364
- transaction = last_transaction
365
- expect(transaction).to have_action("ExampleRailsControllerMock#index")
366
- expect(transaction).to include_metadata("path" => "path", "method" => "GET")
367
- expect(transaction).to include_params("user_id" => 123,
368
- "password" => "[FILTERED]")
378
+ expect(current_transaction).to have_namespace("context")
379
+ expect(current_transaction).to have_action("ContextAction")
380
+ expect(current_transaction).to include_custom_data("data" => "context data")
381
+ end
369
382
  end
383
+ end
384
+ end
370
385
 
371
- it "sets no action if no execution context is present" do
372
- # The controller key is set by Rails when raised in a controller
386
+ if DependencyHelper.rails7_1_present?
387
+ it "sets the namespace to 'runner' if the source is the Rails runner" do
388
+ expect do
373
389
  with_rails_error_reporter do
374
- Rails.error.handle { raise ExampleStandardError }
390
+ expect do
391
+ Rails.error.record(:source => "application.runner.railties") do
392
+ raise ExampleStandardError, "error message"
393
+ end
394
+ end.to raise_error(ExampleStandardError, "error message")
375
395
  end
396
+ end.to change { created_transactions.count }.by(1)
376
397
 
377
- expect(last_transaction).to_not have_action
378
- end
398
+ transaction = last_transaction
399
+ expect(transaction).to have_namespace("runner")
400
+ expect(transaction).to_not have_action
401
+ expect(transaction).to have_error("ExampleStandardError", "error message")
402
+ expect(transaction).to include_tags("source" => "application.runner.railties")
379
403
  end
404
+ end
380
405
 
381
- it "sets the error context as tags" do
382
- given_context = {
383
- :controller => ExampleRailsControllerMock.new, # Not set as tag
384
- :job => ExampleRailsJobMock.new, # Not set as tag
385
- :appsignal => { :something => "not used" }, # Not set as tag
386
- :tag1 => "value1",
387
- :tag2 => "value2"
388
- }
389
- with_rails_error_reporter do
390
- Rails.error.handle(:context => given_context) { raise ExampleStandardError }
391
- end
392
-
393
- expect(last_transaction).to include_tags(
394
- "tag1" => "value1",
395
- "tag2" => "value2",
396
- "severity" => "warning"
397
- )
406
+ it "sets the error context as tags" do
407
+ given_context = {
408
+ :appsignal => { :something => "not used" }, # Not set as tag
409
+ :tag1 => "value1",
410
+ :tag2 => "value2"
411
+ }
412
+ with_rails_error_reporter do
413
+ Rails.error.handle(:context => given_context) { raise ExampleStandardError }
398
414
  end
415
+
416
+ expect(last_transaction).to include_tags(
417
+ "tag1" => "value1",
418
+ "tag2" => "value2",
419
+ "severity" => "warning"
420
+ )
399
421
  end
400
422
  end
401
423
  end
@@ -9,7 +9,8 @@ describe Appsignal::Integrations::ShoryukenMiddleware do
9
9
  let(:queue) { "some-funky-queue-name" }
10
10
  let(:sqs_msg) { double(:message_id => "msg1", :attributes => {}) }
11
11
  let(:body) { {} }
12
- before { start_agent }
12
+ let(:options) { {} }
13
+ before { start_agent(:options => options) }
13
14
  around { |example| keep_transactions { example.run } }
14
15
 
15
16
  def perform_shoryuken_job(&block)
@@ -60,10 +61,7 @@ describe Appsignal::Integrations::ShoryukenMiddleware do
60
61
  end
61
62
 
62
63
  context "with parameter filtering" do
63
- before do
64
- start_agent("production")
65
- Appsignal.config[:filter_parameters] = ["foo"]
66
- end
64
+ let(:options) { { :filter_parameters => ["foo"] } }
67
65
 
68
66
  it "filters selected arguments" do
69
67
  perform_shoryuken_job