appsignal 3.13.0-java → 4.0.0.beta.2-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +499 -487
  3. data/CHANGELOG.md +121 -0
  4. data/Rakefile +31 -7
  5. data/benchmark.rake +4 -6
  6. data/build_matrix.yml +45 -39
  7. data/ext/agent.rb +27 -27
  8. data/ext/appsignal_extension.c +25 -0
  9. data/gemfiles/rails-7.2.gemfile +11 -0
  10. data/lib/appsignal/check_in/cron.rb +2 -15
  11. data/lib/appsignal/cli/diagnose.rb +37 -28
  12. data/lib/appsignal/cli/install.rb +5 -1
  13. data/lib/appsignal/config.rb +57 -119
  14. data/lib/appsignal/demo.rb +2 -2
  15. data/lib/appsignal/extension/jruby.rb +14 -0
  16. data/lib/appsignal/helpers/instrumentation.rb +152 -416
  17. data/lib/appsignal/helpers/metrics.rb +0 -16
  18. data/lib/appsignal/hooks/action_cable.rb +8 -8
  19. data/lib/appsignal/hooks/active_job.rb +2 -2
  20. data/lib/appsignal/hooks/at_exit.rb +37 -0
  21. data/lib/appsignal/hooks.rb +1 -16
  22. data/lib/appsignal/integrations/action_cable.rb +2 -2
  23. data/lib/appsignal/integrations/capistrano/appsignal.cap +2 -4
  24. data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +1 -4
  25. data/lib/appsignal/integrations/delayed_job_plugin.rb +3 -3
  26. data/lib/appsignal/integrations/que.rb +2 -2
  27. data/lib/appsignal/integrations/railtie.rb +26 -59
  28. data/lib/appsignal/integrations/rake.rb +2 -2
  29. data/lib/appsignal/integrations/resque.rb +2 -2
  30. data/lib/appsignal/integrations/shoryuken.rb +4 -4
  31. data/lib/appsignal/integrations/sidekiq.rb +3 -3
  32. data/lib/appsignal/integrations/webmachine.rb +2 -2
  33. data/lib/appsignal/loaders.rb +1 -1
  34. data/lib/appsignal/probes.rb +0 -9
  35. data/lib/appsignal/rack/abstract_middleware.rb +4 -26
  36. data/lib/appsignal/rack/event_handler.rb +4 -4
  37. data/lib/appsignal/rack/rails_instrumentation.rb +1 -1
  38. data/lib/appsignal/rack.rb +0 -25
  39. data/lib/appsignal/sample_data.rb +108 -0
  40. data/lib/appsignal/transaction.rb +241 -359
  41. data/lib/appsignal/utils/rails_helper.rb +4 -0
  42. data/lib/appsignal/version.rb +1 -1
  43. data/lib/appsignal.rb +19 -71
  44. data/spec/lib/appsignal/auth_check_spec.rb +1 -1
  45. data/spec/lib/appsignal/capistrano2_spec.rb +1 -1
  46. data/spec/lib/appsignal/capistrano3_spec.rb +53 -13
  47. data/spec/lib/appsignal/check_in_spec.rb +1 -207
  48. data/spec/lib/appsignal/cli/demo_spec.rb +7 -27
  49. data/spec/lib/appsignal/cli/diagnose_spec.rb +145 -110
  50. data/spec/lib/appsignal/config_spec.rb +304 -379
  51. data/spec/lib/appsignal/extension_install_failure_spec.rb +5 -1
  52. data/spec/lib/appsignal/extension_spec.rb +5 -1
  53. data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +1 -1
  54. data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +1 -2
  55. data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +1 -0
  56. data/spec/lib/appsignal/hooks/activejob_spec.rb +7 -12
  57. data/spec/lib/appsignal/hooks/at_exit_spec.rb +72 -0
  58. data/spec/lib/appsignal/hooks/gvl_spec.rb +10 -5
  59. data/spec/lib/appsignal/hooks/http_spec.rb +3 -3
  60. data/spec/lib/appsignal/hooks/net_http_spec.rb +3 -3
  61. data/spec/lib/appsignal/hooks/rake_spec.rb +6 -9
  62. data/spec/lib/appsignal/hooks/redis_client_spec.rb +5 -10
  63. data/spec/lib/appsignal/hooks/redis_spec.rb +4 -7
  64. data/spec/lib/appsignal/hooks/resque_spec.rb +3 -5
  65. data/spec/lib/appsignal/hooks_spec.rb +0 -41
  66. data/spec/lib/appsignal/integrations/data_mapper_spec.rb +29 -20
  67. data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +4 -9
  68. data/spec/lib/appsignal/integrations/railtie_spec.rb +179 -157
  69. data/spec/lib/appsignal/integrations/shoryuken_spec.rb +3 -5
  70. data/spec/lib/appsignal/integrations/sidekiq_spec.rb +48 -62
  71. data/spec/lib/appsignal/loaders/hanami_spec.rb +6 -9
  72. data/spec/lib/appsignal/loaders/padrino_spec.rb +6 -10
  73. data/spec/lib/appsignal/loaders/sinatra_spec.rb +6 -9
  74. data/spec/lib/appsignal/loaders_spec.rb +8 -1
  75. data/spec/lib/appsignal/marker_spec.rb +1 -1
  76. data/spec/lib/appsignal/probes_spec.rb +4 -83
  77. data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +4 -63
  78. data/spec/lib/appsignal/rack/event_handler_spec.rb +18 -15
  79. data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +3 -11
  80. data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +4 -5
  81. data/spec/lib/appsignal/sample_data_spec.rb +213 -0
  82. data/spec/lib/appsignal/transaction_spec.rb +817 -1046
  83. data/spec/lib/appsignal/transmitter_spec.rb +6 -8
  84. data/spec/lib/appsignal_spec.rb +311 -643
  85. data/spec/spec_helper.rb +1 -3
  86. data/spec/support/fixtures/projects/valid/config/appsignal.yml +4 -7
  87. data/spec/support/fixtures/projects/valid_with_rails_app/config/application.rb +16 -0
  88. data/spec/support/fixtures/projects/valid_with_rails_app/config/appsignal.yml +56 -0
  89. data/spec/support/fixtures/projects/valid_with_rails_app/config/environment.rb +5 -0
  90. data/spec/support/helpers/api_request_helper.rb +3 -2
  91. data/spec/support/helpers/config_helpers.rb +41 -11
  92. data/spec/support/helpers/dependency_helper.rb +8 -0
  93. data/spec/support/helpers/log_helpers.rb +1 -0
  94. data/spec/support/helpers/rails_helper.rb +6 -6
  95. data/spec/support/helpers/transaction_helpers.rb +2 -24
  96. data/spec/support/matchers/transaction.rb +3 -3
  97. data/spec/support/mocks/appsignal_mock.rb +3 -3
  98. data/spec/support/mocks/mock_probe.rb +2 -0
  99. data/spec/support/testing.rb +2 -2
  100. metadata +12 -22
  101. data/gemfiles/que_beta.gemfile +0 -5
  102. data/lib/appsignal/helpers/heartbeat.rb +0 -20
  103. data/lib/appsignal/integrations/grape.rb +0 -35
  104. data/lib/appsignal/integrations/hanami.rb +0 -13
  105. data/lib/appsignal/integrations/padrino.rb +0 -13
  106. data/lib/appsignal/integrations/sinatra.rb +0 -13
  107. data/lib/appsignal/rack/generic_instrumentation.rb +0 -22
  108. data/lib/appsignal/rack/streaming_listener.rb +0 -28
  109. data/spec/lib/appsignal/integrations/grape_spec.rb +0 -36
  110. data/spec/lib/appsignal/integrations/hanami_spec.rb +0 -17
  111. data/spec/lib/appsignal/integrations/padrino_spec.rb +0 -15
  112. data/spec/lib/appsignal/integrations/sinatra_spec.rb +0 -15
  113. data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +0 -81
  114. data/spec/lib/appsignal/rack/streaming_listener_spec.rb +0 -69
  115. data/spec/support/fixtures/projects/valid/config/environments/development.rb +0 -0
  116. data/spec/support/fixtures/projects/valid/config/environments/production.rb +0 -0
  117. data/spec/support/fixtures/projects/valid/config/environments/test.rb +0 -0
  118. data/spec/support/rails/my_app.rb +0 -6
  119. /data/spec/support/fixtures/projects/{valid/config/application.rb → valid_with_rails_app/log/.gitkeep} +0 -0
