appsignal 2.11.5-java → 3.0.0.beta.1-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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -1
  3. data/.semaphore/semaphore.yml +0 -23
  4. data/CHANGELOG.md +6 -0
  5. data/build_matrix.yml +0 -4
  6. data/lib/appsignal.rb +1 -27
  7. data/lib/appsignal/auth_check.rb +2 -8
  8. data/lib/appsignal/cli.rb +1 -23
  9. data/lib/appsignal/config.rb +0 -24
  10. data/lib/appsignal/event_formatter.rb +0 -25
  11. data/lib/appsignal/hooks.rb +0 -23
  12. data/lib/appsignal/hooks/action_cable.rb +3 -34
  13. data/lib/appsignal/hooks/active_support_notifications.rb +7 -86
  14. data/lib/appsignal/hooks/celluloid.rb +5 -9
  15. data/lib/appsignal/hooks/net_http.rb +2 -12
  16. data/lib/appsignal/hooks/puma.rb +3 -5
  17. data/lib/appsignal/hooks/que.rb +1 -1
  18. data/lib/appsignal/hooks/rake.rb +2 -24
  19. data/lib/appsignal/hooks/redis.rb +2 -13
  20. data/lib/appsignal/hooks/resque.rb +2 -43
  21. data/lib/appsignal/hooks/unicorn.rb +3 -24
  22. data/lib/appsignal/hooks/webmachine.rb +1 -7
  23. data/lib/appsignal/integrations/action_cable.rb +34 -0
  24. data/lib/appsignal/integrations/active_support_notifications.rb +77 -0
  25. data/lib/appsignal/integrations/net_http.rb +16 -0
  26. data/lib/appsignal/integrations/object.rb +61 -4
  27. data/lib/appsignal/integrations/padrino.rb +5 -7
  28. data/lib/appsignal/integrations/que.rb +26 -33
  29. data/lib/appsignal/integrations/railtie.rb +1 -4
  30. data/lib/appsignal/integrations/rake.rb +26 -2
  31. data/lib/appsignal/integrations/redis.rb +17 -0
  32. data/lib/appsignal/integrations/resque.rb +39 -10
  33. data/lib/appsignal/integrations/unicorn.rb +28 -0
  34. data/lib/appsignal/integrations/webmachine.rb +22 -24
  35. data/lib/appsignal/minutely.rb +0 -12
  36. data/lib/appsignal/version.rb +1 -1
  37. data/spec/lib/appsignal/auth_check_spec.rb +1 -24
  38. data/spec/lib/appsignal/cli_spec.rb +1 -1
  39. data/spec/lib/appsignal/config_spec.rb +0 -66
  40. data/spec/lib/appsignal/event_formatter_spec.rb +0 -37
  41. data/spec/lib/appsignal/hooks/celluloid_spec.rb +6 -1
  42. data/spec/lib/appsignal/hooks/rake_spec.rb +1 -2
  43. data/spec/lib/appsignal/hooks/redis_spec.rb +50 -15
  44. data/spec/lib/appsignal/hooks/unicorn_spec.rb +14 -3
  45. data/spec/lib/appsignal/hooks/webmachine_spec.rb +2 -13
  46. data/spec/lib/appsignal/hooks_spec.rb +0 -57
  47. data/spec/lib/appsignal/integrations/object_spec.rb +0 -4
  48. data/spec/lib/appsignal/integrations/padrino_spec.rb +2 -3
  49. data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -45
  50. data/spec/lib/appsignal/integrations/webmachine_spec.rb +26 -8
  51. data/spec/lib/appsignal/minutely_spec.rb +0 -19
  52. data/spec/lib/appsignal/transaction_spec.rb +1 -14
  53. data/spec/lib/appsignal/transmitter_spec.rb +1 -1
  54. data/spec/lib/appsignal_spec.rb +0 -69
  55. data/spec/spec_helper.rb +1 -15
  56. metadata +9 -22
  57. data/lib/appsignal/cli/notify_of_deploy.rb +0 -131
  58. data/lib/appsignal/integrations/object_ruby_19.rb +0 -37
  59. data/lib/appsignal/integrations/object_ruby_modern.rb +0 -64
  60. data/lib/appsignal/integrations/resque_active_job.rb +0 -19
  61. data/lib/appsignal/js_exception_transaction.rb +0 -56
  62. data/lib/appsignal/rack/js_exception_catcher.rb +0 -80
  63. data/spec/lib/appsignal/cli/notify_of_deploy_spec.rb +0 -180
  64. data/spec/lib/appsignal/integrations/object_19_spec.rb +0 -266
  65. data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +0 -28
  66. data/spec/lib/appsignal/integrations/resque_spec.rb +0 -28
  67. data/spec/lib/appsignal/js_exception_transaction_spec.rb +0 -128
  68. data/spec/lib/appsignal/rack/js_exception_catcher_spec.rb +0 -170
