appsignal 4.0.6-java → 4.0.8-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 (202) 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/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. data/lib/appsignal.rb +10 -8
  12. metadata +2 -192
  13. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
  14. data/.github/ISSUE_TEMPLATE/chore.md +0 -14
  15. data/.github/workflows/ci.yml +0 -3285
  16. data/.github/workflows/create_release_from_tag.yml +0 -62
  17. data/.gitignore +0 -35
  18. data/.gitmodules +0 -3
  19. data/.rspec +0 -4
  20. data/.yardopts +0 -8
  21. data/benchmark.rake +0 -139
  22. data/gemfiles/capistrano2.gemfile +0 -6
  23. data/gemfiles/capistrano3.gemfile +0 -7
  24. data/gemfiles/dry-monitor.gemfile +0 -5
  25. data/gemfiles/grape.gemfile +0 -5
  26. data/gemfiles/hanami-2.0.gemfile +0 -7
  27. data/gemfiles/hanami-2.1.gemfile +0 -7
  28. data/gemfiles/http5.gemfile +0 -5
  29. data/gemfiles/no_dependencies.gemfile +0 -10
  30. data/gemfiles/padrino.gemfile +0 -7
  31. data/gemfiles/psych-3.gemfile +0 -5
  32. data/gemfiles/psych-4.gemfile +0 -5
  33. data/gemfiles/que-1.gemfile +0 -5
  34. data/gemfiles/que-2.gemfile +0 -5
  35. data/gemfiles/rails-6.0.gemfile +0 -10
  36. data/gemfiles/rails-6.1.gemfile +0 -11
  37. data/gemfiles/rails-7.0.gemfile +0 -11
  38. data/gemfiles/rails-7.1.gemfile +0 -11
  39. data/gemfiles/rails-7.2.gemfile +0 -11
  40. data/gemfiles/redis-4.gemfile +0 -5
  41. data/gemfiles/redis-5.gemfile +0 -6
  42. data/gemfiles/resque-2.gemfile +0 -6
  43. data/gemfiles/sequel.gemfile +0 -10
  44. data/gemfiles/sinatra.gemfile +0 -5
  45. data/gemfiles/webmachine1.gemfile +0 -7
  46. data/gemfiles/webmachine2.gemfile +0 -6
  47. data/mono.yml +0 -16
  48. data/spec/.rubocop.yml +0 -7
  49. data/spec/lib/appsignal/auth_check_spec.rb +0 -84
  50. data/spec/lib/appsignal/capistrano2_spec.rb +0 -227
  51. data/spec/lib/appsignal/capistrano3_spec.rb +0 -284
  52. data/spec/lib/appsignal/check_in/cron_spec.rb +0 -210
  53. data/spec/lib/appsignal/check_in/scheduler_spec.rb +0 -557
  54. data/spec/lib/appsignal/cli/demo_spec.rb +0 -46
  55. data/spec/lib/appsignal/cli/diagnose/paths_spec.rb +0 -16
  56. data/spec/lib/appsignal/cli/diagnose/utils_spec.rb +0 -86
  57. data/spec/lib/appsignal/cli/diagnose_spec.rb +0 -1553
  58. data/spec/lib/appsignal/cli/helpers_spec.rb +0 -179
  59. data/spec/lib/appsignal/cli/install_spec.rb +0 -848
  60. data/spec/lib/appsignal/cli_spec.rb +0 -56
  61. data/spec/lib/appsignal/config_spec.rb +0 -1380
  62. data/spec/lib/appsignal/demo_spec.rb +0 -83
  63. data/spec/lib/appsignal/environment_spec.rb +0 -190
  64. data/spec/lib/appsignal/event_formatter/action_view/render_formatter_spec.rb +0 -60
  65. data/spec/lib/appsignal/event_formatter/active_record/instantiation_formatter_spec.rb +0 -21
  66. data/spec/lib/appsignal/event_formatter/active_record/sql_formatter_spec.rb +0 -21
  67. data/spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb +0 -52
  68. data/spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb +0 -21
  69. data/spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb +0 -84
  70. data/spec/lib/appsignal/event_formatter/rom/sql_formatter_spec.rb +0 -22
  71. data/spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb +0 -30
  72. data/spec/lib/appsignal/event_formatter/view_component/render_formatter_spec.rb +0 -41
  73. data/spec/lib/appsignal/event_formatter_spec.rb +0 -193
  74. data/spec/lib/appsignal/extension/jruby_spec.rb +0 -46
  75. data/spec/lib/appsignal/extension_install_failure_spec.rb +0 -20
  76. data/spec/lib/appsignal/extension_spec.rb +0 -178
  77. data/spec/lib/appsignal/garbage_collection_spec.rb +0 -98
  78. data/spec/lib/appsignal/hooks/action_cable_spec.rb +0 -345
  79. data/spec/lib/appsignal/hooks/action_mailer_spec.rb +0 -55
  80. data/spec/lib/appsignal/hooks/active_support_notifications/finish_with_state_shared_examples.rb +0 -23
  81. data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +0 -99
  82. data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +0 -47
  83. data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +0 -47
  84. data/spec/lib/appsignal/hooks/activejob_spec.rb +0 -650
  85. data/spec/lib/appsignal/hooks/at_exit_spec.rb +0 -105
  86. data/spec/lib/appsignal/hooks/celluloid_spec.rb +0 -40
  87. data/spec/lib/appsignal/hooks/data_mapper_spec.rb +0 -40
  88. data/spec/lib/appsignal/hooks/delayed_job_spec.rb +0 -38
  89. data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +0 -83
  90. data/spec/lib/appsignal/hooks/excon_spec.rb +0 -67
  91. data/spec/lib/appsignal/hooks/gvl_spec.rb +0 -145
  92. data/spec/lib/appsignal/hooks/http_spec.rb +0 -37
  93. data/spec/lib/appsignal/hooks/mongo_ruby_driver_spec.rb +0 -46
  94. data/spec/lib/appsignal/hooks/mri_spec.rb +0 -23
  95. data/spec/lib/appsignal/hooks/net_http_spec.rb +0 -18
  96. data/spec/lib/appsignal/hooks/passenger_spec.rb +0 -30
  97. data/spec/lib/appsignal/hooks/puma_spec.rb +0 -80
  98. data/spec/lib/appsignal/hooks/que_spec.rb +0 -19
  99. data/spec/lib/appsignal/hooks/rake_spec.rb +0 -144
  100. data/spec/lib/appsignal/hooks/redis_client_spec.rb +0 -218
  101. data/spec/lib/appsignal/hooks/redis_spec.rb +0 -124
  102. data/spec/lib/appsignal/hooks/resque_spec.rb +0 -27
  103. data/spec/lib/appsignal/hooks/sequel_spec.rb +0 -44
  104. data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -29
  105. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +0 -115
  106. data/spec/lib/appsignal/hooks/unicorn_spec.rb +0 -63
  107. data/spec/lib/appsignal/hooks/webmachine_spec.rb +0 -24
  108. data/spec/lib/appsignal/hooks_spec.rb +0 -124
  109. data/spec/lib/appsignal/integrations/data_mapper_spec.rb +0 -74
  110. data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +0 -454
  111. data/spec/lib/appsignal/integrations/http_spec.rb +0 -111
  112. data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +0 -154
  113. data/spec/lib/appsignal/integrations/net_http_spec.rb +0 -33
  114. data/spec/lib/appsignal/integrations/object_spec.rb +0 -347
  115. data/spec/lib/appsignal/integrations/puma_spec.rb +0 -150
  116. data/spec/lib/appsignal/integrations/que_spec.rb +0 -187
  117. data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -457
  118. data/spec/lib/appsignal/integrations/resque_spec.rb +0 -155
  119. data/spec/lib/appsignal/integrations/shoryuken_spec.rb +0 -165
  120. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +0 -640
  121. data/spec/lib/appsignal/integrations/webmachine_spec.rb +0 -136
  122. data/spec/lib/appsignal/loaders/grape_spec.rb +0 -12
  123. data/spec/lib/appsignal/loaders/hanami_spec.rb +0 -92
  124. data/spec/lib/appsignal/loaders/padrino_spec.rb +0 -273
  125. data/spec/lib/appsignal/loaders/sinatra_spec.rb +0 -44
  126. data/spec/lib/appsignal/loaders_spec.rb +0 -144
  127. data/spec/lib/appsignal/logger_spec.rb +0 -205
  128. data/spec/lib/appsignal/marker_spec.rb +0 -51
  129. data/spec/lib/appsignal/probes/gvl_spec.rb +0 -164
  130. data/spec/lib/appsignal/probes/mri_spec.rb +0 -162
  131. data/spec/lib/appsignal/probes/sidekiq_spec.rb +0 -333
  132. data/spec/lib/appsignal/probes_spec.rb +0 -414
  133. data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +0 -370
  134. data/spec/lib/appsignal/rack/body_wrapper_spec.rb +0 -319
  135. data/spec/lib/appsignal/rack/event_handler_spec.rb +0 -441
  136. data/spec/lib/appsignal/rack/grape_middleware_spec.rb +0 -201
  137. data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +0 -36
  138. data/spec/lib/appsignal/rack/instrumentation_middleware_spec.rb +0 -38
  139. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +0 -126
  140. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +0 -217
  141. data/spec/lib/appsignal/rack_spec.rb +0 -243
  142. data/spec/lib/appsignal/sample_data_spec.rb +0 -238
  143. data/spec/lib/appsignal/span_spec.rb +0 -141
  144. data/spec/lib/appsignal/system_spec.rb +0 -126
  145. data/spec/lib/appsignal/transaction_spec.rb +0 -2115
  146. data/spec/lib/appsignal/transmitter_spec.rb +0 -198
  147. data/spec/lib/appsignal/utils/data_spec.rb +0 -166
  148. data/spec/lib/appsignal/utils/hash_sanitizer_spec.rb +0 -182
  149. data/spec/lib/appsignal/utils/integration_logger_spec.rb +0 -21
  150. data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +0 -153
  151. data/spec/lib/appsignal/utils/json_spec.rb +0 -44
  152. data/spec/lib/appsignal/utils/query_params_sanitizer_spec.rb +0 -192
  153. data/spec/lib/appsignal_spec.rb +0 -1919
  154. data/spec/lib/puma/appsignal_spec.rb +0 -334
  155. data/spec/spec_helper.rb +0 -179
  156. data/spec/support/fixtures/generated_config.yml +0 -24
  157. data/spec/support/fixtures/projects/broken/config/appsignal.yml +0 -1
  158. data/spec/support/fixtures/projects/valid/config/appsignal.yml +0 -57
  159. data/spec/support/fixtures/projects/valid/log/.gitkeep +0 -0
  160. data/spec/support/fixtures/projects/valid_with_rails_app/config/application.rb +0 -16
  161. data/spec/support/fixtures/projects/valid_with_rails_app/config/appsignal.yml +0 -56
  162. data/spec/support/fixtures/projects/valid_with_rails_app/config/environment.rb +0 -10
  163. data/spec/support/fixtures/projects/valid_with_rails_app/log/.gitkeep +0 -0
  164. data/spec/support/fixtures/uploaded_file.txt +0 -0
  165. data/spec/support/hanami/hanami_app.rb +0 -29
  166. data/spec/support/helpers/action_mailer_helpers.rb +0 -25
  167. data/spec/support/helpers/activejob_helpers.rb +0 -27
  168. data/spec/support/helpers/api_request_helper.rb +0 -60
  169. data/spec/support/helpers/cli_helpers.rb +0 -40
  170. data/spec/support/helpers/config_helpers.rb +0 -66
  171. data/spec/support/helpers/dependency_helper.rb +0 -155
  172. data/spec/support/helpers/directory_helper.rb +0 -27
  173. data/spec/support/helpers/env_helpers.rb +0 -41
  174. data/spec/support/helpers/environment_metdata_helper.rb +0 -16
  175. data/spec/support/helpers/example_exception.rb +0 -13
  176. data/spec/support/helpers/example_standard_error.rb +0 -13
  177. data/spec/support/helpers/loader_helper.rb +0 -21
  178. data/spec/support/helpers/log_helpers.rb +0 -36
  179. data/spec/support/helpers/rails_helper.rb +0 -28
  180. data/spec/support/helpers/std_streams_helper.rb +0 -94
  181. data/spec/support/helpers/system_helpers.rb +0 -8
  182. data/spec/support/helpers/take_at_most_helper.rb +0 -21
  183. data/spec/support/helpers/time_helpers.rb +0 -11
  184. data/spec/support/helpers/transaction_helpers.rb +0 -122
  185. data/spec/support/helpers/wait_for_helper.rb +0 -39
  186. data/spec/support/matchers/contains_log.rb +0 -26
  187. data/spec/support/matchers/have_colorized_text.rb +0 -28
  188. data/spec/support/matchers/transaction.rb +0 -200
  189. data/spec/support/mocks/appsignal_mock.rb +0 -18
  190. data/spec/support/mocks/dummy_app.rb +0 -20
  191. data/spec/support/mocks/fake_gc_profiler.rb +0 -19
  192. data/spec/support/mocks/fake_gvl_tools.rb +0 -28
  193. data/spec/support/mocks/hash_like.rb +0 -10
  194. data/spec/support/mocks/mock_probe.rb +0 -13
  195. data/spec/support/mocks/puma_mock.rb +0 -43
  196. data/spec/support/shared_examples/instrument.rb +0 -48
  197. data/spec/support/stubs/appsignal/loaders/loader_stub.rb +0 -7
  198. data/spec/support/stubs/delayed_job.rb +0 -0
  199. data/spec/support/stubs/sidekiq/api.rb +0 -4
  200. data/spec/support/testing.rb +0 -203
  201. data/support/bundler_wrapper +0 -12
  202. 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