@@ -3,8 +3,6 @@
3
3
  module Appsignal
4
4
  module Helpers
5
5
  module Instrumentation
6
- include Appsignal::Utils::StdoutAndLoggerMessage
7
-
8
6
  # Monitor a block of code with AppSignal.
9
7
  #
10
8
  # This is a helper to create an AppSignal transaction, track any errors
@@ -69,8 +67,8 @@ module Appsignal
69
67
  # ) do
70
68
  # # Some code
71
69
  #
72
- # Appsignal.set_tags(:tag1 => "value1", :tag2 => "value2")
73
- # Appsignal.set_params(:param1 => "value1", :param2 => "value2")
70
+ # Appsignal.add_tags(:tag1 => "value1", :tag2 => "value2")
71
+ # Appsignal.add_params(:param1 => "value1", :param2 => "value2")
74
72
  # end
75
73
  #
76
74
  # @example Call monitor within monitor will do nothing
@@ -117,7 +115,7 @@ module Appsignal
117
115
  if has_parent_transaction
118
116
  callers = caller
119
117
  Appsignal::Utils::StdoutAndLoggerMessage.warning \
120
- "An active transaction around this 'Appsignal.monitor' call. " \
118
+ "A transaction is active around this 'Appsignal.monitor' call. " \
121
119
  "Calling `Appsignal.monitor` in another `Appsignal.monitor` block has no effect. " \
122
120
  "The namespace and action are not updated for the active transaction." \
123
121
  "Did you mean to use `Appsignal.instrument`? " \
@@ -160,173 +158,6 @@ module Appsignal
160
158
  Appsignal.stop("monitor_and_stop")
161
159
  end
162
160
 