@@ -3,42 +3,35 @@
3
3
  module Appsignal
4
4
  module Integrations
5
5
  module QuePlugin
6
- def self.included(base)
7
- base.class_eval do
8
- def _run_with_appsignal(*)
9
- local_attrs = respond_to?(:que_attrs) ? que_attrs : attrs
10
- env = {
11
- :metadata => {
12
- :id => local_attrs[:job_id] || local_attrs[:id],
13
- :queue => local_attrs[:queue],
14
- :run_at => local_attrs[:run_at].to_s,
15
- :priority => local_attrs[:priority],
16
- :attempts => local_attrs[:error_count].to_i
17
- },
18
- :params => local_attrs[:args]
19
- }
6
+ def _run(*)
7
+ local_attrs = respond_to?(:que_attrs) ? que_attrs : attrs
8
+ env = {
9
+ :metadata => {
10
+ :id => local_attrs[:job_id] || local_attrs[:id],
11
+ :queue => local_attrs[:queue],
12
+ :run_at => local_attrs[:run_at].to_s,
13
+ :priority => local_attrs[:priority],
14
+ :attempts => local_attrs[:error_count].to_i
15
+ },
16
+ :params => local_attrs[:args]
17
+ }
20
18
 
21
- request = Appsignal::Transaction::GenericRequest.new(env)
19
+ request = Appsignal::Transaction::GenericRequest.new(env)
22
20
 
23
- transaction = Appsignal::Transaction.create(
24
- SecureRandom.uuid,
25
- Appsignal::Transaction::BACKGROUND_JOB,
26
- request
27
- )
21
+ transaction = Appsignal::Transaction.create(
22
+ SecureRandom.uuid,
23
+ Appsignal::Transaction::BACKGROUND_JOB,
24
+ request
25
+ )
28
26
 
29
- begin
30
- Appsignal.instrument("perform_job.que") { _run_without_appsignal }
31
- rescue Exception => error # rubocop:disable Lint/RescueException
32
- transaction.set_error(error)
33
- raise error
34
- ensure
35
- transaction.set_action_if_nil "#{local_attrs[:job_class]}#run"
36
- Appsignal::Transaction.complete_current!
37
- end
38
- end
39
-
40
- alias_method :_run_without_appsignal, :_run
41
- alias_method :_run, :_run_with_appsignal
27
+ begin
28
+ Appsignal.instrument("perform_job.que") { super }
29
+ rescue Exception => error # rubocop:disable Lint/RescueException
30
+ transaction.set_error(error)
31
+ raise error
32
+ ensure
33
+ transaction.set_action_if_nil "#{local_attrs[:job_class]}#run"
34
+ Appsignal::Transaction.complete_current!
42
35
  end
43
36
  end
44
37
  end
@@ -31,10 +31,7 @@ module Appsignal
31
31
  )
32
32
 
33
33
  if Appsignal.config[:enable_frontend_error_catching]
34
- app.middleware.insert_before(
35
- Appsignal::Rack::RailsInstrumentation,
36
- Appsignal::Rack::JSExceptionCatcher
37
- )
34
+ app.middleware.insert_before(Appsignal::Rack::RailsInstrumentation)
38
35
  end
39
36
 
40
37
  Appsignal.start
