appsignal 4.0.6-java → 4.0.7-java

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 (201) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +12 -0
  3. data/Rakefile +9 -9
  4. data/appsignal.gemspec +22 -1
  5. data/ext/agent.rb +27 -27
  6. data/lib/appsignal/check_in.rb +1 -1
  7. data/lib/appsignal/config.rb +1 -3
  8. data/lib/appsignal/integrations/resque.rb +1 -6
  9. data/lib/appsignal/utils/hash_sanitizer.rb +4 -0
  10. data/lib/appsignal/version.rb +1 -1
  11. metadata +2 -192
  12. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
  13. data/.github/ISSUE_TEMPLATE/chore.md +0 -14
  14. data/.github/workflows/ci.yml +0 -3285
  15. data/.github/workflows/create_release_from_tag.yml +0 -62
  16. data/.gitignore +0 -35
  17. data/.gitmodules +0 -3
  18. data/.rspec +0 -4
  19. data/.yardopts +0 -8
  20. data/benchmark.rake +0 -139
  21. data/gemfiles/capistrano2.gemfile +0 -6
  22. data/gemfiles/capistrano3.gemfile +0 -7
  23. data/gemfiles/dry-monitor.gemfile +0 -5
  24. data/gemfiles/grape.gemfile +0 -5
  25. data/gemfiles/hanami-2.0.gemfile +0 -7
  26. data/gemfiles/hanami-2.1.gemfile +0 -7
  27. data/gemfiles/http5.gemfile +0 -5
  28. data/gemfiles/no_dependencies.gemfile +0 -10
  29. data/gemfiles/padrino.gemfile +0 -7
  30. data/gemfiles/psych-3.gemfile +0 -5
  31. data/gemfiles/psych-4.gemfile +0 -5
  32. data/gemfiles/que-1.gemfile +0 -5
  33. data/gemfiles/que-2.gemfile +0 -5
  34. data/gemfiles/rails-6.0.gemfile +0 -10
  35. data/gemfiles/rails-6.1.gemfile +0 -11
  36. data/gemfiles/rails-7.0.gemfile +0 -11
  37. data/gemfiles/rails-7.1.gemfile +0 -11
  38. data/gemfiles/rails-7.2.gemfile +0 -11
  39. data/gemfiles/redis-4.gemfile +0 -5
  40. data/gemfiles/redis-5.gemfile +0 -6
  41. data/gemfiles/resque-2.gemfile +0 -6
  42. data/gemfiles/sequel.gemfile +0 -10
  43. data/gemfiles/sinatra.gemfile +0 -5
  44. data/gemfiles/webmachine1.gemfile +0 -7
  45. data/gemfiles/webmachine2.gemfile +0 -6
  46. data/mono.yml +0 -16
  47. data/spec/.rubocop.yml +0 -7
  48. data/spec/lib/appsignal/auth_check_spec.rb +0 -84
  49. data/spec/lib/appsignal/capistrano2_spec.rb +0 -227
  50. data/spec/lib/appsignal/capistrano3_spec.rb +0 -284
  51. data/spec/lib/appsignal/check_in/cron_spec.rb +0 -210
  52. data/spec/lib/appsignal/check_in/scheduler_spec.rb +0 -557
  53. data/spec/lib/appsignal/cli/demo_spec.rb +0 -46
  54. data/spec/lib/appsignal/cli/diagnose/paths_spec.rb +0 -16
  55. data/spec/lib/appsignal/cli/diagnose/utils_spec.rb +0 -86
  56. data/spec/lib/appsignal/cli/diagnose_spec.rb +0 -1553
  57. data/spec/lib/appsignal/cli/helpers_spec.rb +0 -179
  58. data/spec/lib/appsignal/cli/install_spec.rb +0 -848
  59. data/spec/lib/appsignal/cli_spec.rb +0 -56
  60. data/spec/lib/appsignal/config_spec.rb +0 -1380
  61. data/spec/lib/appsignal/demo_spec.rb +0 -83
  62. data/spec/lib/appsignal/environment_spec.rb +0 -190
  63. data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +0 -60
  64. data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +0 -21
  65. data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +0 -21
  66. data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +0 -52
  67. data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +0 -21
  68. data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +0 -84
  69. data/spec/lib/appsignal/event_formatter/rom/sql_formatter_spec.rb +0 -22
  70. data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +0 -30
  71. data/spec/lib/appsignal/event_formatter/view_component/render_formatter_spec.rb +0 -41
  72. data/spec/lib/appsignal/event_formatter_spec.rb +0 -193
  73. data/spec/lib/appsignal/extension/jruby_spec.rb +0 -46
  74. data/spec/lib/appsignal/extension_install_failure_spec.rb +0 -20
  75. data/spec/lib/appsignal/extension_spec.rb +0 -178
  76. data/spec/lib/appsignal/garbage_collection_spec.rb +0 -98
  77. data/spec/lib/appsignal/hooks/action_cable_spec.rb +0 -345
  78. data/spec/lib/appsignal/hooks/action_mailer_spec.rb +0 -55
  79. data/spec/lib/appsignal/hooks/active_support_notifications/finish_with_state_shared_examples.rb +0 -23
  80. data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +0 -99
  81. data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +0 -47
  82. data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +0 -47
  83. data/spec/lib/appsignal/hooks/activejob_spec.rb +0 -650
  84. data/spec/lib/appsignal/hooks/at_exit_spec.rb +0 -105
  85. data/spec/lib/appsignal/hooks/celluloid_spec.rb +0 -40
  86. data/spec/lib/appsignal/hooks/data_mapper_spec.rb +0 -40
  87. data/spec/lib/appsignal/hooks/delayed_job_spec.rb +0 -38
  88. data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +0 -83
  89. data/spec/lib/appsignal/hooks/excon_spec.rb +0 -67
  90. data/spec/lib/appsignal/hooks/gvl_spec.rb +0 -145
  91. data/spec/lib/appsignal/hooks/http_spec.rb +0 -37
  92. data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +0 -46
  93. data/spec/lib/appsignal/hooks/mri_spec.rb +0 -23
  94. data/spec/lib/appsignal/hooks/net_http_spec.rb +0 -18
  95. data/spec/lib/appsignal/hooks/passenger_spec.rb +0 -30
  96. data/spec/lib/appsignal/hooks/puma_spec.rb +0 -80
  97. data/spec/lib/appsignal/hooks/que_spec.rb +0 -19
  98. data/spec/lib/appsignal/hooks/rake_spec.rb +0 -144
  99. data/spec/lib/appsignal/hooks/redis_client_spec.rb +0 -218
  100. data/spec/lib/appsignal/hooks/redis_spec.rb +0 -124
  101. data/spec/lib/appsignal/hooks/resque_spec.rb +0 -27
  102. data/spec/lib/appsignal/hooks/sequel_spec.rb +0 -44
  103. data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -29
  104. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +0 -115
  105. data/spec/lib/appsignal/hooks/unicorn_spec.rb +0 -63
  106. data/spec/lib/appsignal/hooks/webmachine_spec.rb +0 -24
  107. data/spec/lib/appsignal/hooks_spec.rb +0 -124
  108. data/spec/lib/appsignal/integrations/data_mapper_spec.rb +0 -74
  109. data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +0 -454
  110. data/spec/lib/appsignal/integrations/http_spec.rb +0 -111
  111. data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +0 -154
  112. data/spec/lib/appsignal/integrations/net_http_spec.rb +0 -33
  113. data/spec/lib/appsignal/integrations/object_spec.rb +0 -347
  114. data/spec/lib/appsignal/integrations/puma_spec.rb +0 -150
  115. data/spec/lib/appsignal/integrations/que_spec.rb +0 -187
  116. data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -457
  117. data/spec/lib/appsignal/integrations/resque_spec.rb +0 -155
  118. data/spec/lib/appsignal/integrations/shoryuken_spec.rb +0 -165
  119. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +0 -640
  120. data/spec/lib/appsignal/integrations/webmachine_spec.rb +0 -136
  121. data/spec/lib/appsignal/loaders/grape_spec.rb +0 -12
  122. data/spec/lib/appsignal/loaders/hanami_spec.rb +0 -92
  123. data/spec/lib/appsignal/loaders/padrino_spec.rb +0 -273
  124. data/spec/lib/appsignal/loaders/sinatra_spec.rb +0 -44
  125. data/spec/lib/appsignal/loaders_spec.rb +0 -144
  126. data/spec/lib/appsignal/logger_spec.rb +0 -205
  127. data/spec/lib/appsignal/marker_spec.rb +0 -51
  128. data/spec/lib/appsignal/probes/gvl_spec.rb +0 -164
  129. data/spec/lib/appsignal/probes/mri_spec.rb +0 -162
  130. data/spec/lib/appsignal/probes/sidekiq_spec.rb +0 -333
  131. data/spec/lib/appsignal/probes_spec.rb +0 -414
  132. data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +0 -370
  133. data/spec/lib/appsignal/rack/body_wrapper_spec.rb +0 -319
  134. data/spec/lib/appsignal/rack/event_handler_spec.rb +0 -441
  135. data/spec/lib/appsignal/rack/grape_middleware_spec.rb +0 -201
  136. data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +0 -36
  137. data/spec/lib/appsignal/rack/instrumentation_middleware_spec.rb +0 -38
  138. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +0 -126
  139. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +0 -217
  140. data/spec/lib/appsignal/rack_spec.rb +0 -243
  141. data/spec/lib/appsignal/sample_data_spec.rb +0 -238
  142. data/spec/lib/appsignal/span_spec.rb +0 -141
  143. data/spec/lib/appsignal/system_spec.rb +0 -126
  144. data/spec/lib/appsignal/transaction_spec.rb +0 -2115
  145. data/spec/lib/appsignal/transmitter_spec.rb +0 -198
  146. data/spec/lib/appsignal/utils/data_spec.rb +0 -166
  147. data/spec/lib/appsignal/utils/hash_sanitizer_spec.rb +0 -182
  148. data/spec/lib/appsignal/utils/integration_logger_spec.rb +0 -21
  149. data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +0 -153
  150. data/spec/lib/appsignal/utils/json_spec.rb +0 -44
  151. data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +0 -192
  152. data/spec/lib/appsignal_spec.rb +0 -1919
  153. data/spec/lib/puma/appsignal_spec.rb +0 -334
  154. data/spec/spec_helper.rb +0 -179
  155. data/spec/support/fixtures/generated_config.yml +0 -24
  156. data/spec/support/fixtures/projects/broken/config/appsignal.yml +0 -1
  157. data/spec/support/fixtures/projects/valid/config/appsignal.yml +0 -57
  158. data/spec/support/fixtures/projects/valid/log/.gitkeep +0 -0
  159. data/spec/support/fixtures/projects/valid_with_rails_app/config/application.rb +0 -16
  160. data/spec/support/fixtures/projects/valid_with_rails_app/config/appsignal.yml +0 -56
  161. data/spec/support/fixtures/projects/valid_with_rails_app/config/environment.rb +0 -10
  162. data/spec/support/fixtures/projects/valid_with_rails_app/log/.gitkeep +0 -0
  163. data/spec/support/fixtures/uploaded_file.txt +0 -0
  164. data/spec/support/hanami/hanami_app.rb +0 -29
  165. data/spec/support/helpers/action_mailer_helpers.rb +0 -25
  166. data/spec/support/helpers/activejob_helpers.rb +0 -27
  167. data/spec/support/helpers/api_request_helper.rb +0 -60
  168. data/spec/support/helpers/cli_helpers.rb +0 -40
  169. data/spec/support/helpers/config_helpers.rb +0 -66
  170. data/spec/support/helpers/dependency_helper.rb +0 -155
  171. data/spec/support/helpers/directory_helper.rb +0 -27
  172. data/spec/support/helpers/env_helpers.rb +0 -41
  173. data/spec/support/helpers/environment_metdata_helper.rb +0 -16
  174. data/spec/support/helpers/example_exception.rb +0 -13
  175. data/spec/support/helpers/example_standard_error.rb +0 -13
  176. data/spec/support/helpers/loader_helper.rb +0 -21
  177. data/spec/support/helpers/log_helpers.rb +0 -36
  178. data/spec/support/helpers/rails_helper.rb +0 -28
  179. data/spec/support/helpers/std_streams_helper.rb +0 -94
  180. data/spec/support/helpers/system_helpers.rb +0 -8
  181. data/spec/support/helpers/take_at_most_helper.rb +0 -21
  182. data/spec/support/helpers/time_helpers.rb +0 -11
  183. data/spec/support/helpers/transaction_helpers.rb +0 -122
  184. data/spec/support/helpers/wait_for_helper.rb +0 -39
  185. data/spec/support/matchers/contains_log.rb +0 -26
  186. data/spec/support/matchers/have_colorized_text.rb +0 -28
  187. data/spec/support/matchers/transaction.rb +0 -200
  188. data/spec/support/mocks/appsignal_mock.rb +0 -18
  189. data/spec/support/mocks/dummy_app.rb +0 -20
  190. data/spec/support/mocks/fake_gc_profiler.rb +0 -19
  191. data/spec/support/mocks/fake_gvl_tools.rb +0 -28
  192. data/spec/support/mocks/hash_like.rb +0 -10
  193. data/spec/support/mocks/mock_probe.rb +0 -13
  194. data/spec/support/mocks/puma_mock.rb +0 -43
  195. data/spec/support/shared_examples/instrument.rb +0 -48
  196. data/spec/support/stubs/appsignal/loaders/loader_stub.rb +0 -7
  197. data/spec/support/stubs/delayed_job.rb +0 -0
  198. data/spec/support/stubs/sidekiq/api.rb +0 -4
  199. data/spec/support/testing.rb +0 -203
  200. data/support/bundler_wrapper +0 -12
  201. data/support/install_deps +0 -33