163
- # Creates an AppSignal transaction for the given block.
164
- #
165
- # If AppSignal is not {Appsignal.active?} it will still execute the
166
- # block, but not create a transaction for it.
167
- #
168
- # A event is created for this transaction with the name given in the
169
- # `name` argument. The event name must start with either `perform_job` or
170
- # `process_action` to differentiate between the "web" and "background"
171
- # namespace. Custom namespaces are not supported by this helper method.
172
- #
173
- # This helper method also captures any exception that occurs in the given
174
- # block.
175
- #
176
- # @example
177
- # Appsignal.monitor_transaction("perform_job.nightly_update") do
178
- # # your code
179
- # end
180
- #
181
- # @example with an environment
182
- # Appsignal.monitor_transaction(
183
- # "perform_job.nightly_update",
184
- # :metadata => { "user_id" => 1 }
185
- # ) do
186
- # # your code
187
- # end
188
- #
189
- # @param name [String] main event name.
190
- # @param env [Hash<Symbol, Object>]
191
- # @option env [Hash<Symbol/String, Object>] :params Params for the
192
- # monitored request/job, see {Appsignal::Transaction#params=} for more
193
- # information.
194
- # @option env [String] :controller name of the controller in which the
195
- # transaction was recorded.
196
- # @option env [String] :class name of the Ruby class in which the
197
- # transaction was recorded. If `:controller` is also given,
198
- # `:controller` is used instead.
199
- # @option env [String] :action name of the controller action in which the
200
- # transaction was recorded.
201
- # @option env [String] :method name of the Ruby method in which the
202
- # transaction was recorded. If `:action` is also given, `:action`
203
- # is used instead.
204
- # @option env [Integer] :queue_start the moment the request/job was
205
- # queued. Used to track how long requests/jobs were queued before being
206
- # executed.
207
- # @option env [Hash<Symbol/String, String/Fixnum>] :metadata Additional
208
- # metadata for the transaction, see
209
- # {Appsignal::Transaction#set_metadata} for more information.
210
- # @yield the block to monitor.
211
- # @raise [Exception] any exception that occurs within the given block is
212
- # re-raised by this method.
213
- # @return [Object] the value of the given block is returned.
214
- # @since 0.10.0
215
- def monitor_transaction(name, env = {}, &block)
216
- stdout_and_logger_warning \
217
- "The `Appsignal.monitor_transaction` helper is deprecated. " \
218
- "Please use `Appsignal.monitor` and `Appsignal.instrument` instead. " \
219
- "Read our instrumentation documentation: " \
220
- "https://docs.appsignal.com/ruby/instrumentation/instrumentation.html"
221
- _monitor_transaction(name, env, &block)
222
- end
223
-
224
- # @api private
225
- def _monitor_transaction(name, env = {}, &block)
226
- # Always verify input, even when Appsignal is not active.
227
- # This makes it more likely invalid arguments get flagged in test/dev
228
- # environments.
229
- if name.start_with?("perform_job")
230
- namespace = Appsignal::Transaction::BACKGROUND_JOB
231
- request = Appsignal::Transaction::InternalGenericRequest.new(env)
232
- elsif name.start_with?("process_action")
233
- namespace = Appsignal::Transaction::HTTP_REQUEST
234
- request = ::Rack::Request.new(env)
235
- else
236
- internal_logger.error "Unrecognized name '#{name}': names must " \
237
- "start with either 'perform_job' (for jobs and tasks) or " \
238
- "'process_action' (for HTTP requests)"
239
- return yield
240
- end
241
-
242
- return yield unless active?
243
-
244
- transaction = Appsignal::Transaction.create(
245
- SecureRandom.uuid,
246
- namespace,
247
- request
248
- )
249
- begin
250
- Appsignal.instrument(name, &block)
251
- rescue Exception => error # rubocop:disable Lint/RescueException
252
- transaction.set_error(error)
253
- raise error
254
- ensure
255
- transaction.set_http_or_background_action(request.env)
256
- queue_start = Appsignal::Rack::Utils.queue_start_from(request.env) ||
257
- (env[:queue_start]&.to_i&.* 1_000)
258
- transaction.set_queue_start(queue_start) if queue_start
259
- Appsignal::Transaction.complete_current!
260
- end
261
- end
262
-
263
- # Monitor a transaction, stop AppSignal and wait for this single
264
- # transaction to be flushed.
265
- #
266
- # Useful for cases such as Rake tasks and Resque-like systems where a
267
- # process is forked and immediately exits after the transaction finishes.
268
- #
269
- # @see monitor_transaction
270
- def monitor_single_transaction(name, env = {}, &block)
271
- stdout_and_logger_warning \
272
- "The `Appsignal.monitor_single_transaction` helper is deprecated. " \
273
- "Please use `Appsignal.monitor_and_stop` and `Appsignal.instrument` instead. " \
274
- "Read our instrumentation documentation: " \
275
- "https://docs.appsignal.com/ruby/instrumentation/instrumentation.html"
276
- monitor_transaction(name, env, &block)
277
- ensure
278
- stop("monitor_single_transaction")
279
- end
280
-
281
- # Listen for an error to occur and send it to AppSignal.
282
- #
283
- # Uses {.send_error} to directly send the error in a separate
284
- # transaction. Does not add the error to the current transaction.
285
- #
286
- # Make sure that AppSignal is integrated in your application beforehand.
287
- # AppSignal won't record errors unless {Appsignal.active?} is `true`.
288
- #
289
- # @example
290
- # # my_app.rb
291
- # # setup AppSignal beforehand
292
- #
293
- # Appsignal.listen_for_error do
294
- # # my code
295
- # raise "foo"
296
- # end
297
- #
298
- # @see Transaction.set_tags
299
- # @see Transaction.set_namespace
300
- # @see .send_error
301
- # @see https://docs.appsignal.com/ruby/instrumentation/integrating-appsignal.html
302
- # AppSignal integration guide
303
- # @see https://docs.appsignal.com/ruby/instrumentation/exception-handling.html
304
- # Exception handling guide
305
- #
306
- # @deprecated Use `rescue => error` with {.report_error} instead.
307
- # @param tags [Hash, nil]
308
- # @param namespace [String] the namespace for this error.
309
- # @yield yields the given block.
310
- # @return [Object] returns the return value of the given block.
311
- def listen_for_error(
312
- tags = nil,
313
- namespace = Appsignal::Transaction::HTTP_REQUEST
314
- )
315
- stdout_and_logger_warning \
316
- "The `Appsignal.listen_for_error` helper is deprecated. " \
317
- "Please use `rescue => error` and `Appsignal.report_error` instead. " \
318
- "Read our exception handling documentation: " \
319
- "https://docs.appsignal.com/ruby/instrumentation/exception-handling.html"
320
- yield
321
- rescue Exception => error # rubocop:disable Lint/RescueException
322
- send_error(error) do |transaction|
323
- transaction.set_tags(tags) if tags
324
- transaction.set_namespace(namespace) if namespace
325
- end
326
- raise error
327
- end
328
- alias :listen_for_exception :listen_for_error
329
-
330
161
  # Send an error to AppSignal regardless of the context.
