appsignal 2.11.1-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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +6 -1
  3. data/.semaphore/semaphore.yml +197 -23
  4. data/CHANGELOG.md +25 -0
  5. data/README.md +9 -0
  6. data/Rakefile +9 -6
  7. data/build_matrix.yml +13 -4
  8. data/ext/agent.yml +17 -17
  9. data/ext/base.rb +12 -9
  10. data/gemfiles/no_dependencies.gemfile +7 -0
  11. data/gemfiles/resque-2.gemfile +0 -1
  12. data/gemfiles/webmachine.gemfile +1 -0
  13. data/lib/appsignal.rb +1 -27
  14. data/lib/appsignal/auth_check.rb +2 -8
  15. data/lib/appsignal/cli.rb +1 -23
  16. data/lib/appsignal/cli/diagnose/utils.rb +8 -11
  17. data/lib/appsignal/cli/install.rb +5 -8
  18. data/lib/appsignal/config.rb +0 -24
  19. data/lib/appsignal/event_formatter.rb +0 -25
  20. data/lib/appsignal/helpers/instrumentation.rb +32 -0
  21. data/lib/appsignal/hooks.rb +0 -23
  22. data/lib/appsignal/hooks/action_cable.rb +3 -34
  23. data/lib/appsignal/hooks/active_support_notifications.rb +7 -86
  24. data/lib/appsignal/hooks/celluloid.rb +5 -9
  25. data/lib/appsignal/hooks/net_http.rb +2 -12
  26. data/lib/appsignal/hooks/puma.rb +3 -5
  27. data/lib/appsignal/hooks/que.rb +1 -1
  28. data/lib/appsignal/hooks/rake.rb +2 -24
  29. data/lib/appsignal/hooks/redis.rb +2 -13
  30. data/lib/appsignal/hooks/resque.rb +2 -43
  31. data/lib/appsignal/hooks/shoryuken.rb +43 -4
  32. data/lib/appsignal/hooks/unicorn.rb +3 -24
  33. data/lib/appsignal/hooks/webmachine.rb +1 -7
  34. data/lib/appsignal/integrations/action_cable.rb +34 -0
  35. data/lib/appsignal/integrations/active_support_notifications.rb +77 -0
  36. data/lib/appsignal/integrations/net_http.rb +16 -0
  37. data/lib/appsignal/integrations/object.rb +44 -17
  38. data/lib/appsignal/integrations/padrino.rb +5 -7
  39. data/lib/appsignal/integrations/que.rb +26 -33
  40. data/lib/appsignal/integrations/railtie.rb +1 -4
  41. data/lib/appsignal/integrations/rake.rb +26 -2
  42. data/lib/appsignal/integrations/redis.rb +17 -0
  43. data/lib/appsignal/integrations/resque.rb +39 -10
  44. data/lib/appsignal/integrations/unicorn.rb +28 -0
  45. data/lib/appsignal/integrations/webmachine.rb +22 -24
  46. data/lib/appsignal/minutely.rb +0 -12
  47. data/lib/appsignal/system.rb +4 -0
  48. data/lib/appsignal/transaction.rb +30 -2
  49. data/lib/appsignal/version.rb +1 -1
  50. data/spec/lib/appsignal/auth_check_spec.rb +1 -24
  51. data/spec/lib/appsignal/cli_spec.rb +1 -1
  52. data/spec/lib/appsignal/config_spec.rb +0 -66
  53. data/spec/lib/appsignal/event_formatter_spec.rb +0 -37
  54. data/spec/lib/appsignal/hooks/celluloid_spec.rb +6 -1
  55. data/spec/lib/appsignal/hooks/rake_spec.rb +1 -2
  56. data/spec/lib/appsignal/hooks/redis_spec.rb +50 -15
  57. data/spec/lib/appsignal/hooks/resque_spec.rb +10 -2
  58. data/spec/lib/appsignal/hooks/shoryuken_spec.rb +151 -104
  59. data/spec/lib/appsignal/hooks/sidekiq_spec.rb +4 -2
  60. data/spec/lib/appsignal/hooks/unicorn_spec.rb +14 -3
  61. data/spec/lib/appsignal/hooks/webmachine_spec.rb +2 -13
  62. data/spec/lib/appsignal/hooks_spec.rb +0 -57
  63. data/spec/lib/appsignal/integrations/object_spec.rb +25 -10
  64. data/spec/lib/appsignal/integrations/padrino_spec.rb +2 -3
  65. data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -45
  66. data/spec/lib/appsignal/integrations/webmachine_spec.rb +26 -8
  67. data/spec/lib/appsignal/minutely_spec.rb +0 -19
  68. data/spec/lib/appsignal/transaction_spec.rb +56 -14
  69. data/spec/lib/appsignal/transmitter_spec.rb +1 -1
  70. data/spec/lib/appsignal_spec.rb +30 -69
  71. data/spec/spec_helper.rb +1 -15
  72. metadata +13 -22
  73. data/lib/appsignal/cli/notify_of_deploy.rb +0 -131
  74. data/lib/appsignal/integrations/resque_active_job.rb +0 -19
  75. data/lib/appsignal/js_exception_transaction.rb +0 -56
  76. data/lib/appsignal/rack/js_exception_catcher.rb +0 -80
  77. data/spec/lib/appsignal/cli/notify_of_deploy_spec.rb +0 -180
  78. data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +0 -28
  79. data/spec/lib/appsignal/integrations/resque_spec.rb +0 -28
  80. data/spec/lib/appsignal/js_exception_transaction_spec.rb +0 -128
  81. data/spec/lib/appsignal/rack/js_exception_catcher_spec.rb +0 -170
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Appsignal
4
- class JSExceptionTransaction
5
- attr_reader :uuid, :ext
6
-
7
- def initialize(data)
8
- @data = data
9
- @uuid = SecureRandom.uuid
10
- @ext = Appsignal::Extension.start_transaction(@uuid, Appsignal::Transaction::FRONTEND, 0)
11
-
12
- set_action
13
- set_metadata
14
- set_error
15
- set_sample_data
16
- end
17
-
18
- def set_action
19
- return unless @data["action"]
20
- ext.set_action(@data["action"])
21
- end
22
-
23
- def set_metadata
24
- return unless @data["path"]
25
- ext.set_metadata("path", @data["path"])
26
- end
27
-
28
- def set_error
29
- ext.set_error(
30
- @data["name"],
31
- @data["message"] || "",
32
- Appsignal::Utils::Data.generate(@data["backtrace"] || [])
33
- )
34
- end
35
-
36
- def set_sample_data
37
- {
38
- :params => @data["params"],
39
- :session_data => @data["session_data"],
40
- :environment => @data["environment"],
41
- :tags => @data["tags"]
42
- }.each do |key, data|
43
- next unless data.is_a?(Array) || data.is_a?(Hash)
44
- ext.set_sample_data(
45
- key.to_s,
46
- Appsignal::Utils::Data.generate(data)
47
- )
48
- end
49
- end
50
-
51
- def complete!
52
- ext.finish(0)
53
- ext.complete
54
- end
55
- end
56
- end
@@ -1,80 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Appsignal
4
- # @api private
5
- module Rack
6
- # JavaScript error catching middleware.
7
- #
8
- # Listens to the endpoint specified in the `frontend_error_catching_path`
9
- # configuration option.
10
- #
11
- # This is automatically included middleware in Rails apps if the
12
- # `frontend_error_catching_path` configuration option is active.
13
- #
14
- # If AppSignal is not active in the current environment, but does have
15
- # JavaScript error catching turned on, we assume that a JavaScript script
16
- # still sends errors to this endpoint. When AppSignal is not active in this
17
- # scenario this middleware still listens to the endpoint, but won't record
18
- # the error. It will return HTTP status code 202.
19
- #
20
- # @example with a Sinatra app
21
- # Sinatra::Application.use(Appsignal::Rack::JSExceptionCatcher)
22
- #
23
- # @see http://docs.appsignal.com/front-end/error-handling.html
24
- # @api private
25
- class JSExceptionCatcher
26
- include Appsignal::Utils::DeprecationMessage
27
-
28
- def initialize(app, _options = nil)
29
- Appsignal.logger.debug \
30
- "Initializing Appsignal::Rack::JSExceptionCatcher"
31
- deprecation_message "The Appsignal::Rack::JSExceptionCatcher is " \
32
- "deprecated and will be removed in a future version. Please use " \
33
- "the official AppSignal JavaScript integration by disabling " \
34
- "`enable_frontend_error_catching` in your configuration and " \
35
- "installing AppSignal for JavaScript instead. " \
36
- "(https://docs.appsignal.com/front-end/)"
37
- @app = app
38
- end
39
-
40
- def call(env)
41
- # Ignore other paths than the error catching path.
42
- return @app.call(env) unless error_cathing_endpoint?(env)
43
-
44
- # Prevent raising a 404 not found when a non-active environment posts
45
- # to this endpoint.
46
- unless Appsignal.active?
47
- return [
48
- 202,
49
- {},
50
- ["AppSignal JavaScript error catching endpoint is not active."]
51
- ]
52
- end
53
-
54
- begin
55
- body = JSON.parse(env["rack.input"].read)
56
- rescue JSON::ParserError
57
- return [400, {}, ["Request payload is not valid JSON."]]
58
- end
59
-
60
- if body["name"].is_a?(String) && !body["name"].empty?
61
- transaction = JSExceptionTransaction.new(body)
62
- transaction.complete!
63
- code = 200
64
- else
65
- Appsignal.logger.debug \
66
- "JSExceptionCatcher: Could not send exception, 'name' is empty."
67
- code = 422
68
- end
69
-
70
- [code, {}, []]
71
- end
72
-
73
- private
74
-
75
- def error_cathing_endpoint?(env)
76
- env["PATH_INFO"] == Appsignal.config[:frontend_error_catching_path]
77
- end
78
- end
79
- end
80
- end
@@ -1,180 +0,0 @@
1
- require "appsignal/cli"
2
-
3
- describe Appsignal::CLI::NotifyOfDeploy do
4
- include CLIHelpers
5
-
6
- let(:out_stream) { std_stream }
7
- let(:output) { out_stream.read }
8
- let(:err_stream) { std_stream }
9
- let(:stderr) { err_stream.read }
10
-
11
- define :include_deploy_notification do
12
- match do |log|
13
- log.include?("Notifying AppSignal of deploy with: ") &&
14
- log.include?("AppSignal has been notified of this deploy!")
15
- end
16
- end
17
- define :include_deploy_notification_with do |options|
18
- match do |log|
19
- return false unless options
20
- values = "revision: #{options[:revision]}, user: #{options[:user]}"
21
- log.include?("Notifying AppSignal of deploy with: #{values}") &&
22
- log.include?("AppSignal has been notified of this deploy!")
23
- end
24
- end
25
- define :include_config_error do
26
- match do |log|
27
- log.include? "Error: No valid config found."
28
- end
29
- end
30
- define :include_missing_options do |options|
31
- match do |log|
32
- log.include? "Error: Missing options: #{options.join(", ")}"
33
- end
34
- end
35
-
36
- def run
37
- capture_std_streams(out_stream, err_stream) do
38
- run_cli("notify_of_deploy", options)
39
- end
40
- end
41
-
42
- context "without config" do
43
- let(:config) { Appsignal::Config.new(tmp_dir, "production") }
44
- let(:options) { {} }
45
- around do |example|
46
- Dir.chdir tmp_dir do
47
- example.run
48
- end
49
- end
50
-
51
- it "prints a config error" do
52
- expect { run }.to raise_error(SystemExit)
53
- expect(output).to include_config_error
54
- expect(output).to_not include_deploy_notification
55
- end
56
- end
57
-
58
- context "with config" do
59
- let(:config) { project_fixture_config }
60
- before do
61
- config[:name] = options[:name] if options[:name]
62
- stub_api_request config, "markers", :revision => options[:revision],
63
- :user => options[:user]
64
- end
65
- around do |example|
66
- Dir.chdir project_fixture_path do
67
- example.run
68
- end
69
- end
70
-
71
- context "without environment" do
72
- let(:options) { { :environment => "", :revision => "foo", :user => "thijs" } }
73
- before do
74
- # Makes the config "active"
75
- ENV["APPSIGNAL_PUSH_API_KEY"] = "foo"
76
- end
77
-
78
- it "requires environment option" do
79
- expect { run }.to raise_error(SystemExit)
80
- expect(output).to include_missing_options(%w[environment])
81
- expect(output).to_not include_deploy_notification
82
- end
83
- end
84
-
85
- context "without known environment" do
86
- let(:options) { { :environment => "foo" } }
87
-
88
- it "prints a config error" do
89
- expect { run }.to raise_error(SystemExit)
90
- expect(output).to include_config_error
91
- expect(output).to_not include_missing_options([])
92
- expect(output).to_not include_deploy_notification
93
- end
94
- end
95
-
96
- context "with known environment" do
97
- context "without required options" do
98
- let(:options) { { :environment => "production" } }
99
-
100
- it "prints a missing required options error" do
101
- expect { run }.to raise_error(SystemExit)
102
- expect(output).to_not include_config_error
103
- expect(output).to include_missing_options(%w[revision user])
104
- expect(output).to_not include_deploy_notification
105
- end
106
-
107
- context "with empty required option" do
108
- let(:options) { { :environment => "production", :revision => "foo", :user => "" } }
109
-
110
- it "prints a missing required option error" do
111
- expect { run }.to raise_error(SystemExit)
112
- expect(output).to_not include_config_error
113
- expect(output).to include_missing_options(%w[user])
114
- expect(output).to_not include_deploy_notification
115
- end
116
- end
117
- end
118
-
119
- context "with required options" do
120
- let(:options) { { :environment => "production", :revision => "aaaaa", :user => "thijs" } }
121
- let(:log_stream) { std_stream }
122
- let(:log) { log_contents(log_stream) }
123
- before { Appsignal.logger = test_logger(log_stream) }
124
-
125
- it "notifies of a deploy" do
126
- run
127
- expect(output).to_not include_config_error
128
- expect(output).to_not include_missing_options([])
129
- expect(output).to include_deploy_notification_with(options)
130
- end
131
-
132
- it "prints a deprecation message" do
133
- run
134
- deprecation_message = "This command (appsignal notify_of_deploy) has been deprecated"
135
- expect(stderr).to include("appsignal WARNING: #{deprecation_message}")
136
- expect(log).to contains_log :warn, deprecation_message
137
- end
138
-
139
- context "with no app name configured" do
140
- before { ENV["APPSIGNAL_APP_NAME"] = "" }
141
-
142
- context "without name option" do
143
- let(:options) { { :environment => "production", :revision => "aaaaa", :user => "thijs" } }
144
-
145
- it "requires name option" do
146
- expect { run }.to raise_error(SystemExit)
147
- expect(output).to_not include_config_error
148
- expect(output).to include_missing_options(%w[name])
149
- expect(output).to_not include_deploy_notification
150
- end
151
- end
152
-
153
- context "with name option" do
154
- let(:options) { { :environment => "production", :revision => "aaaaa", :user => "thijs", :name => "foo" } }
155
-
156
- it "notifies of a deploy with a custom name" do
157
- run
158
- expect(output).to_not include_config_error
159
- expect(output).to_not include_missing_options([])
160
- expect(output).to include_deploy_notification_with(options)
161
- end
162
- end
163
- end
164
-
165
- context "with name option" do
166
- let(:options) do
167
- { :environment => "production", :revision => "aaaaa", :user => "thijs", :name => "foo" }
168
- end
169
-
170
- it "notifies of a deploy with a custom name" do
171
- run
172
- expect(output).to_not include_config_error
173
- expect(output).to_not include_missing_options([])
174
- expect(output).to include_deploy_notification_with(options)
175
- end
176
- end
177
- end
178
- end
179
- end
180
- end
@@ -1,28 +0,0 @@
1
- require "appsignal/integrations/resque_active_job"
2
-
3
- describe "Legacy Resque ActiveJob integration" do
4
- let(:err_stream) { std_stream }
5
- let(:stderr) { err_stream.read }
6
- let(:log_stream) { std_stream }
7
- let(:log) { log_contents(log_stream) }
8
-
9
- it "logs and prints a deprecation message on extend" do
10
- Appsignal.logger = test_logger(log_stream)
11
-
12
- capture_std_streams(std_stream, err_stream) do
13
- Class.new do
14
- include Appsignal::Integrations::ResqueActiveJobPlugin
15
- end
16
- end
17
-
18
- deprecation_message =
19
- "The AppSignal ResqueActiveJobPlugin is deprecated and does " \
20
- "nothing on extend. In this version of the AppSignal Ruby gem " \
21
- "the integration with Resque is automatic on all Resque workers. " \
22
- "Please remove the following line from this file to remove this " \
23
- "message: include Appsignal::Integrations::ResqueActiveJobPlugin\n" \
24
- "#{__FILE__}:"
25
- expect(stderr).to include "appsignal WARNING: #{deprecation_message}"
26
- expect(log).to contains_log :warn, deprecation_message
27
- end
28
- end
@@ -1,28 +0,0 @@
1
- require "appsignal/integrations/resque"
2
-
3
- describe "Legacy Resque integration" do
4
- let(:err_stream) { std_stream }
5
- let(:stderr) { err_stream.read }
6
- let(:log_stream) { std_stream }
7
- let(:log) { log_contents(log_stream) }
8
-
9
- it "logs and prints a deprecation message on extend" do
10
- Appsignal.logger = test_logger(log_stream)
11
-
12
- capture_std_streams(std_stream, err_stream) do
13
- Class.new do
14
- extend Appsignal::Integrations::ResquePlugin
15
- end
16
- end
17
-
18
- deprecation_message =
19
- "The AppSignal ResquePlugin is deprecated and does " \
20
- "nothing on extend. In this version of the AppSignal Ruby gem " \
21
- "the integration with Resque is automatic on all Resque workers. " \
22
- "Please remove the following line from this file to remove this " \
23
- "message: extend Appsignal::Integrations::ResquePlugin\n" \
24
- "#{__FILE__}:"
25
- expect(stderr).to include "appsignal WARNING: #{deprecation_message}"
26
- expect(log).to contains_log :warn, deprecation_message
27
- end
28
- end
@@ -1,128 +0,0 @@
1
- describe Appsignal::JSExceptionTransaction do
2
- before { allow(SecureRandom).to receive(:uuid).and_return("123abc") }
3
-
4
- let!(:transaction) { Appsignal::JSExceptionTransaction.new(data) }
5
- let(:data) do
6
- {
7
- "name" => "TypeError",
8
- "message" => "foo is not a valid method",
9
- "action" => "ExceptionIncidentComponent",
10
- "path" => "foo.bar/moo",
11
- "environment" => "development",
12
- "backtrace" => [
13
- "foo.bar/js:11:1",
14
- "foo.bar/js:22:2"
15
- ],
16
- "tags" => [
17
- "tag1"
18
- ]
19
- }
20
- end
21
-
22
- describe "#initialize" do
23
- it "should call all required methods" do
24
- expect(Appsignal::Extension).to receive(:start_transaction).with("123abc", "frontend", 0).and_return(1)
25
-
26
- expect(transaction).to receive(:set_action)
27
- expect(transaction).to receive(:set_metadata)
28
- expect(transaction).to receive(:set_error)
29
- expect(transaction).to receive(:set_sample_data)
30
-
31
- transaction.send :initialize, data
32
-
33
- expect(transaction.ext).to_not be_nil
34
- end
35
- end
36
-
37
- describe "#set_action" do
38
- it "should call `Appsignal::Extension.set_action`" do
39
- expect(transaction.ext).to receive(:set_action).with(
40
- "ExceptionIncidentComponent"
41
- )
42
-
43
- transaction.set_action
44
- end
45
- end
46
-
47
- describe "#set_metadata" do
48
- it "should call `Appsignal::Extension.set_transaction_metadata`" do
49
- expect(transaction.ext).to receive(:set_metadata).with(
50
- "path",
51
- "foo.bar/moo"
52
- )
53
-
54
- transaction.set_metadata
55
- end
56
- end
57
-
58
- describe "#set_error" do
59
- it "should call `Appsignal::Extension.set_transaction_error`" do
60
- expect(transaction.ext).to receive(:set_error).with(
61
- "TypeError",
62
- "foo is not a valid method",
63
- Appsignal::Utils::Data.generate(["foo.bar/js:11:1", "foo.bar/js:22:2"])
64
- )
65
-
66
- transaction.set_error
67
- end
68
- end
69
-
70
- describe "#set_sample_data" do
71
- it "should call `Appsignal::Extension.set_transaction_error_data`" do
72
- expect(transaction.ext).to receive(:set_sample_data).with(
73
- "tags",
74
- Appsignal::Utils::Data.generate(["tag1"])
75
- )
76
-
77
- transaction.set_sample_data
78
- end
79
- end
80
-
81
- context "when sending just the name" do
82
- let(:data) { { "name" => "TypeError" } }
83
-
84
- describe "#set_action" do
85
- it "should not call `Appsignal::Extension.set_action`" do
86
- expect(transaction.ext).to_not receive(:set_action)
87
-
88
- transaction.set_action
89
- end
90
- end
91
-
92
- describe "#set_metadata" do
93
- it "should not call `Appsignal::Extension.set_transaction_metadata`" do
94
- expect(transaction.ext).to_not receive(:set_metadata)
95
-
96
- transaction.set_metadata
97
- end
98
- end
99
-
100
- describe "#set_error" do
101
- it "should call `Appsignal::Extension.set_transaction_error` with just the name" do
102
- expect(transaction.ext).to receive(:set_error).with(
103
- "TypeError",
104
- "",
105
- Appsignal::Utils::Data.generate([])
106
- )
107
-
108
- transaction.set_error
109
- end
110
- end
111
-
112
- describe "#set_sample_data" do
113
- it "should not call `Appsignal::Extension.set_transaction_error_data`" do
114
- expect(transaction.ext).to_not receive(:set_sample_data)
115
-
116
- transaction.set_sample_data
117
- end
118
- end
119
- end
120
-
121
- describe "#complete!" do
122
- it "should call all required methods" do
123
- expect(transaction.ext).to receive(:finish).and_call_original
124
- expect(transaction.ext).to receive(:complete).and_call_original
125
- transaction.complete!
126
- end
127
- end
128
- end