@@ -1,4 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Since version 1.0 requiring this file is not necessary anymore to get
4
- # Rake integration, it's just here for backward compatibility.
3
+ module Appsignal
4
+ module Integrations
5
+ module RakeIntegration
6
+ def execute(*args)
7
+ super
8
+ rescue Exception => error # rubocop:disable Lint/RescueException
9
+ # Format given arguments and cast to hash if possible
10
+ params, _ = args
11
+ params = params.to_hash if params.respond_to?(:to_hash)
12
+
13
+ transaction = Appsignal::Transaction.create(
14
+ SecureRandom.uuid,
15
+ Appsignal::Transaction::BACKGROUND_JOB,
16
+ Appsignal::Transaction::GenericRequest.new(
17
+ :params => params
18
+ )
19
+ )
20
+ transaction.set_action(name)
21
+ transaction.set_error(error)
22
+ transaction.complete
23
+ Appsignal.stop("rake")
24
+ raise error
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appsignal
4
+ module Integrations
5
+ module RedisIntegration
6
+ def process(commands, &block)
7
+ sanitized_commands = commands.map do |command, *args|
8
+ "#{command}#{" ?" * args.size}"
9
+ end.join("\n")
10
+
11
+ Appsignal.instrument "query.redis", id, sanitized_commands do
12
+ super
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -3,16 +3,45 @@
3
3
  module Appsignal
4
4
  module Integrations
5
5
  # @api private
6
- module ResquePlugin
7
- def self.extended(_)
8
- callers = caller
9
- Appsignal::Utils::DeprecationMessage.message \
10
- "The AppSignal ResquePlugin is deprecated and does " \
11
- "nothing on extend. In this version of the AppSignal Ruby gem " \
12
- "the integration with Resque is automatic on all Resque workers. " \
13
- "Please remove the following line from this file to remove this " \
14
- "message: extend Appsignal::Integrations::ResquePlugin\n" \
15
- "#{callers.first}"
6
+ module ResqueIntegration
7
+ def perform
8
+ transaction = Appsignal::Transaction.create(
9
+ SecureRandom.uuid,
10
+ Appsignal::Transaction::BACKGROUND_JOB,
11
+ Appsignal::Transaction::GenericRequest.new({})
12
+ )
13
+
14
+ Appsignal.instrument "perform.resque" do
15
+ super
16
+ end
17
+ rescue Exception => exception # rubocop:disable Lint/RescueException
18
+ transaction.set_error(exception)
19
+ raise exception
20
+ ensure
21
+ if transaction
22
+ transaction.set_action_if_nil("#{payload["class"]}#perform")
23
+ args =
24
+ Appsignal::Utils::HashSanitizer.sanitize(
25
+ ResqueHelpers.arguments(payload),
26
+ Appsignal.config[:filter_parameters]
27
+ )
28
+ transaction.params = args if args
29
+ transaction.set_tags("queue" => queue)
30
+
31
+ Appsignal::Transaction.complete_current!
32
+ end
33
+ Appsignal.stop("resque")
34
+ end
35
+ end
36
+
37
+ class ResqueHelpers
38
+ def self.arguments(payload)
39
+ case payload["class"]
40
+ when "ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper"
41
+ nil # Set in the ActiveJob integration
42
+ else
43
+ payload["args"]
44
+ end
16
45
  end
17
46
  end
18
47
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Appsignal
4
+ module Integrations
5
+ module UnicornIntegration
6
+ # Make sure that appsignal is started and the last transaction
7
+ # in a worker gets flushed.
8
+ #
9
+ # We'd love to be able to hook this into Unicorn in a less
10
+ # intrusive way, but this is the best we can do given the
11
+ # options we have.
12
+
13
+ module Server
14
+ def worker_loop(worker)
15
+ Appsignal.forked
16
+ super
17
+ end
18
+ end
19
+
20
+ module Worker
21
+ def close
22
+ Appsignal.stop("unicorn")
23
+ super
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -3,35 +3,33 @@
3
3
  module Appsignal
4
4
  module Integrations
5
5
  # @api private
6
- module WebmachinePlugin
7
- module FSM
8
- def run_with_appsignal
9
- transaction = Appsignal::Transaction.create(
10
- SecureRandom.uuid,
11
- Appsignal::Transaction::HTTP_REQUEST,
12
- request,
13
- :params_method => :query
14
- )
6
+ module WebmachineIntegration
7
+ def run
8
+ transaction = Appsignal::Transaction.create(
9
+ SecureRandom.uuid,
10
+ Appsignal::Transaction::HTTP_REQUEST,
11
+ request,
12
+ :params_method => :query
13
+ )
15
14
 
16
- transaction.set_action_if_nil("#{resource.class.name}##{request.method}")
15
+ transaction.set_action_if_nil("#{resource.class.name}##{request.method}")
17
16
 
18
- Appsignal.instrument("process_action.webmachine") do
19
- run_without_appsignal
20
- end
21
-
22
- Appsignal::Transaction.complete_current!
17
+ Appsignal.instrument("process_action.webmachine") do
18
+ super
23
19
  end