331
162
  #
332
163
  # Records and send the exception to AppSignal.
@@ -347,28 +178,15 @@ module Appsignal
347
178
  # Appsignal.send_error(e)
348
179
  # end
349
180
  #
350
- # @example Send an exception with tags. Deprecated method.
351
- # begin
352
- # raise "oh no!"
353
- # rescue => e
354
- # Appsignal.send_error(e, :key => "value")
355
- # end
356
- #
357
181
  # @example Add more metadata to transaction
358
- # Appsignal.send_error(e) do |transaction|
359
- # transaction.set_params(:search_query => params[:search_query])
360
- # transaction.set_action("my_action_name")
361
- # transaction.set_tags(:key => "value")
362
- # transaction.set_namespace("my_namespace")
182
+ # Appsignal.send_error(e) do
183
+ # Appsignal.set_namespace("my_namespace")
184
+ # Appsignal.set_action("my_action_name")
185
+ # Appsignal.add_params(:search_query => params[:search_query])
186
+ # Appsignal.add_tags(:key => "value")
363
187
  # end
364
188
  #
365
189
  # @param error [Exception] The error to send to AppSignal.
366
- # @param tags [Hash{String, Symbol => String, Symbol, Integer}]
367
- # Additional tags to add to the error. See also {.tag_request}.
368
- # This parameter is deprecated. Use the block argument instead.
369
- # @param namespace [String] The namespace in which the error occurred.
370
- # See also {.set_namespace}.
371
- # This parameter is deprecated. Use the block argument instead.
372
190
  # @yield [transaction] yields block to allow modification of the
373
191
  # transaction before it's send.
374
192
  # @yieldparam transaction [Transaction] yields the AppSignal transaction
@@ -381,31 +199,7 @@ module Appsignal
381
199
  # @see https://docs.appsignal.com/ruby/instrumentation/tagging.html
382
200
  # Tagging guide
383
201
  # @since 0.6.0
384
- def send_error(
385
- error,
386
- tags = nil,
387
- namespace = nil
388
- )
389
- if tags
390
- call_location = caller(1..1).first
391
- stdout_and_logger_warning \
392
- "The tags argument for `Appsignal.send_error` is deprecated. " \
393
- "Please use the block method to set tags instead.\n\n" \
394
- " Appsignal.send_error(error) do |transaction|\n" \
395
- " transaction.set_tags(#{tags})\n" \
396
- " end\n\n" \
397
- "Appsignal.send_error called on location: #{call_location}"
398
- end
399
- if namespace
400
- call_location = caller(1..1).first
401
- stdout_and_logger_warning \
402
- "The namespace argument for `Appsignal.send_error` is deprecated. " \
403
- "Please use the block method to set the namespace instead.\n\n" \
404
- " Appsignal.send_error(error) do |transaction|\n" \
405
- " transaction.set_namespace(#{namespace.inspect})\n" \
406
- " end\n\n" \
407
- "Appsignal.send_error called on location: #{call_location}"
408
- end
202
+ def send_error(error, &block)
409
203
  return unless active?
410
204
 
411
205
  unless error.is_a?(Exception)
@@ -413,13 +207,13 @@ module Appsignal
413
207
  "The given value is not an exception: #{error.inspect}"
414
208
  return
415
209
  end
210
+
416
211
  transaction = Appsignal::Transaction.new(
417
212
  SecureRandom.uuid,
418
- namespace || Appsignal::Transaction::HTTP_REQUEST
213
+ Appsignal::Transaction::HTTP_REQUEST
419
214
  )
420
- transaction.set_tags(tags) if tags
421
- transaction.set_error(error)
422
- yield transaction if block_given?
215
+ transaction.set_error(error, &block)
216
+
423
217
  transaction.complete
424
218
  end
425
219
  alias :send_exception :send_error
@@ -452,21 +246,15 @@ module Appsignal
452
246
  # end
453
247
  #
454
248
  # @example Add more metadata to transaction
455
- # Appsignal.set_error(e) do |transaction|
456
- # transaction.set_params(:search_query => params[:search_query])
457
- # transaction.set_action("my_action_name")
458
- # transaction.set_tags(:key => "value")
459
- # transaction.set_namespace("my_namespace")
249
+ # Appsignal.set_error(e) do
250
+ # Appsignal.set_namespace("my_namespace")
251
+ # Appsignal.set_action("my_action_name")
252
+ # Appsignal.add_params(:search_query => params[:search_query])
253
+ # Appsignal.add_tags(:key => "value")
460
254
  # end