@@ -1,345 +0,0 @@
1
- describe Appsignal::Hooks::ActionCableHook do
2
- if DependencyHelper.action_cable_present?
3
- context "with ActionCable" do
4
- require "action_cable/engine"
5
- # Require test helper to test with ConnectionStub
6
- require "action_cable/channel/test_case" if DependencyHelper.rails6_present?
7
-
8
- describe ".dependencies_present?" do
9
- subject { described_class.new.dependencies_present? }
10
-
11
- it "returns true" do
12
- is_expected.to be_truthy
13
- end
14
- end
15
-
16
- describe ActionCable::Channel::Base do
17
- let(:channel) do
18
- Class.new(ActionCable::Channel::Base) do
19
- def speak(_data)
20
- end
21
-
22
- def self.to_s
23
- "MyChannel"
24
- end
25
- end
26
- end
27
- let(:log) { StringIO.new }
28
- let(:server) do
29
- ActionCable::Server::Base.new.tap do |s|
30
- s.config.logger = ActiveSupport::Logger.new(log)
31
- end
32
- end
33
- let(:env) do
34
- http_request_env_with_data(
35
- "action_dispatch.request_id" => request_id,
36
- :params => params,
37
- :with_queue_start => true
38
- )
39
- end
40
- let(:connection) { ActionCable::Connection::Base.new(server, env) }
41
- let(:identifier) { { :channel => "MyChannel" }.to_json }
42
- let(:params) { {} }
43
- let(:request_id) { SecureRandom.uuid }
44
- let(:instance) { channel.new(connection, identifier, params) }
45
- before do
46
- start_agent
47
-
48
- # Stub transmit call for subscribe/unsubscribe tests
49
- allow(connection).to receive(:websocket)
50
- .and_return(instance_double("ActionCable::Connection::WebSocket", :transmit => nil))
51
- end
52
- around { |example| keep_transactions { example.run } }
53
-
54
- describe "#perform_action" do
55
- it "creates a transaction for an action" do
56
- instance.perform_action("message" => "foo", "action" => "speak")
57
-
58
- transaction = last_transaction
59
- expect(transaction).to have_id
60
- expect(transaction).to have_namespace(Appsignal::Transaction::ACTION_CABLE)
61
- expect(transaction).to have_action("MyChannel#speak")
62
- expect(transaction).to_not have_error
63
- expect(transaction).to include_metadata(
64
- "method" => "websocket",
65
- "path" => "/blog"
66
- )
67
- expect(transaction).to include_event(
68
- "body" => "",
69
- "body_format" => Appsignal::EventFormatter::DEFAULT,
70
- "count" => 1,
71
- "name" => "perform_action.action_cable",
72
- "title" => ""
73
- )
74
- expect(transaction).to include_params(
75
- "action" => "speak",
76
- "message" => "foo"
77
- )
78
- expect(transaction).to include_tags("request_id" => request_id)
79
- expect(transaction).to_not have_queue_start
80
- expect(transaction).to be_completed
81
- end
82
-
83
- context "without request_id (standalone server)" do
84
- let(:request_id) { nil }
85
-
86
- it "sets a generated request ID" do
87
- # Subscribe action, sets the request_id
88
- instance.subscribe_to_channel
89
-
90
- instance.perform_action("message" => "foo", "action" => "speak")
91
- expect(last_transaction).to include_tags("request_id" => kind_of(String))
92
- end
93
- end
94
-
95
- context "with an error in the action" do
96
- let(:channel) do
97
- Class.new(ActionCable::Channel::Base) do
98
- def speak(_data)
99
- raise ExampleException, "oh no!"
100
- end
101
-
102
- def self.to_s
103
- "MyChannel"
104
- end
105
- end
106
- end
107
-
108
- it "registers an error on the transaction" do
109
- expect do
110
- instance.perform_action("message" => "foo", "action" => "speak")
111
- end.to raise_error(ExampleException)
112
-
113
- transaction = last_transaction
114
- expect(transaction).to have_id
115
- expect(transaction).to have_action("MyChannel#speak")
116
- expect(transaction).to have_namespace(Appsignal::Transaction::ACTION_CABLE)
117
- expect(transaction).to have_error("ExampleException", "oh no!")
118
- expect(transaction).to include_metadata(
119
- "method" => "websocket",
120
- "path" => "/blog"
121
- )
122
- expect(transaction).to include_params(
123
- "action" => "speak",
124
- "message" => "foo"
125
- )
126
- expect(transaction).to_not have_queue_start
127
- expect(transaction).to be_completed
128
- end
129
- end
130
- end
131
-
132
- describe "subscribe callback" do
133
- let(:params) { { "internal" => true } }
134
-
135
- it "creates a transaction for a subscription" do
136
- instance.subscribe_to_channel
137
-
138
- transaction = last_transaction
139
- expect(transaction).to have_id
140
- expect(transaction).to have_action("MyChannel#subscribed")
141
- expect(transaction).to have_namespace(Appsignal::Transaction::ACTION_CABLE)
142
- expect(transaction).to_not have_error
143
- expect(transaction).to include_metadata(
144
- "method" => "websocket",
145
- "path" => "/blog"
146
- )
147
- expect(transaction).to include_params("internal" => "true")
148
- expect(transaction).to include_event(
149
- "body" => "",
150
- "body_format" => Appsignal::EventFormatter::DEFAULT,
151
- "count" => 1,
152
- "name" => "subscribed.action_cable",
153
- "title" => ""
154
- )
155
- expect(transaction).to include_tags("request_id" => request_id)
156
- expect(transaction).to_not have_queue_start
157
- expect(transaction).to be_completed
158
- end
159
-
160
- context "without request_id (standalone server)" do
161
- let(:request_id) { nil }
162
- before { instance.subscribe_to_channel }
163
-
164
- it "sets a generated request ID" do
165
- expect(last_transaction).to include_tags("request_id" => kind_of(String))
166
- end
167
- end
168
-
169
- context "with an error in the callback" do
170
- let(:channel) do
171
- Class.new(ActionCable::Channel::Base) do
172
- def subscribed
173
- raise ExampleException, "oh no!"
174
- end
175
-
176
- def self.to_s
177
- "MyChannel"
178
- end
179
- end
180
- end
181
-
182
- it "registers an error on the transaction" do
183
- expect do
184
- instance.subscribe_to_channel
185
- end.to raise_error(ExampleException)
186
-
187
- transaction = last_transaction
188
- expect(transaction).to have_id
189
- expect(transaction).to have_action("MyChannel#subscribed")
190
- expect(transaction).to have_namespace(Appsignal::Transaction::ACTION_CABLE)
191
- expect(transaction).to have_error("ExampleException", "oh no!")
192
- expect(transaction).to include_metadata(
193
- "method" => "websocket",
194
- "path" => "/blog"
195
- )
196
- expect(transaction).to include_params("internal" => "true")
197
- expect(transaction).to_not have_queue_start
198
- expect(transaction).to be_completed
199
- end
200
- end
201
-
202
- if DependencyHelper.rails6_present?
203
- context "with ConnectionStub" do
204
- let(:connection) { ActionCable::Channel::ConnectionStub.new }
205
-
206
- it "does not fail on missing `#env` method on `ConnectionStub`" do
207
- instance.subscribe_to_channel
208
-
209
- transaction = last_transaction
210
- expect(transaction).to have_id
211
- expect(transaction).to have_action("MyChannel#subscribed")
212
- expect(transaction).to have_namespace(Appsignal::Transaction::ACTION_CABLE)
213
- expect(transaction).to_not have_error
214
- expect(transaction).to include_metadata(
215
- "method" => "websocket",
216
- "path" => "" # No path as the ConnectionStub doesn't have the real request env
217
- )
218
- expect(transaction).to_not include_params
219
- expect(transaction).to include_event(
220
- "body" => "",
221
- "body_format" => Appsignal::EventFormatter::DEFAULT,
222
- "count" => 1,
223
- "name" => "subscribed.action_cable",
224
- "title" => ""
225
- )
226
- expect(transaction).to_not have_queue_start
227
- expect(transaction).to be_completed
228
- end
229
- end
230
- end
231
- end
232
-
233
- describe "unsubscribe callback" do
234
- let(:params) { { "internal" => true } }
235
-
236
- it "creates a transaction for a subscription" do
237
- instance.unsubscribe_from_channel
238
-
239
- transaction = last_transaction
240
- expect(transaction).to have_id
241
- expect(transaction).to have_action("MyChannel#unsubscribed")
242
- expect(transaction).to have_namespace(Appsignal::Transaction::ACTION_CABLE)
243
- expect(transaction).to_not have_error
244
- expect(transaction).to include_metadata(
245
- "method" => "websocket",
246
- "path" => "/blog"
247
- )
248
- expect(transaction).to include_params("internal" => "true")
249
- expect(transaction).to include_event(
250
- "body" => "",
251
- "body_format" => Appsignal::EventFormatter::DEFAULT,
252
- "count" => 1,
253
- "name" => "unsubscribed.action_cable",
254
- "title" => ""
255
- )
256
- expect(transaction).to_not have_queue_start
257
- expect(transaction).to be_completed
258
- end
259
-
260
- context "without request_id (standalone server)" do
261
- let(:request_id) { nil }
262
- before { instance.unsubscribe_from_channel }
263
-
264
- it "sets a generated request ID" do
265
- expect(last_transaction).to include_tags("request_id" => kind_of(String))
266
- end
267
- end
268
-
269
- context "with an error in the callback" do
270
- let(:channel) do
271
- Class.new(ActionCable::Channel::Base) do
272
- def unsubscribed
273
- raise ExampleException, "oh no!"
274
- end
275
-
276
- def self.to_s
277
- "MyChannel"
278
- end
279
- end
280
- end
281
-
282
- it "registers an error on the transaction" do
283
- expect do
284
- instance.unsubscribe_from_channel
285
- end.to raise_error(ExampleException)
286
-
287
- transaction = last_transaction
288
- expect(transaction).to have_id
289
- expect(transaction).to have_action("MyChannel#unsubscribed")
290
- expect(transaction).to have_namespace(Appsignal::Transaction::ACTION_CABLE)
291
- expect(transaction).to have_error("ExampleException", "oh no!")
292
- expect(transaction).to include_metadata(
293
- "method" => "websocket",
294
- "path" => "/blog"
295
- )
296
- expect(transaction).to include_params("internal" => "true")
297
- expect(transaction).to_not have_queue_start
298
- expect(transaction).to be_completed
299
- end
300
- end
301
-
302
- if DependencyHelper.rails6_present?
303
- context "with ConnectionStub" do
304
- let(:connection) { ActionCable::Channel::ConnectionStub.new }
305
-
306
- it "does not fail on missing `#env` method on `ConnectionStub`" do
307
- instance.unsubscribe_from_channel
308
-
309
- transaction = last_transaction
310
- expect(transaction).to have_id
311
- expect(transaction).to have_action("MyChannel#unsubscribed")
312
- expect(transaction).to have_namespace(Appsignal::Transaction::ACTION_CABLE)
313
- expect(transaction).to_not have_error
314
- expect(transaction).to include_metadata(
315
- "method" => "websocket",
316
- "path" => "" # No path as the ConnectionStub doesn't have the real request env
317
- )
318
- expect(transaction).to_not include_params
319
- expect(transaction).to include_event(
320
- "body" => "",
321
- "body_format" => Appsignal::EventFormatter::DEFAULT,
322
- "count" => 1,
323
- "name" => "unsubscribed.action_cable",
324
- "title" => ""
325
- )
326
- expect(transaction).to_not have_queue_start
327
- expect(transaction).to be_completed
328
- end
329
- end
330
- end
331
- end
332
- end
333
- end
334
- else
335
- context "without ActionCable" do
336
- describe ".dependencies_present?" do
337
- subject { described_class.new.dependencies_present? }
338
-
339
- it "returns false" do
340
- is_expected.to be_falsy
341
- end
342
- end
343
- end
344
- end
345
- end
@@ -1,55 +0,0 @@
1
- describe Appsignal::Hooks::ActionMailerHook do
2
- if DependencyHelper.action_mailer_present? &&
3
- DependencyHelper.rails_version >= Gem::Version.new("4.0.0")
4
- context "with ActionMailer" do
5
- require "action_mailer"
6
-
7
- class UserMailer < ActionMailer::Base
8
- default :from => "test@example.com"
9
-
10
- def welcome
11
- mail(:to => "test@example.com", :subject => "ActionMailer test",
12
- :content_type => "text/html") do |format|
13
- format.html { render :html => "This is a test" }
14
- end
15
- end
16
- end
17
- UserMailer.delivery_method = :test
18
-
19
- describe ".dependencies_present?" do
20
- subject { described_class.new.dependencies_present? }
21
-
22
- it "returns true" do
23
- is_expected.to be_truthy
24
- end
25
- end
26
-
27
- describe ".install" do
28
- before do
29
- start_agent
30
- expect(Appsignal.active?).to be_truthy
31
- end
32
-
33
- it "is subscribed to 'process.action_mailer' and processes instrumentation" do
34
- expect(Appsignal).to receive(:increment_counter).with(
35
- :action_mailer_process,
36
- 1,
37
- :mailer => "UserMailer", :action => :welcome
38
- )
39
-
40
- UserMailer.welcome.deliver_now
41
- end
42
- end
43
- end
44
- else
45
- context "without ActionMailer" do
46
- describe ".dependencies_present?" do
47
- subject { described_class.new.dependencies_present? }
48
-
49
- it "returns false" do
50
- is_expected.to be_falsy
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,23 +0,0 @@
1
- shared_examples "activesupport finish_with_state override" do
2
- let(:instrumenter) { as.instrumenter }
3
-
4
- it "instruments an ActiveSupport::Notifications.start/finish event with payload on finish" do
5
- listeners_state = instrumenter.start("sql.active_record", {})
6
- instrumenter.finish_with_state(listeners_state, "sql.active_record", :sql => "SQL")
7
-
8
- expect(transaction).to include_event(
9
- "body" => "SQL",
10
- "body_format" => Appsignal::EventFormatter::SQL_BODY_FORMAT,
11
- "count" => 1,
12
- "name" => "sql.active_record",
13
- "title" => ""
14
- )
15
- end
16
-
17
- it "does not instrument events whose name starts with a bang" do
18
- listeners_state = instrumenter.start("!sql.active_record", {})
19
- instrumenter.finish_with_state(listeners_state, "!sql.active_record", :sql => "SQL")
20
-
21
- expect(transaction).to_not include_events
22
- end
23
- end
@@ -1,99 +0,0 @@
1
- shared_examples "activesupport instrument override" do
2
- it "instruments an ActiveSupport::Notifications.instrument event" do
3
- return_value = as.instrument("sql.active_record", :sql => "SQL") do
4
- "value"
5
- end
6
-
7
- expect(return_value).to eq "value"
8
- expect(transaction).to include_event(
9
- "body" => "SQL",
10
- "body_format" => Appsignal::EventFormatter::SQL_BODY_FORMAT,
11
- "count" => 1,
12
- "name" => "sql.active_record",
13
- "title" => ""
14
- )
15
- end
16
-
17
- it "instruments an ActiveSupport::Notifications.instrument event with no registered formatter" do
18
- return_value = as.instrument("no-registered.formatter", :key => "something") do
19
- "value"
20
- end
21
-
22
- expect(return_value).to eq "value"
23
- expect(transaction).to include_event(
24
- "body" => "",
25
- "body_format" => Appsignal::EventFormatter::DEFAULT,
26
- "count" => 1,
27
- "name" => "no-registered.formatter",
28
- "title" => ""
29
- )
30
- end
31
-
32
- it "converts non-string names to strings" do
33
- as.instrument(:not_a_string) {} # rubocop:disable Lint/EmptyBlock
34
- expect(transaction).to include_event(
35
- "body" => "",
36
- "body_format" => Appsignal::EventFormatter::DEFAULT,
37
- "count" => 1,
38
- "name" => "not_a_string",
39
- "title" => ""
40
- )
41
- end
42
-
43
- it "does not instrument events whose name starts with a bang" do
44
- return_value = as.instrument("!sql.active_record", :sql => "SQL") do
45
- "value"
46
- end
47
-
48
- expect(return_value).to eq "value"
49
-
50
- expect(transaction).to_not include_events
51
- end
52
-
53
- context "when an error is raised in an instrumented block" do
54
- it "instruments an ActiveSupport::Notifications.instrument event" do
55
- expect do
56
- as.instrument("sql.active_record", :sql => "SQL") do
57
- raise ExampleException, "foo"
58
- end
59
- end.to raise_error(ExampleException, "foo")
60
-
61
- expect(transaction).to include_event(
62
- "body" => "SQL",
63
- "body_format" => Appsignal::EventFormatter::SQL_BODY_FORMAT,
64
- "count" => 1,
65
- "name" => "sql.active_record",
66
- "title" => ""
67
- )
68
- end
69
- end
70
-
71
- context "when a message is thrown in an instrumented block" do
72
- it "instruments an ActiveSupport::Notifications.instrument event" do
73
- expect do
74
- as.instrument("sql.active_record", :sql => "SQL") do
75
- throw :foo
76
- end
77
- end.to throw_symbol(:foo)
78
-
79
- expect(transaction).to include_event(
80
- "body" => "SQL",
81
- "body_format" => Appsignal::EventFormatter::SQL_BODY_FORMAT,
82
- "count" => 1,
83
- "name" => "sql.active_record",
84
- "title" => ""
85
- )
86
- end
87
- end
88
-
89
- context "when a transaction is completed in an instrumented block" do
90
- it "does not complete the ActiveSupport::Notifications.instrument event" do
91
- as.instrument("sql.active_record", :sql => "SQL") do
92
- Appsignal::Transaction.complete_current!
93
- end
94
-
95
- expect(transaction).to_not include_events
96
- expect(transaction).to be_completed
97
- end
98
- end
99
- end
@@ -1,47 +0,0 @@
1
- shared_examples "activesupport start finish override" do
2
- let(:instrumenter) { as.instrumenter }
3
-
4
- it "instruments start/finish events with payload on start ignores payload" do
5
- instrumenter.start("sql.active_record", :sql => "SQL")
6
- instrumenter.finish("sql.active_record", {})
7
-
8
- expect(transaction).to include_event(
9
- "body" => "",
10
- "body_format" => Appsignal::EventFormatter::SQL_BODY_FORMAT,
11
- "count" => 1,
12
- "name" => "sql.active_record",
13
- "title" => ""
14
- )
15
- end
16
-
17
- it "instruments an ActiveSupport::Notifications.start/finish event with payload on finish" do
18
- instrumenter.start("sql.active_record", {})
19
- instrumenter.finish("sql.active_record", :sql => "SQL")
20
-
21
- expect(transaction).to include_event(
22
- "body" => "SQL",
23
- "body_format" => Appsignal::EventFormatter::SQL_BODY_FORMAT,
24
- "count" => 1,
25
- "name" => "sql.active_record",
26
- "title" => ""
27
- )
28
- end
29
-
30
- it "does not instrument events whose name starts with a bang" do
31
- instrumenter.start("!sql.active_record", {})
32
- instrumenter.finish("!sql.active_record", {})
33
-
34
- expect(transaction).to_not include_events
35
- end
36
-
37
- context "when a transaction is completed in an instrumented block" do
38
- it "does not complete the ActiveSupport::Notifications.instrument event" do
39
- instrumenter.start("sql.active_record", {})
40
- Appsignal::Transaction.complete_current!
41
- instrumenter.finish("sql.active_record", {})
42
-
43
- expect(transaction).to_not include_events
44
- expect(transaction).to be_completed
45
- end
46
- end
47
- end
@@ -1,47 +0,0 @@
1
- require_relative "active_support_notifications/instrument_shared_examples"
2
-
3
- describe Appsignal::Hooks::ActiveSupportNotificationsHook do
4
- if active_support_present?
5
- let(:notifier) { ActiveSupport::Notifications::Fanout.new }
6
- let(:as) { ActiveSupport::Notifications }
7
- let(:transaction) { http_request_transaction }
8
- before do
9
- start_agent
10
- set_current_transaction(transaction)
11
- as.notifier = notifier
12
- end
13
- around { |example| keep_transactions { example.run } }
14
-
15
- describe "#dependencies_present?" do
16
- subject { described_class.new.dependencies_present? }
17
-
18
- it { is_expected.to be_truthy }
19
- end
20
-
21
- it_behaves_like "activesupport instrument override"
22
-
23
- if defined?(::ActiveSupport::Notifications::Fanout::Handle)
24
- require_relative "active_support_notifications/start_finish_shared_examples"
25
-
26
- it_behaves_like "activesupport start finish override"
27
- end
28
-
29
- if ::ActiveSupport::Notifications::Instrumenter.method_defined?(:start)
30
- require_relative "active_support_notifications/start_finish_shared_examples"
31
-
32
- it_behaves_like "activesupport start finish override"
33
- end
34
-
35
- if ::ActiveSupport::Notifications::Instrumenter.method_defined?(:finish_with_state)
36
- require_relative "active_support_notifications/finish_with_state_shared_examples"
37
-
38
- it_behaves_like "activesupport finish_with_state override"
39
- end
40
- else
41
- describe "#dependencies_present?" do
42
- subject { described_class.new.dependencies_present? }
43
-
44
- it { is_expected.to be_falsy }
45
- end
46
- end
47
- end