appsignal 4.0.5 → 4.0.7

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.
Files changed (203) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/Rakefile +9 -9
  4. data/appsignal.gemspec +22 -1
  5. data/build_matrix.yml +2 -1
  6. data/ext/agent.rb +27 -27
  7. data/lib/appsignal/check_in/scheduler.rb +3 -4
  8. data/lib/appsignal/check_in.rb +1 -1
  9. data/lib/appsignal/config.rb +1 -3
  10. data/lib/appsignal/integrations/que.rb +8 -2
  11. data/lib/appsignal/integrations/resque.rb +1 -6
  12. data/lib/appsignal/utils/hash_sanitizer.rb +4 -0
  13. data/lib/appsignal/version.rb +1 -1
  14. metadata +2 -191
  15. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
  16. data/.github/ISSUE_TEMPLATE/chore.md +0 -14
  17. data/.github/workflows/ci.yml +0 -3150
  18. data/.github/workflows/create_release_from_tag.yml +0 -62
  19. data/.gitignore +0 -35
  20. data/.gitmodules +0 -3
  21. data/.rspec +0 -4
  22. data/.yardopts +0 -8
  23. data/benchmark.rake +0 -139
  24. data/gemfiles/capistrano2.gemfile +0 -6
  25. data/gemfiles/capistrano3.gemfile +0 -7
  26. data/gemfiles/dry-monitor.gemfile +0 -5
  27. data/gemfiles/grape.gemfile +0 -5
  28. data/gemfiles/hanami-2.0.gemfile +0 -7
  29. data/gemfiles/hanami-2.1.gemfile +0 -7
  30. data/gemfiles/http5.gemfile +0 -5
  31. data/gemfiles/no_dependencies.gemfile +0 -10
  32. data/gemfiles/padrino.gemfile +0 -7
  33. data/gemfiles/psych-3.gemfile +0 -5
  34. data/gemfiles/psych-4.gemfile +0 -5
  35. data/gemfiles/que.gemfile +0 -5
  36. data/gemfiles/rails-6.0.gemfile +0 -10
  37. data/gemfiles/rails-6.1.gemfile +0 -11
  38. data/gemfiles/rails-7.0.gemfile +0 -11
  39. data/gemfiles/rails-7.1.gemfile +0 -11
  40. data/gemfiles/rails-7.2.gemfile +0 -11
  41. data/gemfiles/redis-4.gemfile +0 -5
  42. data/gemfiles/redis-5.gemfile +0 -6
  43. data/gemfiles/resque-2.gemfile +0 -6
  44. data/gemfiles/sequel.gemfile +0 -10
  45. data/gemfiles/sinatra.gemfile +0 -5
  46. data/gemfiles/webmachine1.gemfile +0 -7
  47. data/gemfiles/webmachine2.gemfile +0 -6
  48. data/mono.yml +0 -16
  49. data/spec/.rubocop.yml +0 -7
  50. data/spec/lib/appsignal/auth_check_spec.rb +0 -84
  51. data/spec/lib/appsignal/capistrano2_spec.rb +0 -227
  52. data/spec/lib/appsignal/capistrano3_spec.rb +0 -284
  53. data/spec/lib/appsignal/check_in/cron_spec.rb +0 -202
  54. data/spec/lib/appsignal/check_in/scheduler_spec.rb +0 -443
  55. data/spec/lib/appsignal/cli/demo_spec.rb +0 -46
  56. data/spec/lib/appsignal/cli/diagnose/paths_spec.rb +0 -16
  57. data/spec/lib/appsignal/cli/diagnose/utils_spec.rb +0 -86
  58. data/spec/lib/appsignal/cli/diagnose_spec.rb +0 -1553
  59. data/spec/lib/appsignal/cli/helpers_spec.rb +0 -179
  60. data/spec/lib/appsignal/cli/install_spec.rb +0 -848
  61. data/spec/lib/appsignal/cli_spec.rb +0 -56
  62. data/spec/lib/appsignal/config_spec.rb +0 -1380
  63. data/spec/lib/appsignal/demo_spec.rb +0 -83
  64. data/spec/lib/appsignal/environment_spec.rb +0 -190
  65. data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +0 -60
  66. data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +0 -21
  67. data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +0 -21
  68. data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +0 -52
  69. data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +0 -21
  70. data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +0 -84
  71. data/spec/lib/appsignal/event_formatter/rom/sql_formatter_spec.rb +0 -22
  72. data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +0 -30
  73. data/spec/lib/appsignal/event_formatter/view_component/render_formatter_spec.rb +0 -41
  74. data/spec/lib/appsignal/event_formatter_spec.rb +0 -193
  75. data/spec/lib/appsignal/extension/jruby_spec.rb +0 -46
  76. data/spec/lib/appsignal/extension_install_failure_spec.rb +0 -20
  77. data/spec/lib/appsignal/extension_spec.rb +0 -178
  78. data/spec/lib/appsignal/garbage_collection_spec.rb +0 -98
  79. data/spec/lib/appsignal/hooks/action_cable_spec.rb +0 -345
  80. data/spec/lib/appsignal/hooks/action_mailer_spec.rb +0 -55
  81. data/spec/lib/appsignal/hooks/active_support_notifications/finish_with_state_shared_examples.rb +0 -23
  82. data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +0 -99
  83. data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +0 -47
  84. data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +0 -47
  85. data/spec/lib/appsignal/hooks/activejob_spec.rb +0 -650
  86. data/spec/lib/appsignal/hooks/at_exit_spec.rb +0 -105
  87. data/spec/lib/appsignal/hooks/celluloid_spec.rb +0 -40
  88. data/spec/lib/appsignal/hooks/data_mapper_spec.rb +0 -40
  89. data/spec/lib/appsignal/hooks/delayed_job_spec.rb +0 -38
  90. data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +0 -83
  91. data/spec/lib/appsignal/hooks/excon_spec.rb +0 -67
  92. data/spec/lib/appsignal/hooks/gvl_spec.rb +0 -145
  93. data/spec/lib/appsignal/hooks/http_spec.rb +0 -37
  94. data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +0 -46
  95. data/spec/lib/appsignal/hooks/mri_spec.rb +0 -23
  96. data/spec/lib/appsignal/hooks/net_http_spec.rb +0 -18
  97. data/spec/lib/appsignal/hooks/passenger_spec.rb +0 -30
  98. data/spec/lib/appsignal/hooks/puma_spec.rb +0 -80
  99. data/spec/lib/appsignal/hooks/que_spec.rb +0 -19
  100. data/spec/lib/appsignal/hooks/rake_spec.rb +0 -144
  101. data/spec/lib/appsignal/hooks/redis_client_spec.rb +0 -218
  102. data/spec/lib/appsignal/hooks/redis_spec.rb +0 -124
  103. data/spec/lib/appsignal/hooks/resque_spec.rb +0 -27
  104. data/spec/lib/appsignal/hooks/sequel_spec.rb +0 -44
  105. data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -29
  106. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +0 -115
  107. data/spec/lib/appsignal/hooks/unicorn_spec.rb +0 -63
  108. data/spec/lib/appsignal/hooks/webmachine_spec.rb +0 -24
  109. data/spec/lib/appsignal/hooks_spec.rb +0 -124
  110. data/spec/lib/appsignal/integrations/data_mapper_spec.rb +0 -74
  111. data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +0 -454
  112. data/spec/lib/appsignal/integrations/http_spec.rb +0 -111
  113. data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +0 -154
  114. data/spec/lib/appsignal/integrations/net_http_spec.rb +0 -33
  115. data/spec/lib/appsignal/integrations/object_spec.rb +0 -347
  116. data/spec/lib/appsignal/integrations/puma_spec.rb +0 -150
  117. data/spec/lib/appsignal/integrations/que_spec.rb +0 -152
  118. data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -457
  119. data/spec/lib/appsignal/integrations/resque_spec.rb +0 -155
  120. data/spec/lib/appsignal/integrations/shoryuken_spec.rb +0 -165
  121. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +0 -640
  122. data/spec/lib/appsignal/integrations/webmachine_spec.rb +0 -136
  123. data/spec/lib/appsignal/loaders/grape_spec.rb +0 -12
  124. data/spec/lib/appsignal/loaders/hanami_spec.rb +0 -92
  125. data/spec/lib/appsignal/loaders/padrino_spec.rb +0 -273
  126. data/spec/lib/appsignal/loaders/sinatra_spec.rb +0 -44
  127. data/spec/lib/appsignal/loaders_spec.rb +0 -144
  128. data/spec/lib/appsignal/logger_spec.rb +0 -205
  129. data/spec/lib/appsignal/marker_spec.rb +0 -51
  130. data/spec/lib/appsignal/probes/gvl_spec.rb +0 -164
  131. data/spec/lib/appsignal/probes/mri_spec.rb +0 -162
  132. data/spec/lib/appsignal/probes/sidekiq_spec.rb +0 -333
  133. data/spec/lib/appsignal/probes_spec.rb +0 -411
  134. data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +0 -370
  135. data/spec/lib/appsignal/rack/body_wrapper_spec.rb +0 -319
  136. data/spec/lib/appsignal/rack/event_handler_spec.rb +0 -441
  137. data/spec/lib/appsignal/rack/grape_middleware_spec.rb +0 -201
  138. data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +0 -36
  139. data/spec/lib/appsignal/rack/instrumentation_middleware_spec.rb +0 -38
  140. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +0 -126
  141. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +0 -217
  142. data/spec/lib/appsignal/rack_spec.rb +0 -243
  143. data/spec/lib/appsignal/sample_data_spec.rb +0 -238
  144. data/spec/lib/appsignal/span_spec.rb +0 -141
  145. data/spec/lib/appsignal/system_spec.rb +0 -126
  146. data/spec/lib/appsignal/transaction_spec.rb +0 -2111
  147. data/spec/lib/appsignal/transmitter_spec.rb +0 -198
  148. data/spec/lib/appsignal/utils/data_spec.rb +0 -166
  149. data/spec/lib/appsignal/utils/hash_sanitizer_spec.rb +0 -182
  150. data/spec/lib/appsignal/utils/integration_logger_spec.rb +0 -21
  151. data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +0 -153
  152. data/spec/lib/appsignal/utils/json_spec.rb +0 -44
  153. data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +0 -192
  154. data/spec/lib/appsignal_spec.rb +0 -1919
  155. data/spec/lib/puma/appsignal_spec.rb +0 -334
  156. data/spec/spec_helper.rb +0 -173
  157. data/spec/support/fixtures/generated_config.yml +0 -24
  158. data/spec/support/fixtures/projects/broken/config/appsignal.yml +0 -1
  159. data/spec/support/fixtures/projects/valid/config/appsignal.yml +0 -57
  160. data/spec/support/fixtures/projects/valid/log/.gitkeep +0 -0
  161. data/spec/support/fixtures/projects/valid_with_rails_app/config/application.rb +0 -16
  162. data/spec/support/fixtures/projects/valid_with_rails_app/config/appsignal.yml +0 -56
  163. data/spec/support/fixtures/projects/valid_with_rails_app/config/environment.rb +0 -10
  164. data/spec/support/fixtures/projects/valid_with_rails_app/log/.gitkeep +0 -0
  165. data/spec/support/fixtures/uploaded_file.txt +0 -0
  166. data/spec/support/hanami/hanami_app.rb +0 -29
  167. data/spec/support/helpers/action_mailer_helpers.rb +0 -25
  168. data/spec/support/helpers/activejob_helpers.rb +0 -27
  169. data/spec/support/helpers/api_request_helper.rb +0 -20
  170. data/spec/support/helpers/cli_helpers.rb +0 -40
  171. data/spec/support/helpers/config_helpers.rb +0 -66
  172. data/spec/support/helpers/dependency_helper.rb +0 -150
  173. data/spec/support/helpers/directory_helper.rb +0 -27
  174. data/spec/support/helpers/env_helpers.rb +0 -41
  175. data/spec/support/helpers/environment_metdata_helper.rb +0 -16
  176. data/spec/support/helpers/example_exception.rb +0 -13
  177. data/spec/support/helpers/example_standard_error.rb +0 -13
  178. data/spec/support/helpers/loader_helper.rb +0 -21
  179. data/spec/support/helpers/log_helpers.rb +0 -36
  180. data/spec/support/helpers/rails_helper.rb +0 -28
  181. data/spec/support/helpers/std_streams_helper.rb +0 -94
  182. data/spec/support/helpers/system_helpers.rb +0 -8
  183. data/spec/support/helpers/take_at_most_helper.rb +0 -21
  184. data/spec/support/helpers/time_helpers.rb +0 -11
  185. data/spec/support/helpers/transaction_helpers.rb +0 -122
  186. data/spec/support/helpers/wait_for_helper.rb +0 -39
  187. data/spec/support/matchers/contains_log.rb +0 -26
  188. data/spec/support/matchers/have_colorized_text.rb +0 -28
  189. data/spec/support/matchers/transaction.rb +0 -200
  190. data/spec/support/mocks/appsignal_mock.rb +0 -18
  191. data/spec/support/mocks/dummy_app.rb +0 -20
  192. data/spec/support/mocks/fake_gc_profiler.rb +0 -19
  193. data/spec/support/mocks/fake_gvl_tools.rb +0 -28
  194. data/spec/support/mocks/hash_like.rb +0 -10
  195. data/spec/support/mocks/mock_probe.rb +0 -13
  196. data/spec/support/mocks/puma_mock.rb +0 -43
  197. data/spec/support/shared_examples/instrument.rb +0 -48
  198. data/spec/support/stubs/appsignal/loaders/loader_stub.rb +0 -7
  199. data/spec/support/stubs/delayed_job.rb +0 -0
  200. data/spec/support/stubs/sidekiq/api.rb +0 -4
  201. data/spec/support/testing.rb +0 -194
  202. data/support/bundler_wrapper +0 -12
  203. data/support/install_deps +0 -33