461
255
  #
462
256
  # @param exception [Exception] The error to add to the current
463
257
  # transaction.
464
- # @param tags [Hash{String, Symbol => String, Symbol, Integer}]
465
- # Additional tags to add to the error. See also {.tag_request}.
466
- # This parameter is deprecated. Use the block argument instead.
467
- # @param namespace [String] The namespace in which the error occurred.
468
- # See also {.set_namespace}.
469
- # This parameter is deprecated. Use the block argument instead.
470
258
  # @yield [transaction] yields block to allow modification of the
471
259
  # transaction.
472
260
  # @yieldparam transaction [Transaction] yields the AppSignal transaction
@@ -478,27 +266,7 @@ module Appsignal
478
266
  # @see https://docs.appsignal.com/ruby/instrumentation/exception-handling.html
479
267
  # Exception handling guide
480
268
  # @since 0.6.6
481
- def set_error(exception, tags = nil, namespace = nil)
482
- if tags
483
- call_location = caller(1..1).first
484
- stdout_and_logger_warning \
485
- "The tags argument for `Appsignal.set_error` is deprecated. " \
486
- "Please use the block method to set tags instead.\n\n" \
487
- " Appsignal.set_error(error) do |transaction|\n" \
488
- " transaction.set_tags(#{tags})\n" \
489
- " end\n\n" \
490
- "Appsignal.set_error called on location: #{call_location}"
491
- end
492
- if namespace
493
- call_location = caller(1..1).first
494
- stdout_and_logger_warning \
495
- "The namespace argument for `Appsignal.set_error` is deprecated. " \
496
- "Please use the block method to set the namespace instead.\n\n" \
497
- " Appsignal.set_error(error) do |transaction|\n" \
498
- " transaction.set_namespace(#{namespace.inspect})\n" \
499
- " end\n\n" \
500
- "Appsignal.set_error called on location: #{call_location}"
501
- end
269
+ def set_error(exception)
502
270
  unless exception.is_a?(Exception)
503
271
  internal_logger.error "Appsignal.set_error: Cannot set error. " \
504
272
  "The given value is not an exception: #{exception.inspect}"
@@ -508,8 +276,6 @@ module Appsignal
508
276
 
509
277
  transaction = Appsignal::Transaction.current
510
278
  transaction.set_error(exception)
511
- transaction.set_tags(tags) if tags
512
- transaction.set_namespace(namespace) if namespace
513
279
  yield transaction if block_given?
514
280
  end
515
281
  alias :set_exception :set_error
@@ -536,11 +302,11 @@ module Appsignal
536
302
  # end
537
303
  #
538
304
  # @example Add more metadata to transaction
539
- # Appsignal.report_error(error) do |transaction|
540
- # transaction.set_namespace("my_namespace")
541
- # transaction.set_action("my_action_name")
542
- # transaction.set_params(:search_query => params[:search_query])
543
- # transaction.set_tags(:key => "value")
305
+ # Appsignal.report_error(error) do
306
+ # Appsignal.set_namespace("my_namespace")
307
+ # Appsignal.set_action("my_action_name")
308
+ # Appsignal.add_params(:search_query => params[:search_query])
309
+ # Appsignal.add_tags(:key => "value")
544
310
  # end
545
311
  #
546
312
  # @param exception [Exception] The error to add to the current
@@ -554,9 +320,9 @@ module Appsignal
554
320
  # @see https://docs.appsignal.com/ruby/instrumentation/exception-handling.html
555
321
  # Exception handling guide
556
322
  # @since 3.10.0
557
- def report_error(exception)
323
+ def report_error(exception, &block)
558
324
  unless exception.is_a?(Exception)
559
- internal_logger.error "Appsignal.report_error: Cannot set error. " \
325
+ internal_logger.error "Appsignal.report_error: Cannot add error. " \
560
326
  "The given value is not an exception: #{exception.inspect}"
561
327
  return
562
328
  end
@@ -573,12 +339,9 @@ module Appsignal
573
339
  )
574
340
  end
575
341
 
576
- transaction.set_error(exception)
577
- yield transaction if block_given?
578
-
579
- return if has_parent_transaction
342
+ transaction.add_error(exception, &block)
580
343
 
581
- transaction.complete
344
+ transaction.complete unless has_parent_transaction
582
345
  end
583
346
  alias :report_exception :report_error
584
347
 
@@ -652,36 +415,56 @@ module Appsignal
652
415
  Appsignal::Transaction.current.set_namespace(namespace)
653
416
  end
654
417
 
655
- # Set custom data on the current transaction.
418
+ # Add custom data to the current transaction.
656
419
  #
657
420
  # Add extra information about the request or background that cannot be
658
421
  # expressed in tags, like nested data structures.
659
422
  #
660
- # When this method is called multiple times, it will overwrite the
661
- # previously set value.
423
+ # If the root data type changes between calls of this method, the last
424
+ # method call is stored.
662
425
  #
663
- # @example
664
- # Appsignal.set_custom_data(:user => { :locale => "en" })
665
- # Appsignal.set_custom_data([
426
+ # @example Add Hash data
427
+ # Appsignal.add_custom_data(:user => { :locale => "en" })
428
+ #
429
+ # @example Merges Hash data
430
+ # Appsignal.add_custom_data(:abc => "def")
431
+ # Appsignal.add_custom_data(:xyz => "...")
432
+ # # The custom data is: { :abc => "def", :xyz => "..." }
433
+ #
434
+ # @example Add Array data
435
+ # Appsignal.add_custom_data([
666
436
  # "array with data",