24
20
 
25
- private
21
+ Appsignal::Transaction.complete_current!
22
+ end
23
+
24
+ private
26
25
 
27
- def handle_exceptions_with_appsignal
28
- handle_exceptions_without_appsignal do
29
- begin
30
- yield
31
- rescue Exception => e # rubocop:disable Lint/RescueException
32
- Appsignal.set_error(e)
33
- raise e
34
- end
26
+ def handle_exceptions
27
+ super do
28
+ begin
29
+ yield
30
+ rescue Exception => e # rubocop:disable Lint/RescueException
31
+ Appsignal.set_error(e)
32
+ raise e
35
33
  end
36
34
  end
37
35
  end
@@ -3,8 +3,6 @@
3
3
  module Appsignal
4
4
  class Minutely
5
5
  class ProbeCollection
6
- include Appsignal::Utils::DeprecationMessage
7
-
8
6
  def initialize
9
7
  @probes = {}
10
8
  end
@@ -27,16 +25,6 @@ module Appsignal
27
25
  probes[key]
28
26
  end
29
27
 
30
- # @param probe [Object] Any object that listens to the `call` method will
31
- # be used as a probe.
32
- # @deprecated Use {#register} instead.
33
- # @return [void]
34
- def <<(probe)
35
- deprecation_message "Deprecated `Appsignal::Minute.probes <<` " \
36
- "call. Please use `Appsignal::Minutely.probes.register` instead."
37
- register probe.object_id, probe
38
- end
39
-
40
28
  # Register a new minutely probe.
41
29
  #
42
30
  # Supported probe types are:
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "2.11.5".freeze
4
+ VERSION = "3.0.0.beta.1".freeze
5
5
  end
@@ -28,29 +28,6 @@ describe Appsignal::AuthCheck do
28
28
  end.join("&")
29
29
  end
30
30
 
31
- describe ".new" do
32
- describe "with logger argument" do
33
- let(:err_stream) { std_stream }
34
- let(:stderr) { err_stream.read }
35
- let(:log_stream) { std_stream }
36
- let(:log) { log_contents(log_stream) }
37
-
38
- it "logs and prints a deprecation message" do
39
- Appsignal.logger = test_logger(log_stream)
40
-
41
- capture_std_streams(std_stream, err_stream) do
42
- Appsignal::AuthCheck.new(config, Appsignal.logger)
43
- end
44
-
45
- deprecation_message =
46
- "`Appsignal::AuthCheck.new`'s `logger` argument " \
47
- "will be removed in the next major version."
48
- expect(stderr).to include "appsignal WARNING: #{deprecation_message}"
49
- expect(log).to contains_log :warn, deprecation_message
50
- end
51
- end
52
- end
53
-
54
31
  describe "#perform" do
55
32
  subject { auth_check.perform }
56
33
 
@@ -62,7 +39,7 @@ describe Appsignal::AuthCheck do
62
39
  end
63
40
  end
64
41
 
65
- context "when encountering an exception", :not_ruby19 do
42
+ context "when encountering an exception" do
66
43
  before { stubbed_request.to_timeout }
67
44
 
68
45
  it "raises an error" do
@@ -16,7 +16,7 @@ describe Appsignal::CLI do
16
16
 
17
17
  expect(output).to include "appsignal <command> [options]"
18
18
  expect(output).to include \
19
- "Available commands: demo, diagnose, install, notify_of_deploy"
19
+ "Available commands: demo, diagnose, install"
20
20
  end
21
21
  end
22
22
 
@@ -168,8 +168,6 @@ describe Appsignal::Config do
168
168
  :push_api_key => "abc",
169
169
  :name => "TestApp",
170
170
  :active => true,
171
- :enable_frontend_error_catching => false,
172
- :frontend_error_catching_path => "/appsignal_error_catcher",
173
171
  :enable_allocation_tracking => true,
174
172
  :enable_gc_instrumentation => false,
175
173
  :enable_host_metrics => true,
@@ -357,70 +355,6 @@ describe Appsignal::Config do
357
355
  config
358
356
  end
359
357
  end