@@ -1,640 +0,0 @@
1
- require "appsignal/integrations/sidekiq"
2
-
3
- describe Appsignal::Integrations::SidekiqDeathHandler do
4
- let(:options) { {} }
5
- before do
6
- stub_const("Sidekiq::VERSION", "7.1.0")
7
- start_agent(:options => options)
8
- end
9
- around { |example| keep_transactions { example.run } }
10
-
11
- let(:exception) do
12
- raise ExampleStandardError, "uh oh"
13
- rescue => error
14
- error
15
- end
16
- let(:job_context) { {} }
17
- let(:transaction) { http_request_transaction }
18
- before { set_current_transaction(transaction) }
19
-
20
- def call_handler
21
- expect do
22
- described_class.new.call(job_context, exception)
23
- end.to_not(change { created_transactions.count })
24
- end
25
-
26
- def expect_error_on_transaction
27
- expect(last_transaction).to have_error("ExampleStandardError", "uh oh")
28
- end
29
-
30
- def expect_no_error_on_transaction
31
- expect(last_transaction).to_not have_error
32
- end
33
-
34
- context "when sidekiq_report_errors = none" do
35
- let(:options) { { :sidekiq_report_errors => "none" } }
36
- before { call_handler }
37
-
38
- it "doesn't track the error on the transaction" do
39
- expect_no_error_on_transaction
40
- end
41
- end
42
-
43
- context "when sidekiq_report_errors = all" do
44
- let(:options) { { :sidekiq_report_errors => "all" } }
45
- before { call_handler }
46
-
47
- it "doesn't track the error on the transaction" do
48
- expect_no_error_on_transaction
49
- end
50
- end
51
-
52
- context "when sidekiq_report_errors = discard" do
53
- let(:options) { { :sidekiq_report_errors => "discard" } }
54
- before { call_handler }
55
-
56
- it "records each occurrence of the error on the transaction" do
57
- expect_error_on_transaction
58
- end
59
- end
60
- end
61
-
62
- describe Appsignal::Integrations::SidekiqErrorHandler do
63
- let(:options) { {} }
64
- before { start_agent(:options => options) }
65
- around { |example| keep_transactions { example.run } }
66
-
67
- let(:exception) do
68
- raise ExampleStandardError, "uh oh"
69
- rescue => error
70
- error
71
- end
72
-
73
- context "when error is an internal error" do
74
- let(:job_context) do
75
- {
76
- :context => "Sidekiq internal error!",
77
- :jobstr => "{ bad json }"
78
- }
79
- end
80
-
81
- def expect_report_internal_error
82
- expect do
83
- described_class.new.call(exception, job_context)
84
- end.to(change { created_transactions.count }.by(1))
85
-
86
- transaction = last_transaction
87
- expect(transaction).to have_action("SidekiqInternal")
88
- expect(transaction).to have_error("ExampleStandardError", "uh oh")
89
- expect(transaction).to include_params(
90
- "jobstr" => "{ bad json }"
91
- )
92
- expect(transaction).to include_metadata(
93
- "sidekiq_error" => "Sidekiq internal error!"
94
- )
95
- end
96
-
97
- context "when sidekiq_report_errors = none" do
98
- let(:options) { { :sidekiq_report_errors => "none" } }
99
-
100
- it "tracks the error on a new transaction" do
101
- expect_report_internal_error
102
- end
103
- end
104
-
105
- context "when sidekiq_report_errors = all" do
106
- let(:options) { { :sidekiq_report_errors => "all" } }
107
-
108
- it "tracks the error on a new transaction" do
109
- expect_report_internal_error
110
- end
111
- end
112
-
113
- context "when sidekiq_report_errors = discard" do
114
- let(:options) { { :sidekiq_report_errors => "discard" } }
115
-
116
- it "tracks the error on a new transaction" do
117
- expect_report_internal_error
118
- end
119
- end
120
- end
121
-
122
- context "when error is a job error" do
123
- let(:sidekiq_context) { { :job => {} } }
124
- let(:transaction) { http_request_transaction }
125
- before do
126
- transaction.set_action("existing transaction action")
127
- set_current_transaction(transaction)
128
- end
129
-
130
- def call_handler
131
- expect do
132
- described_class.new.call(exception, sidekiq_context)
133
- end.to_not(change { created_transactions.count })
134
- end
135
-
136
- def expect_error_on_transaction
137
- expect(last_transaction).to have_error("ExampleStandardError", "uh oh")
138
- end
139
-
140
- def expect_no_error_on_transaction
141
- expect(last_transaction).to_not have_error
142
- end
143
-
144
- context "when sidekiq_report_errors = none" do
145
- let(:options) { { :sidekiq_report_errors => "none" } }
146
- before { call_handler }
147
-
148
- it "doesn't track the error on the transaction" do
149
- expect_no_error_on_transaction
150
- expect(last_transaction).to be_completed
151
- end
152
- end
153
-
154
- context "when sidekiq_report_errors = all" do
155
- let(:options) { { :sidekiq_report_errors => "all" } }
156
- before { call_handler }
157
-
158
- it "records each occurrence of the error on the transaction" do
159
- expect_error_on_transaction
160
- expect(last_transaction).to be_completed
161
- end
162
- end
163
-
164
- context "when sidekiq_report_errors = discard" do
165
- let(:options) { { :sidekiq_report_errors => "discard" } }
166
- before { call_handler }
167
-
168
- it "doesn't track the error on the transaction" do
169
- expect_no_error_on_transaction
170
- expect(last_transaction).to be_completed
171
- end
172
- end
173
- end
174
- end
175
-
176
- describe Appsignal::Integrations::SidekiqMiddleware do
177
- class DelayedTestClass; end
178
-
179
- let(:namespace) { Appsignal::Transaction::BACKGROUND_JOB }
180
- let(:worker) { anything }
181
- let(:queue) { anything }
182
- let(:given_args) do
183
- [
184
- "foo",
185
- {
186
- :foo => "Foo",
187
- :bar => "Bar",
188
- "baz" => { 1 => :foo }
189
- }
190
- ]
191
- end
192
- let(:expected_args) do
193
- [
194
- "foo",
195
- {
196
- "foo" => "Foo",
197
- "bar" => "Bar",
198
- "baz" => { "1" => "foo" }
199
- }
200
- ]
201
- end
202
- let(:job_class) { "TestClass" }
203
- let(:jid) { "b4a577edbccf1d805744efa9" }
204
- let(:item) do
205
- {
206
- "jid" => jid,
207
- "class" => job_class,
208
- "retry_count" => 0,
209
- "queue" => "default",
210
- "created_at" => Time.parse("2001-01-01 10:00:00UTC").to_f,
211
- "enqueued_at" => Time.parse("2001-01-01 10:00:00UTC").to_f,
212
- "args" => given_args,
213
- "extra" => "data"
214
- }
215
- end
216
- let(:plugin) { Appsignal::Integrations::SidekiqMiddleware.new }
217
- let(:options) { {} }
218
- before do
219
- start_agent(:options => options)
220
- end
221
- around { |example| keep_transactions { example.run } }
222
-
223
- def expect_no_yaml_parse_error(logs)
224
- expect(logs).to_not contains_log(:warn, "Unable to load YAML")
225
- end
226
-
227
- describe "internal Sidekiq job values" do
228
- it "does not save internal Sidekiq values as metadata on transaction" do
229
- perform_sidekiq_job
230
-
231
- transaction_hash = transaction.to_h
232
- expect(transaction_hash["metadata"].keys)
233
- .to_not include(*Appsignal::Integrations::SidekiqMiddleware::EXCLUDED_JOB_KEYS)
234
- end
235
- end
236
-
237
- context "with parameter filtering" do
238
- let(:options) { { :filter_parameters => ["foo"] } }
239
-
240
- it "filters selected arguments" do
241
- perform_sidekiq_job
242
-
243
- expect(transaction).to include_params(
244
- [
245
- "foo",
246
- {
247
- "foo" => "[FILTERED]",
248
- "bar" => "Bar",
249
- "baz" => { "1" => "foo" }
250
- }
251
- ]
252
- )
253
- end
254
- end
255
-
256
- context "with encrypted arguments" do
257
- before do
258
- item["encrypt"] = true
259
- item["args"] << "super secret value" # Last argument will be replaced
260
- end
261
-
262
- it "replaces the last argument (the secret bag) with an [encrypted data] string" do
263
- perform_sidekiq_job
264
-
265
- expect(transaction).to include_params(expected_args << "[encrypted data]")
266
- end
267
- end
268
-
269
- context "when using the Sidekiq delayed extension" do
270
- let(:item) do
271
- {
272
- "jid" => jid,
273
- "class" => "Sidekiq::Extensions::DelayedClass",
274
- "queue" => "default",
275
- "args" => [
276
- "---\n- !ruby/class 'DelayedTestClass'\n- :foo_method\n- - :bar: baz\n"
277
- ],
278
- "retry" => true,
279
- "created_at" => Time.parse("2001-01-01 10:00:00UTC").to_f,
280
- "enqueued_at" => Time.parse("2001-01-01 10:00:00UTC").to_f,
281
- "extra" => "data"
282
- }
283
- end
284
-
285
- it "uses the delayed class and method name for the action" do
286
- perform_sidekiq_job
287
-
288
- expect(transaction).to have_action("DelayedTestClass.foo_method")
289
- expect(transaction).to include_params(["bar" => "baz"])
290
- end
291
-
292
- context "when job arguments is a malformed YAML object" do
293
- before { item["args"] = [] }
294
-
295
- it "logs a warning and uses the default argument" do
296
- logs = capture_logs { perform_sidekiq_job }
297
-
298
- expect(transaction).to have_action("Sidekiq::Extensions::DelayedClass#perform")
299
- expect(transaction).to include_params([])
300
- expect(logs).to contains_log(:warn, "Unable to load YAML")
301
- end
302
- end
303
- end
304
-
305
- context "when using the Sidekiq ActiveRecord instance delayed extension" do
306
- let(:item) do
307
- {
308
- "jid" => jid,
309
- "class" => "Sidekiq::Extensions::DelayedModel",
310
- "queue" => "default",
311
- "args" => [
312
- "---\n- !ruby/object:DelayedTestClass {}\n- :foo_method\n- - :bar: :baz\n"
313
- ],
314
- "retry" => true,
315
- "created_at" => Time.parse("2001-01-01 10:00:00UTC").to_f,
316
- "enqueued_at" => Time.parse("2001-01-01 10:00:00UTC").to_f,
317
- "extra" => "data"
318
- }
319
- end
320
-
321
- it "uses the delayed class and method name for the action" do
322
- perform_sidekiq_job
323
-
324
- expect(transaction).to have_action("DelayedTestClass#foo_method")
325
- expect(transaction).to include_params(["bar" => "baz"])
326
- end
327
-
328
- context "when job arguments is a malformed YAML object" do
329
- before { item["args"] = [] }
330
-
331
- it "logs a warning and uses the default argument" do
332
- logs = capture_logs { perform_sidekiq_job }
333
-
334
- expect(transaction).to have_action("Sidekiq::Extensions::DelayedModel#perform")
335
- expect(transaction).to include_params([])
336
- expect(logs).to contains_log(:warn, "Unable to load YAML")
337
- end
338
- end
339
- end
340
-
341
- context "with an error" do
342
- let(:error) { ExampleException }
343
-
344
- it "creates a transaction and adds the error" do
345
- # TODO: additional curly brackets required for issue
346
- # https://github.com/rspec/rspec-mocks/issues/1460
347
- expect(Appsignal).to receive(:increment_counter)
348
- .with("sidekiq_queue_job_count", 1, { :queue => "default", :status => :failed })
349
- expect(Appsignal).to receive(:increment_counter)
350
- .with("sidekiq_queue_job_count", 1, { :queue => "default", :status => :processed })
351
- expect do
352
- perform_sidekiq_job { raise error, "uh oh" }
353
- end.to raise_error(error)
354
-
355
- expect(transaction).to have_id
356
- expect(transaction).to have_namespace(namespace)
357
- expect(transaction).to have_action("TestClass#perform")
358
- expect(transaction).to have_error("ExampleException", "uh oh")
359
- expect(transaction).to include_metadata(
360
- "extra" => "data",
361
- "queue" => "default",
362
- "retry_count" => "0"
363
- )
364
- expect(transaction).to_not include_environment
365
- expect(transaction).to include_params(expected_args)
366
- expect(transaction).to include_tags("request_id" => jid)
367
- expect(transaction).to_not include_breadcrumbs
368
- expect_transaction_to_have_sidekiq_event(transaction)
369
- end
370
- end
371
-
372
- if DependencyHelper.rails7_present?
373
- context "with Rails error reporter" do
374
- include RailsHelper
375
-
376
- it "reports the worker name as the action, copies the namespace and tags" do
377
- expect do
378
- with_rails_error_reporter do
379
- perform_sidekiq_job do
380
- Appsignal.tag_job("test_tag" => "value")
381
- Rails.error.handle do
382
- raise ExampleStandardError, "error message"
383
- end
384
- end
385
- end
386
- end.to change { created_transactions.count }.by(1)
387
-
388
- tags = { "test_tag" => "value" }
389
- transaction = last_transaction
390
-
391
- expect(transaction).to have_namespace("background_job")
392
- expect(transaction).to have_action("TestClass#perform")
393
- expect(transaction).to have_error("ExampleStandardError", "error message")
394
- expect(transaction).to include_tags(tags)
395
- end
396
- end
397
- end
398
-
399
- context "without an error" do
400
- it "creates a transaction with events" do
401
- # TODO: additional curly brackets required for issue
402
- # https://github.com/rspec/rspec-mocks/issues/1460
403
- expect(Appsignal).to receive(:increment_counter)
404
- .with("sidekiq_queue_job_count", 1, { :queue => "default", :status => :processed })
405
- perform_sidekiq_job
406
-
407
- expect(transaction).to have_id
408
- expect(transaction).to have_namespace(namespace)
409
- expect(transaction).to have_action("TestClass#perform")
410
- expect(transaction).to_not have_error
411
- expect(transaction).to include_tags("request_id" => jid)
412
- expect(transaction).to_not include_environment
413
- expect(transaction).to_not include_breadcrumbs
414
- expect(transaction).to_not include_params(expected_args)
415
- expect(transaction).to include_metadata(
416
- "extra" => "data",
417
- "queue" => "default",
418
- "retry_count" => "0"
419
- )
420
- expect(transaction).to have_queue_start(Time.parse("2001-01-01 10:00:00UTC").to_i * 1000)
421
- expect_transaction_to_have_sidekiq_event(transaction)
422
- end
423
- end
424
-
425
- def perform_sidekiq_job
426
- Timecop.freeze(Time.parse("2001-01-01 10:01:00UTC")) do
427
- exception = nil
428
- plugin.call(worker, item, queue) do
429
- yield if block_given?
430
- end
431
- rescue Exception => exception # rubocop:disable Lint/RescueException
432
- raise exception
433
- ensure
434
- Appsignal::Integrations::SidekiqErrorHandler.new.call(exception, :job => item) if exception
435
- end
436
- end
437
-
438
- def transaction
439
- last_transaction
440
- end
441
-
442
- def expect_transaction_to_have_sidekiq_event(transaction)
443
- expect(transaction.to_h["events"].count).to eq(1)
444
- expect(transaction).to include_event(
445
- "name" => "perform_job.sidekiq",
446
- "title" => "",
447
- "count" => 1,
448
- "body" => "",
449
- "body_format" => Appsignal::EventFormatter::DEFAULT
450
- )
451
- end
452
- end
453
-
454
- if DependencyHelper.active_job_present?
455
- require "active_job"
456
- require "action_mailer"
457
- require "sidekiq/testing"
458
-
459
- describe "Sidekiq ActiveJob integration" do
460
- include RailsHelper
461
- include ActiveJobHelpers
462
-
463
- let(:namespace) { Appsignal::Transaction::BACKGROUND_JOB }
464
- let(:time) { Time.parse("2001-01-01 10:00:00UTC") }
465
- let(:log) { StringIO.new }
466
- let(:given_args) do
467
- [
468
- "foo",
469
- {
470
- :foo => "Foo",
471
- "bar" => "Bar",
472
- "baz" => { "1" => "foo" }
473
- }
474
- ]
475
- end
476
- let(:expected_args) do
477
- [
478
- "foo",
479
- {
480
- "_aj_symbol_keys" => ["foo"],
481
- "foo" => "Foo",
482
- "bar" => "Bar",
483
- "baz" => {
484
- "_aj_symbol_keys" => [],
485
- "1" => "foo"
486
- }
487
- }
488
- ]
489
- end
490
- let(:expected_wrapped_args) do
491
- if DependencyHelper.active_job_wraps_args?
492
- [{
493
- "_aj_ruby2_keywords" => ["args"],
494
- "args" => expected_args
495
- }]
496
- else
497
- expected_args
498
- end
499
- end
500
- let(:expected_tags) do
501
- { "executions" => 1 }.tap do |hash|
502
- hash["active_job_id"] = kind_of(String)
503
- if DependencyHelper.rails_version >= Gem::Version.new("5.0.0")
504
- hash["provider_job_id"] = kind_of(String)
505
- end
506
- end
507
- end
508
- let(:expected_perform_events) do
509
- if DependencyHelper.rails7_present?
510
- ["perform_job.sidekiq", "perform.active_job", "perform_start.active_job"]
511
- else
512
- ["perform_job.sidekiq", "perform_start.active_job", "perform.active_job"]
513
- end
514
- end
515
- around do |example|
516
- with_rails_error_reporter do
517
- keep_transactions do
518
- Sidekiq::Testing.fake! do
519
- example.run
520
- end
521
- end
522
- end
523
- end
524
- before do
525
- start_agent
526
- Appsignal.internal_logger = test_logger(log)
527
- ActiveJob::Base.queue_adapter = :sidekiq
528
-
529
- class ActiveJobSidekiqTestJob < ActiveJob::Base
530
- self.queue_adapter = :sidekiq
531
-
532
- def perform(*_args)
533
- end
534
- end
535
-
536
- class ActiveJobSidekiqErrorTestJob < ActiveJob::Base
537
- self.queue_adapter = :sidekiq
538
-
539
- def perform(*_args)
540
- raise "uh oh"
541
- end
542
- end
543
- # Manually add the AppSignal middleware for the Testing environment.
544
- # It doesn't use configured middlewares by default looks like.
545
- # We test somewhere else if the middleware is installed properly.
546
- Sidekiq::Testing.server_middleware do |chain|
547
- chain.add Appsignal::Integrations::SidekiqMiddleware
548
- end
549
- end
550
- after do
551
- Object.send(:remove_const, :ActiveJobSidekiqTestJob)
552
- Object.send(:remove_const, :ActiveJobSidekiqErrorTestJob)
553
- end
554
-
555
- it "reports the transaction from the ActiveJob integration" do
556
- perform_sidekiq_job(ActiveJobSidekiqTestJob, given_args)
557
-
558
- transaction = last_transaction
559
- expect(transaction).to have_namespace(namespace)
560
- expect(transaction).to have_action("ActiveJobSidekiqTestJob#perform")
561
- expect(transaction).to_not have_error
562
- expect(transaction).to include_metadata("queue" => "default")
563
- expect(transaction).to_not include_environment
564
- expect(transaction).to include_params([expected_args])
565
- expect(transaction).to include_tags(expected_tags.merge("queue" => "default"))
566
- expect(transaction).to have_queue_start(time.to_i * 1000)
567
-
568
- events = transaction.to_h["events"]
569
- .sort_by { |e| e["start"] }
570
- .map { |event| event["name"] }
571
- expect(events).to eq(expected_perform_events)
572
- end
573
-
574
- context "with error" do
575
- it "reports the error on the transaction from the ActiveRecord integration" do
576
- expect do
577
- perform_sidekiq_job(ActiveJobSidekiqErrorTestJob, given_args)
578
- end.to raise_error(RuntimeError, "uh oh")
579
-
580
- transaction = last_transaction
581
- expect(transaction).to have_namespace(namespace)
582
- expect(transaction).to have_action("ActiveJobSidekiqErrorTestJob#perform")
583
- expect(transaction).to have_error("RuntimeError", "uh oh")
584
- expect(transaction).to include_metadata("queue" => "default")
585
- expect(transaction).to_not include_environment
586
- expect(transaction).to include_params([expected_args])
587
- expect(transaction).to include_tags(expected_tags.merge("queue" => "default"))
588
- expect(transaction).to have_queue_start(time.to_i * 1000)
589
-
590
- events = transaction.to_h["events"]
591
- .sort_by { |e| e["start"] }
592
- .map { |event| event["name"] }
593
- expect(events).to eq(expected_perform_events)
594
- end
595
- end
596
-
597
- context "with ActionMailer" do
598
- include ActionMailerHelpers
599
-
600
- before do
601
- class ActionMailerSidekiqTestJob < ActionMailer::Base
602
- def welcome(*args)
603
- end
604
- end
605
- end
606
-
607
- it "reports ActionMailer data on the transaction" do
608
- perform_mailer(ActionMailerSidekiqTestJob, :welcome, given_args)
609
-
610
- transaction = last_transaction
611
- expect(transaction).to have_action("ActionMailerSidekiqTestJob#welcome")
612
- expect(transaction).to include_params(
613
- ["ActionMailerSidekiqTestJob", "welcome",
614
- "deliver_now"] + expected_wrapped_args
615
- )
616
- end
617
- end
618
-
619
- def perform_sidekiq
620
- Timecop.freeze(time) do
621
- yield
622
- # Combined with Sidekiq::Testing.fake! and drain_all we get a
623
- # enqueue_at in the job data.
624
- Sidekiq::Worker.drain_all
625
- rescue Exception => exception # rubocop:disable Lint/RescueException
626
- raise exception
627
- ensure
628
- Appsignal::Integrations::SidekiqErrorHandler.new.call(exception, {}) if exception
629
- end
630
- end
631
-
632
- def perform_sidekiq_job(job_class, args)
633
- perform_sidekiq { job_class.perform_later(args) }
634
- end
635
-
636
- def perform_mailer(mailer, method, args = nil)
637
- perform_sidekiq { perform_action_mailer(mailer, method, args) }
638
- end
639
- end
640
- end