437
+ # "other value",
667
438
  # :options => { :verbose => true }
668
439
  # ])
669
440
  #
670
- # @since 3.10.0
671
- # @see Transaction#set_custom_data
441
+ # @example Merges Array data
442
+ # Appsignal.add_custom_data([1, 2, 3])
443
+ # Appsignal.add_custom_data([4, 5, 6])
444
+ # # The custom data is: [1, 2, 3, 4, 5, 6]
445
+ #
446
+ # @example Mixing of root data types is not supported
447
+ # Appsignal.add_custom_data(:abc => "def")
448
+ # Appsignal.add_custom_data([1, 2, 3])
449
+ # # The custom data is: [1, 2, 3]
450
+ #
451
+ # @since 4.0.0
452
+ # @param data [Hash/Array] Custom data to add to the transaction.
453
+ # @return [void]
454
+ #
455
+ # @see Transaction#add_custom_data
672
456
  # @see https://docs.appsignal.com/guides/custom-data/sample-data.html
673
457
  # Sample data guide
674
- # @param data [Hash/Array]
675
- # @return [void]
676
- def set_custom_data(data)
458
+ def add_custom_data(data)
677
459
  return unless active?
678
460
  return unless Appsignal::Transaction.current?
679
461
 
680
462
  transaction = Appsignal::Transaction.current
681
- transaction.set_custom_data(data)
463
+ transaction.add_custom_data(data)
682
464
  end
465
+ alias :set_custom_data :add_custom_data
683
466
 
684
- # Set tags on the current transaction.
467
+ # Add tags to the current transaction.
685
468
  #
686
469
  # Tags are extra bits of information that are added to transaction and
687
470
  # appear on sample details pages on AppSignal.com.
@@ -689,221 +472,183 @@ module Appsignal
689
472
  # When this method is called multiple times, it will merge the tags.
690
473
  #
691
474
  # @example
692
- # Appsignal.tag_request(:locale => "en", :user_id => 1)
693
- # Appsignal.tag_request("locale" => "en")
694
- # Appsignal.tag_request("user_id" => 1)
475
+ # Appsignal.add_tags(:locale => "en", :user_id => 1)
476
+ # Appsignal.add_tags("locale" => "en")
477
+ # Appsignal.add_tags("user_id" => 1)
695
478
  #
696
479
  # @example Nested hashes are not supported
697
480
  # # Bad
698
- # Appsignal.tag_request(:user => { :locale => "en" })
481
+ # Appsignal.add_tags(:user => { :locale => "en" })
699
482
  #
700
483
  # @example in a Rails controller
701
484
  # class SomeController < ApplicationController
702
- # before_action :set_appsignal_tags
485
+ # before_action :add_appsignal_tags
703
486
  #
704
- # def set_appsignal_tags
705
- # Appsignal.tag_request(:locale => I18n.locale)
487
+ # def add_appsignal_tags
488
+ # Appsignal.add_tags(:locale => I18n.locale)
706
489
  # end
707
490
  # end
708
491
  #
709
- # @param tags [Hash] Collection of tags.
492
+ # @since 4.0.0
493
+ # @param tags [Hash] Collection of tags to add to the transaction.
710
494
  # @option tags [String, Symbol, Integer] :any
711
495
  # The name of the tag as a Symbol.
712
496
  # @option tags [String, Symbol, Integer] "any"
713
497
  # The name of the tag as a String.
714
498
  # @return [void]
715
499
  #
716
- # @see Transaction.set_tags
500
+ # @see Transaction#add_tags
717
501
  # @see https://docs.appsignal.com/ruby/instrumentation/tagging.html
718
502
  # Tagging guide
719
- def tag_request(tags = {})
503
+ def add_tags(tags = {})
720
504
  return unless active?
721
505
  return unless Appsignal::Transaction.current?
722
506
 
723
507
  transaction = Appsignal::Transaction.current
724
- transaction.set_tags(tags)
508
+ transaction.add_tags(tags)
725
509
  end
726
- alias :tag_job :tag_request
727
- alias :set_tags :tag_request
510
+ alias :tag_request :add_tags
511
+ alias :tag_job :add_tags
512
+ alias :set_tags :add_tags
728
513
 
729
- # Set parameters on the current transaction.
514
+ # Add parameters to the current transaction.
730
515
  #
731
- # Parameters are automatically set by most of our integrations. It should
732
- # not be necessary to call this method unless you want to report
516
+ # Parameters are automatically added by most of our integrations. It
517
+ # should not be necessary to call this method unless you want to report
733
518
  # different parameters.
734
519
  #
735
520
  # To filter parameters, see our parameter filtering guide.
736
521
  #
737
- # When this method is called multiple times, it will overwrite the
738
- # previously set value.
739
- #
740
- # When no parameters are set this way, the transaction will look for
741
- # parameters in its request environment.
742
- #
743
- # A block can be given to this method to defer the fetching and parsing
744
- # of the parameters until and only when the transaction is sampled.
745
- #
746
522
  # When both the `params` argument and a block is given to this method,
747
- # the `params` argument is leading and the block will _not_ be called.
523
+ # the block is leading and the argument will _not_ be used.
748
524
  #