360
-
361
- describe "support for old config keys" do
362
- let(:err_stream) { std_stream }
363
- let(:stderr) { err_stream.read }
364
- let(:config) { project_fixture_config(env, {}, test_logger(log)) }
365
- let(:log) { StringIO.new }
366
- before { capture_std_streams(std_stream, err_stream) { config } }
367
-
368
- describe ":api_key" do
369
- context "without :push_api_key" do
370
- let(:env) { "old_config" }
371
-
372
- it "sets the :push_api_key with the old :api_key value" do
373
- expect(config[:push_api_key]).to eq "def"
374
- expect(config.config_hash).to_not have_key :api_key
375
-
376
- message = "Old configuration key found. Please update the 'api_key' to 'push_api_key'"
377
- expect(stderr).to include "appsignal WARNING: #{message}"
378
- expect(log_contents(log)).to contains_log :warn, message
379
- end
380
- end
381
-
382
- context "with :push_api_key" do
383
- let(:env) { "old_config_mixed_with_new_config" }
384
-
385
- it "ignores the :api_key config and deletes it" do
386
- expect(config[:push_api_key]).to eq "ghi"
387
- expect(config.config_hash).to_not have_key :api_key
388
-
389
- message = "Old configuration key found. Please update the 'api_key' to 'push_api_key'"
390
- expect(stderr).to include "appsignal WARNING: #{message}"
391
- expect(log_contents(log)).to contains_log :warn, message
392
- end
393
- end
394
- end
395
-
396
- describe ":ignore_exceptions" do
397
- context "without :ignore_errors" do
398
- let(:env) { "old_config" }
399
-
400
- it "sets :ignore_errors with the old :ignore_exceptions value" do
401
- expect(config[:ignore_errors]).to eq ["StandardError"]
402
- expect(config.config_hash).to_not have_key :ignore_exceptions
403
-
404
- message = "Old configuration key found. Please update the 'ignore_exceptions' to 'ignore_errors'"
405
- expect(stderr).to include "appsignal WARNING: #{message}"
406
- expect(log_contents(log)).to contains_log :warn, message
407
- end
408
- end
409
-
410
- context "with :ignore_errors" do
411
- let(:env) { "old_config_mixed_with_new_config" }
412
-
413
- it "ignores the :ignore_exceptions config" do
414
- expect(config[:ignore_errors]).to eq ["NoMethodError"]
415
- expect(config.config_hash).to_not have_key :ignore_exceptions
416
-
417
- message = "Old configuration key found. Please update the 'ignore_exceptions' to 'ignore_errors'"
418
- expect(stderr).to include "appsignal WARNING: #{message}"
419
- expect(log_contents(log)).to contains_log :warn, message
420
- end
421
- end
422
- end
423
- end
424
358
  end
425
359
 
426
360
  context "with config in the environment" do
@@ -114,43 +114,6 @@ describe Appsignal::EventFormatter do
114
114
  end
115
115
  end
116
116
  end
117
-
118
- context "when registering deprecated formatters" do
119
- let(:err_stream) { std_stream }
120
- let(:stderr) { err_stream.read }
121
- let(:deprecated_formatter) do
122
- Class.new(Appsignal::EventFormatter) do
123
- register "mock.deprecated"
124
-
125
- def format(_payload)
126
- end
127
- end
128
- end
129
-
130
- it "registers deprecated formatters and logs & prints a warning" do
131
- message = "Formatter for 'mock.deprecated' is using a deprecated registration method. " \
132
- "This event formatter will not be loaded. " \
133
- "Please update the formatter according to the documentation at: " \
134
- "https://docs.appsignal.com/ruby/instrumentation/event-formatters.html"
135
-
136
- logs = capture_logs do
137
- capture_std_streams(std_stream, err_stream) { deprecated_formatter }
138
- end
139
- expect(logs).to contains_log :warn, message
140
- expect(stderr).to include "appsignal WARNING: #{message}"
141
-
142
- expect(klass.deprecated_formatter_classes.keys).to include("mock.deprecated")
143
- end
144
-
145
- it "initializes deprecated formatters" do
146
- capture_std_streams(std_stream, err_stream) { deprecated_formatter }
147
- klass.initialize_deprecated_formatters
148
-
149
- expect(klass.registered?("mock.deprecated")).to be_truthy
150
- expect(klass.formatters["mock.deprecated"]).to be_instance_of(deprecated_formatter)
151
- expect(klass.deprecated_formatter_classes["mock.deprecated"]).to eq(deprecated_formatter)
152
- end
153
- end
154
117
  end
155
118
 
156
119
  describe ".registered?" do