749
- # @example Set parameters
750
- # Appsignal.set_params("param1" => "value1")
751
- #
752
- # @example Calling `set_params` multiple times will only keep the last call
753
- # Appsignal.set_params("param1" => "value1")
754
- # Appsignal.set_params("param2" => "value2")
755
- # # The parameters are: { "param2" => "value2" }
756
- #
757
- # @example Calling `set_params` with a block
758
- # Appsignal.set_params do
759
- # # Some slow code to parse parameters
760
- # JSON.parse('{"param1": "value1"}')
761
- # end
762
- # # The parameters are: { "param1" => "value1" }
525
+ # @example Add parameters
526
+ # Appsignal.add_params("param1" => "value1")
527
+ # # The parameters include: { "param1" => "value1" }
763
528
  #
764
- # @example Calling `set_params` with a parameter and a block
765
- # Appsignal.set_params("argument" => "argument value") do
766
- # # Some slow code to parse parameters
767
- # JSON.parse('{"param1": "value1"}')
768
- # end
769
- # # The parameters are: { "argument" => "argument value" }
529
+ # @example Calling `add_params` multiple times will merge the values
530
+ # Appsignal.add_params("param1" => "value1")
531
+ # Appsignal.add_params("param2" => "value2")
532
+ # # The parameters include:
533
+ # # { "param1" => "value1", "param2" => "value2" }
770
534
  #
771
- # @since 3.10.0
772
- # @param params [Hash] The parameters to set on the transaction.
535
+ # @since 4.0.0
536
+ # @param params [Hash] The parameters to add to the transaction.
773
537
  # @yield This block is called when the transaction is sampled. The block's
774
538
  # return value will become the new parameters.
539
+ # @return [void]
540
+ #
775
541
  # @see https://docs.appsignal.com/guides/custom-data/sample-data.html
776
542
  # Sample data guide
777
543
  # @see https://docs.appsignal.com/guides/filter-data/filter-parameters.html
778
544
  # Parameter filtering guide
779
- # @see Transaction#set_params
545
+ # @see Transaction#add_params
546
+ def add_params(params = nil, &block)
547
+ return unless active?
548
+ return unless Appsignal::Transaction.current?
549
+
550
+ transaction = Appsignal::Transaction.current
551
+ transaction.add_params(params, &block)
552
+ end
553
+ alias :set_params :add_params
554
+
555
+ # Mark the parameters sample data to be set as an empty value.
556
+ #
557
+ # @api private
558
+ # @since 4.0.0
780
559
  # @return [void]
781
- def set_params(params = nil, &block)
560
+ # @see Helpers::Instrumentation#set_empty_params!
561
+ def set_empty_params!
782
562
  return unless active?
783
563
  return unless Appsignal::Transaction.current?
784
564
 
785
565
  transaction = Appsignal::Transaction.current
786
- transaction.set_params(params, &block)
566
+ transaction.set_empty_params!
787
567
  end
788
568
 
789
- # Set session data on the current transaction.
569
+ # Add session data to the current transaction.
790
570
  #
791
- # Session data is automatically set by most of our integrations. It
571
+ # Session data is automatically added by most of our integrations. It
792
572
  # should not be necessary to call this method unless you want to report
793
573
  # different session data.
794
574
  #
795
575
  # To filter session data, see our session data filtering guide.
796
576
  #
797
- # When this method is called multiple times, it will overwrite the
798
- # previously set value.
799
- #
800
- # A block can be given to this method to defer the fetching and parsing
801
- # of the session data until and only when the transaction is sampled.
802
- #
803
577
  # When both the `session_data` argument and a block is given to this
804
- # method, the `session_data` argument is leading and the block will _not_
805
- # be called.
578
+ # method, the bock is leading and the argument will _not_ be used.
806
579
  #
807
- # @example Set session data
808
- # Appsignal.set_session_data("data" => "value")
580
+ # @example Add session data
581
+ # Appsignal.add_session_data("session" => "data")
582
+ # # The session data will include:
583
+ # # { "session" => "data" }
809
584
  #
810
- # @example Calling `set_session_data` multiple times will only keep the last call
811
- # Appsignal.set_session_data("data1" => "value1")
812
- # Appsignal.set_session_data("data2" => "value2")
813
- # # The session data is: { "data2" => "value2" }
585
+ # @example Calling `add_session_data` multiple times merge the values
586
+ # Appsignal.add_session_data("session" => "data")
587
+ # Appsignal.add_session_data("other" => "value")
588
+ # # The session data will include:
589
+ # # { "session" => "data", "other" => "value" }
814
590
  #
815
- # @example Calling `set_session_data` with a block
816
- # Appsignal.set_session_data do
817
- # # Some slow code to parse session data
818
- # JSON.parse('{"data": "value"}')
819
- # end
820
- # # The session data is: { "data" => "value" }
821
- #
822
- # @example Calling `set_session_data` with a session_data argument and a block
823
- # Appsignal.set_session_data("argument" => "argument value") do
824
- # # Some slow code to parse session data
825
- # JSON.parse('{"data": "value"}')
826
- # end
827
- # # The session data is: { "argument" => "argument value" }
828
- #
829
- # @since 3.11.0
830
- # @param session_data [Hash] The session data to set on the transaction.
591
+ # @since 4.0.0
592
+ # @param session_data [Hash] The session data to add to the transaction.
831
593
  # @yield This block is called when the transaction is sampled. The block's
832
594
  # return value will become the new session data.
595
+ # @return [void]
596
+ #
833
597
  # @see https://docs.appsignal.com/guides/custom-data/sample-data.html
834
598
  # Sample data guide
835
599
  # @see https://docs.appsignal.com/guides/filter-data/filter-session-data.html
836
600
  # Session data filtering guide
837
- # @see Transaction#set_session_data
838
- # @return [void]
839
- def set_session_data(session_data = nil, &block)
601
+ # @see Transaction#add_session_data
602
+ def add_session_data(session_data = nil, &block)
840
603
  return unless active?
841
604
  return unless Appsignal::Transaction.current?
842
605
 
843
606
  transaction = Appsignal::Transaction.current
844
- transaction.set_session_data(session_data, &block)
607
+ transaction.add_session_data(session_data, &block)
845
608
  end
609
+ alias :set_session_data :add_session_data
846
610
 
847
- # Set request headers on the current transaction.
611
+ # Add request headers to the current transaction.
848
612
  #
849
- # Request headers are automatically set by most of our integrations. It
850
- # should not be necessary to call this method unless you want to report
851
- # different request headers.
852
- #
853
- # To filter request headers, see our session data filtering guide.
613
+ # Request headers are automatically added by most of our integrations. It
614
+ # should not be necessary to call this method unless you want to also
615
+ # report different request headers.
854
616
  #
855
- # When this method is called multiple times, it will overwrite the
856
- # previously set value.
857
- #
858
- # A block can be given to this method to defer the fetching and parsing
859
- # of the request headers until and only when the transaction is sampled.
617
+ # To filter request headers, see our request header filtering guide.
860
618
  #
861
619
  # When both the `request_headers` argument and a block is given to this
862
- # method, the `request_headers` argument is leading and the block will
863
- # _not_ be called.
620
+ # method, the block is leading and the argument will _not_ be used.
864
621
  #
865
- # @example Set request headers
866
- # Appsignal.set_headers(
867
- # "PATH_INFO" => "/some-path",
868
- # "HTTP_USER_AGENT" => "Firefox"
869
- # )
870
- #
871
- # @example Calling `set_headers` multiple times will only keep the last call
872
- # Appsignal.set_headers("PATH_INFO" => "/some-path")
873
- # Appsignal.set_headers("HTTP_USER_AGENT" => "Firefox")
874
- # # The request headers are: { "HTTP_USER_AGENT" => "Firefox" }
875
- #
876
- # @example Calling `set_headers` with a block
877
- # Appsignal.set_headers do
878
- # # Some slow code to parse request headers
879
- # JSON.parse('{"PATH_INFO": "/some-path"}')
880
- # end
881
- # # The session data is: { "PATH_INFO" => "/some-path" }
622
+ # @example Add request headers
623
+ # Appsignal.add_headers("PATH_INFO" => "/some-path")
624
+ # # The request headers will include:
625
+ # # { "PATH_INFO" => "/some-path" }
882
626
  #
883
- # @example Calling `set_headers` with a headers argument and a block
884
- # Appsignal.set_headers("PATH_INFO" => "/some-path") do
885
- # # Some slow code to parse session data
886
- # JSON.parse('{"PATH_INFO": "/block-path"}')
887
- # end
888
- # # The session data is: { "PATH_INFO" => "/some-path" }
627
+ # @example Calling `add_headers` multiple times merge the values
628
+ # Appsignal.add_headers("PATH_INFO" => "/some-path")
629
+ # Appsignal.add_headers("HTTP_USER_AGENT" => "Firefox")
630
+ # # The request headers will include:
631
+ # # { "PATH_INFO" => "/some-path", "HTTP_USER_AGENT" => "Firefox" }
889
632
  #
890
- # @since 3.11.0
891
- # @param headers [Hash] The request headers to set on the transaction.
633
+ # @since 4.0.0
634
+ # @param headers [Hash] The request headers to add to the transaction.
892
635
  # @yield This block is called when the transaction is sampled. The block's
893
636
  # return value will become the new request headers.
637
+ # @return [void]
638
+ #
894
639
  # @see https://docs.appsignal.com/guides/custom-data/sample-data.html
895
640
  # Sample data guide
896
641
  # @see https://docs.appsignal.com/guides/filter-data/filter-headers.html
897
642
  # Request headers filtering guide
898
- # @see Transaction#set_headers
899
- # @return [void]
900
- def set_headers(headers = nil, &block)
643
+ # @see Transaction#add_headers
644
+ def add_headers(headers = nil, &block)
901
645
  return unless active?
902
646
  return unless Appsignal::Transaction.current?
903
647
 
904
648
  transaction = Appsignal::Transaction.current
905
- transaction.set_headers(headers, &block)
649
+ transaction.add_headers(headers, &block)
906
650
  end
651
+ alias :set_headers :add_headers
907
652
 
908
653
  # Add breadcrumbs to the transaction.
909
654
  #
@@ -1076,15 +821,6 @@ module Appsignal
1076
821
  ensure
1077
822
  Appsignal::Transaction.current&.resume!
1078
823
  end
1079
-
1080
- # @deprecated Use {.ignore_instrumentation_events} instead.
1081
- # @since 0.8.7
1082
- def without_instrumentation(&block)
1083
- stdout_and_logger_warning \
1084
- "The `Appsignal.without_instrumentation` helper is deprecated. " \
1085
- "Please use `Appsignal.ignore_instrumentation_events` instead."
1086
- ignore_instrumentation_events(&block)
1087
- end
1088
824
  end
1089
825
  end
1090
826
  end