appsignal 2.11.10-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.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -1
- data/.semaphore/semaphore.yml +161 -70
- data/CHANGELOG.md +5 -18
- data/Rakefile +3 -13
- data/appsignal.gemspec +2 -24
- data/build_matrix.yml +20 -22
- data/gemfiles/capistrano2.gemfile +1 -0
- data/gemfiles/capistrano3.gemfile +1 -0
- data/gemfiles/grape.gemfile +1 -0
- data/gemfiles/no_dependencies.gemfile +1 -4
- data/gemfiles/rails-3.2.gemfile +0 -2
- data/gemfiles/rails-4.2.gemfile +0 -6
- data/gemfiles/resque-2.gemfile +4 -0
- data/gemfiles/sequel-435.gemfile +1 -0
- data/gemfiles/sequel.gemfile +1 -0
- data/gemfiles/sinatra.gemfile +1 -0
- data/lib/appsignal/auth_check.rb +2 -8
- data/lib/appsignal/cli.rb +1 -23
- data/lib/appsignal/config.rb +0 -24
- data/lib/appsignal/event_formatter.rb +0 -25
- data/lib/appsignal/extension.rb +0 -50
- data/lib/appsignal/hooks/action_cable.rb +5 -44
- data/lib/appsignal/hooks/active_support_notifications.rb +7 -86
- data/lib/appsignal/hooks/celluloid.rb +5 -9
- data/lib/appsignal/hooks/net_http.rb +2 -12
- data/lib/appsignal/hooks/puma.rb +3 -5
- data/lib/appsignal/hooks/que.rb +1 -1
- data/lib/appsignal/hooks/rake.rb +2 -24
- data/lib/appsignal/hooks/redis.rb +2 -13
- data/lib/appsignal/hooks/resque.rb +2 -43
- data/lib/appsignal/hooks/sidekiq.rb +1 -5
- data/lib/appsignal/hooks/unicorn.rb +3 -24
- data/lib/appsignal/hooks/webmachine.rb +1 -7
- data/lib/appsignal/hooks.rb +0 -23
- data/lib/appsignal/integrations/action_cable.rb +34 -0
- data/lib/appsignal/integrations/active_support_notifications.rb +77 -0
- data/lib/appsignal/integrations/net_http.rb +16 -0
- data/lib/appsignal/integrations/object.rb +61 -4
- data/lib/appsignal/integrations/padrino.rb +5 -7
- data/lib/appsignal/integrations/que.rb +26 -33
- data/lib/appsignal/integrations/railtie.rb +1 -4
- data/lib/appsignal/integrations/rake.rb +26 -2
- data/lib/appsignal/integrations/redis.rb +17 -0
- data/lib/appsignal/integrations/resque.rb +39 -10
- data/lib/appsignal/integrations/unicorn.rb +28 -0
- data/lib/appsignal/integrations/webmachine.rb +22 -24
- data/lib/appsignal/minutely.rb +0 -18
- data/lib/appsignal/transaction.rb +1 -1
- data/lib/appsignal/version.rb +1 -1
- data/lib/appsignal.rb +1 -27
- data/spec/lib/appsignal/auth_check_spec.rb +1 -24
- data/spec/lib/appsignal/cli_spec.rb +1 -1
- data/spec/lib/appsignal/config_spec.rb +0 -66
- data/spec/lib/appsignal/event_formatter_spec.rb +0 -37
- data/spec/lib/appsignal/extension_install_failure_spec.rb +7 -0
- data/spec/lib/appsignal/extension_spec.rb +9 -43
- data/spec/lib/appsignal/hooks/action_cable_spec.rb +0 -88
- data/spec/lib/appsignal/hooks/celluloid_spec.rb +6 -1
- data/spec/lib/appsignal/hooks/rake_spec.rb +1 -2
- data/spec/lib/appsignal/hooks/redis_spec.rb +50 -15
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +7 -61
- data/spec/lib/appsignal/hooks/unicorn_spec.rb +14 -3
- data/spec/lib/appsignal/hooks/webmachine_spec.rb +2 -13
- data/spec/lib/appsignal/hooks_spec.rb +0 -57
- data/spec/lib/appsignal/integrations/object_spec.rb +4 -95
- data/spec/lib/appsignal/integrations/padrino_spec.rb +2 -3
- data/spec/lib/appsignal/integrations/railtie_spec.rb +0 -45
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +26 -8
- data/spec/lib/appsignal/minutely_spec.rb +0 -19
- data/spec/lib/appsignal/transaction_spec.rb +1 -31
- data/spec/lib/appsignal/transmitter_spec.rb +1 -1
- data/spec/lib/appsignal/utils/data_spec.rb +87 -133
- data/spec/lib/appsignal_spec.rb +0 -69
- data/spec/lib/puma/appsignal_spec.rb +0 -28
- data/spec/spec_helper.rb +1 -37
- data/spec/support/testing.rb +1 -11
- data/support/install_deps +0 -4
- metadata +10 -23
- data/lib/appsignal/cli/notify_of_deploy.rb +0 -131
- data/lib/appsignal/integrations/object_ruby_19.rb +0 -37
- data/lib/appsignal/integrations/object_ruby_modern.rb +0 -41
- data/lib/appsignal/integrations/resque_active_job.rb +0 -19
- data/lib/appsignal/js_exception_transaction.rb +0 -56
- data/lib/appsignal/rack/js_exception_catcher.rb +0 -80
- data/spec/lib/appsignal/cli/notify_of_deploy_spec.rb +0 -180
- data/spec/lib/appsignal/integrations/object_19_spec.rb +0 -266
- data/spec/lib/appsignal/integrations/resque_active_job_spec.rb +0 -28
- data/spec/lib/appsignal/integrations/resque_spec.rb +0 -28
- data/spec/lib/appsignal/js_exception_transaction_spec.rb +0 -128
- data/spec/lib/appsignal/rack/js_exception_catcher_spec.rb +0 -170
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
require "appsignal/integrations/object"
|
|
2
|
-
|
|
3
|
-
def is_ruby_19
|
|
4
|
-
RUBY_VERSION < "2.0"
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
describe Object do
|
|
8
|
-
describe "#instrument_method" do
|
|
9
|
-
context "with instance method" do
|
|
10
|
-
let(:klass) do
|
|
11
|
-
Class.new do
|
|
12
|
-
def foo(param1, options = {})
|
|
13
|
-
[param1, options]
|
|
14
|
-
end
|
|
15
|
-
appsignal_instrument_method :foo
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
let(:instance) { klass.new }
|
|
19
|
-
|
|
20
|
-
def call_with_arguments
|
|
21
|
-
instance.foo(
|
|
22
|
-
"abc",
|
|
23
|
-
:foo => "bar"
|
|
24
|
-
)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
context "when active" do
|
|
28
|
-
let(:transaction) { http_request_transaction }
|
|
29
|
-
before do
|
|
30
|
-
Appsignal.config = project_fixture_config
|
|
31
|
-
expect(Appsignal::Transaction).to receive(:current).at_least(:once).and_return(transaction)
|
|
32
|
-
end
|
|
33
|
-
after { Appsignal.config = nil }
|
|
34
|
-
|
|
35
|
-
context "with anonymous class" do
|
|
36
|
-
it "instruments the method and calls it" do
|
|
37
|
-
expect(Appsignal.active?).to be_truthy
|
|
38
|
-
expect(transaction).to receive(:start_event)
|
|
39
|
-
expect(transaction).to receive(:finish_event).with \
|
|
40
|
-
"foo.AnonymousClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
41
|
-
expect(call_with_arguments).to eq(["abc", { :foo => "bar" }])
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
context "with named class" do
|
|
46
|
-
before do
|
|
47
|
-
class NamedClass
|
|
48
|
-
def foo
|
|
49
|
-
1
|
|
50
|
-
end
|
|
51
|
-
appsignal_instrument_method :foo
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
after { Object.send(:remove_const, :NamedClass) }
|
|
55
|
-
let(:klass) { NamedClass }
|
|
56
|
-
|
|
57
|
-
it "instruments the method and calls it" do
|
|
58
|
-
expect(Appsignal.active?).to be_truthy
|
|
59
|
-
expect(transaction).to receive(:start_event)
|
|
60
|
-
expect(transaction).to receive(:finish_event).with \
|
|
61
|
-
"foo.NamedClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
62
|
-
expect(instance.foo).to eq(1)
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
context "with nested named class" do
|
|
67
|
-
before do
|
|
68
|
-
module MyModule
|
|
69
|
-
module NestedModule
|
|
70
|
-
class NamedClass
|
|
71
|
-
def bar
|
|
72
|
-
2
|
|
73
|
-
end
|
|
74
|
-
appsignal_instrument_method :bar
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
after { Object.send(:remove_const, :MyModule) }
|
|
80
|
-
let(:klass) { MyModule::NestedModule::NamedClass }
|
|
81
|
-
|
|
82
|
-
it "instruments the method and calls it" do
|
|
83
|
-
expect(Appsignal.active?).to be_truthy
|
|
84
|
-
expect(transaction).to receive(:start_event)
|
|
85
|
-
expect(transaction).to receive(:finish_event).with \
|
|
86
|
-
"bar.NamedClass.NestedModule.MyModule.other", nil, nil,
|
|
87
|
-
Appsignal::EventFormatter::DEFAULT
|
|
88
|
-
expect(instance.bar).to eq(2)
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
context "with custom name" do
|
|
93
|
-
let(:klass) do
|
|
94
|
-
Class.new do
|
|
95
|
-
def foo
|
|
96
|
-
1
|
|
97
|
-
end
|
|
98
|
-
appsignal_instrument_method :foo, :name => "my_method.group"
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
it "instruments with custom name" do
|
|
103
|
-
expect(Appsignal.active?).to be_truthy
|
|
104
|
-
expect(transaction).to receive(:start_event)
|
|
105
|
-
expect(transaction).to receive(:finish_event).with \
|
|
106
|
-
"my_method.group", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
107
|
-
expect(instance.foo).to eq(1)
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
context "with a method given a block" do
|
|
112
|
-
let(:klass) do
|
|
113
|
-
Class.new do
|
|
114
|
-
def foo
|
|
115
|
-
yield
|
|
116
|
-
end
|
|
117
|
-
appsignal_instrument_method :foo
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
it "should yield the block" do
|
|
122
|
-
expect(instance.foo { 42 }).to eq(42)
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
context "when not active" do
|
|
128
|
-
let(:transaction) { Appsignal::Transaction.current }
|
|
129
|
-
|
|
130
|
-
it "does not instrument, but still calls the method" do
|
|
131
|
-
expect(Appsignal.active?).to be_falsy
|
|
132
|
-
expect(transaction).to_not receive(:start_event)
|
|
133
|
-
expect(call_with_arguments).to eq(["abc", { :foo => "bar" }])
|
|
134
|
-
end
|
|
135
|
-
end
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
context "with class method" do
|
|
139
|
-
let(:klass) do
|
|
140
|
-
Class.new do
|
|
141
|
-
def self.bar(param1, options = {})
|
|
142
|
-
[param1, options]
|
|
143
|
-
end
|
|
144
|
-
appsignal_instrument_class_method :bar
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
def call_with_arguments
|
|
148
|
-
klass.bar(
|
|
149
|
-
"abc",
|
|
150
|
-
:foo => "bar"
|
|
151
|
-
)
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
context "when active" do
|
|
155
|
-
let(:transaction) { http_request_transaction }
|
|
156
|
-
before do
|
|
157
|
-
Appsignal.config = project_fixture_config
|
|
158
|
-
expect(Appsignal::Transaction).to receive(:current).at_least(:once)
|
|
159
|
-
.and_return(transaction)
|
|
160
|
-
end
|
|
161
|
-
after { Appsignal.config = nil }
|
|
162
|
-
|
|
163
|
-
context "with anonymous class" do
|
|
164
|
-
it "instruments the method and calls it" do
|
|
165
|
-
expect(Appsignal.active?).to be_truthy
|
|
166
|
-
expect(transaction).to receive(:start_event)
|
|
167
|
-
expect(transaction).to receive(:finish_event).with \
|
|
168
|
-
"bar.class_method.AnonymousClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
169
|
-
expect(call_with_arguments).to eq(["abc", { :foo => "bar" }])
|
|
170
|
-
end
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
context "with named class" do
|
|
174
|
-
before do
|
|
175
|
-
class NamedClass
|
|
176
|
-
def self.bar
|
|
177
|
-
2
|
|
178
|
-
end
|
|
179
|
-
appsignal_instrument_class_method :bar
|
|
180
|
-
end
|
|
181
|
-
end
|
|
182
|
-
after { Object.send(:remove_const, :NamedClass) }
|
|
183
|
-
let(:klass) { NamedClass }
|
|
184
|
-
|
|
185
|
-
it "instruments the method and calls it" do
|
|
186
|
-
expect(Appsignal.active?).to be_truthy
|
|
187
|
-
expect(transaction).to receive(:start_event)
|
|
188
|
-
expect(transaction).to receive(:finish_event).with \
|
|
189
|
-
"bar.class_method.NamedClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
190
|
-
expect(klass.bar).to eq(2)
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
context "with nested named class" do
|
|
194
|
-
before do
|
|
195
|
-
module MyModule
|
|
196
|
-
module NestedModule
|
|
197
|
-
class NamedClass
|
|
198
|
-
def self.bar
|
|
199
|
-
2
|
|
200
|
-
end
|
|
201
|
-
appsignal_instrument_class_method :bar
|
|
202
|
-
end
|
|
203
|
-
end
|
|
204
|
-
end
|
|
205
|
-
end
|
|
206
|
-
after { Object.send(:remove_const, :MyModule) }
|
|
207
|
-
let(:klass) { MyModule::NestedModule::NamedClass }
|
|
208
|
-
|
|
209
|
-
it "instruments the method and calls it" do
|
|
210
|
-
expect(Appsignal.active?).to be_truthy
|
|
211
|
-
expect(transaction).to receive(:start_event)
|
|
212
|
-
expect(transaction).to receive(:finish_event).with \
|
|
213
|
-
"bar.class_method.NamedClass.NestedModule.MyModule.other", nil, nil,
|
|
214
|
-
Appsignal::EventFormatter::DEFAULT
|
|
215
|
-
expect(klass.bar).to eq(2)
|
|
216
|
-
end
|
|
217
|
-
end
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
context "with custom name" do
|
|
221
|
-
let(:klass) do
|
|
222
|
-
Class.new do
|
|
223
|
-
def self.bar
|
|
224
|
-
2
|
|
225
|
-
end
|
|
226
|
-
appsignal_instrument_class_method :bar, :name => "my_method.group"
|
|
227
|
-
end
|
|
228
|
-
end
|
|
229
|
-
|
|
230
|
-
it "instruments with custom name" do
|
|
231
|
-
expect(Appsignal.active?).to be_truthy
|
|
232
|
-
expect(transaction).to receive(:start_event)
|
|
233
|
-
expect(transaction).to receive(:finish_event).with \
|
|
234
|
-
"my_method.group", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
235
|
-
expect(klass.bar).to eq(2)
|
|
236
|
-
end
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
context "with a method given a block" do
|
|
240
|
-
let(:klass) do
|
|
241
|
-
Class.new do
|
|
242
|
-
def self.bar
|
|
243
|
-
yield
|
|
244
|
-
end
|
|
245
|
-
appsignal_instrument_class_method :bar
|
|
246
|
-
end
|
|
247
|
-
end
|
|
248
|
-
|
|
249
|
-
it "should yield the block" do
|
|
250
|
-
expect(klass.bar { 42 }).to eq(42)
|
|
251
|
-
end
|
|
252
|
-
end
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
context "when not active" do
|
|
256
|
-
let(:transaction) { Appsignal::Transaction.current }
|
|
257
|
-
|
|
258
|
-
it "does not instrument, but still call the method" do
|
|
259
|
-
expect(Appsignal.active?).to be_falsy
|
|
260
|
-
expect(transaction).to_not receive(:start_event)
|
|
261
|
-
expect(call_with_arguments).to eq(["abc", { :foo => "bar" }])
|
|
262
|
-
end
|
|
263
|
-
end
|
|
264
|
-
end
|
|
265
|
-
end
|
|
266
|
-
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
|
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
describe Appsignal::Rack::JSExceptionCatcher do
|
|
2
|
-
let(:app) { double(:call => true) }
|
|
3
|
-
let(:options) { nil }
|
|
4
|
-
let(:config_options) { { :enable_frontend_error_catching => true } }
|
|
5
|
-
let(:config) { project_fixture_config("production", config_options) }
|
|
6
|
-
let(:deprecation_message) do
|
|
7
|
-
"The Appsignal::Rack::JSExceptionCatcher is " \
|
|
8
|
-
"deprecated and will be removed in a future version. Please use " \
|
|
9
|
-
"the official AppSignal JavaScript integration by disabling " \
|
|
10
|
-
"`enable_frontend_error_catching` in your configuration and " \
|
|
11
|
-
"installing AppSignal for JavaScript instead. " \
|
|
12
|
-
"(https://docs.appsignal.com/front-end/)"
|
|
13
|
-
end
|
|
14
|
-
before { Appsignal.config = config }
|
|
15
|
-
|
|
16
|
-
describe "#initialize" do
|
|
17
|
-
let(:out_stream) { std_stream }
|
|
18
|
-
let(:err_stream) { std_stream }
|
|
19
|
-
let(:output) { out_stream.read }
|
|
20
|
-
let(:stderr) { err_stream.read }
|
|
21
|
-
|
|
22
|
-
it "logs to the logger" do
|
|
23
|
-
log = capture_logs do
|
|
24
|
-
capture_std_streams(out_stream, err_stream) do
|
|
25
|
-
Appsignal::Rack::JSExceptionCatcher.new(app, options)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
expect(log).to contains_log(:warn, deprecation_message)
|
|
29
|
-
expect(log).to contains_log(:debug, "Initializing Appsignal::Rack::JSExceptionCatcher")
|
|
30
|
-
expect(stderr).to include "appsignal WARNING: #{deprecation_message}"
|
|
31
|
-
expect(stderr).to_not include("appsignal:")
|
|
32
|
-
expect(output).to be_empty
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
describe "#call" do
|
|
37
|
-
let(:catcher) do
|
|
38
|
-
silence :allowed => ["enable_frontend_error_catching"] do
|
|
39
|
-
Appsignal::Rack::JSExceptionCatcher.new(app, options)
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
after { catcher.call(env) }
|
|
43
|
-
|
|
44
|
-
context "when path is not frontend_error_catching_path" do
|
|
45
|
-
let(:env) { { "PATH_INFO" => "/foo" } }
|
|
46
|
-
|
|
47
|
-
context "when AppSignal is not active" do
|
|
48
|
-
before { config[:active] = false }
|
|
49
|
-
|
|
50
|
-
it "calls the next middleware" do
|
|
51
|
-
expect(app).to receive(:call).with(env)
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
context "when AppSignal is active" do
|
|
56
|
-
before { config[:active] = true }
|
|
57
|
-
|
|
58
|
-
it "calls the next middleware" do
|
|
59
|
-
expect(app).to receive(:call).with(env)
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
context "when path is frontend_error_catching_path" do
|
|
65
|
-
let(:transaction) { double(:complete! => true) }
|
|
66
|
-
let(:env) do
|
|
67
|
-
{
|
|
68
|
-
"PATH_INFO" => "/appsignal_error_catcher",
|
|
69
|
-
"rack.input" => double(:read => '{"name": "error"}')
|
|
70
|
-
}
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
context "when AppSignal is not active" do
|
|
74
|
-
before { config[:active] = false }
|
|
75
|
-
|
|
76
|
-
it "doesn't create an AppSignal transaction" do
|
|
77
|
-
expect(Appsignal::JSExceptionTransaction).to_not receive(:new)
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
it "returns a 202 status" do
|
|
81
|
-
expect(catcher.call(env)).to eq(
|
|
82
|
-
[202, {}, ["AppSignal JavaScript error catching endpoint is not active."]]
|
|
83
|
-
)
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
context "when AppSignal is active" do
|
|
88
|
-
before { config[:active] = true }
|
|
89
|
-
|
|
90
|
-
it "creates a JSExceptionTransaction" do
|
|
91
|
-
expect(Appsignal::JSExceptionTransaction).to receive(:new)
|
|
92
|
-
.with("name" => "error")
|
|
93
|
-
.and_return(transaction)
|
|
94
|
-
|
|
95
|
-
expect(transaction).to receive(:complete!)
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
it "returns 200" do
|
|
99
|
-
allow(Appsignal::JSExceptionTransaction).to receive(:new)
|
|
100
|
-
.and_return(transaction)
|
|
101
|
-
|
|
102
|
-
expect(catcher.call(env)).to eq([200, {}, []])
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
context "when request payload is empty" do
|
|
106
|
-
let(:env) do
|
|
107
|
-
{
|
|
108
|
-
"PATH_INFO" => "/appsignal_error_catcher",
|
|
109
|
-
"rack.input" => double(:read => "")
|
|
110
|
-
}
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
it "does not create a transaction" do
|
|
114
|
-
expect(Appsignal::JSExceptionTransaction).to_not receive(:new)
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
it "returns 400" do
|
|
118
|
-
expect(catcher.call(env)).to eq([400, {}, ["Request payload is not valid JSON."]])
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
context "when `frontend_error_catching_path` is different" do
|
|
123
|
-
let(:config_options) { { :frontend_error_catching_path => "/foo" } }
|
|
124
|
-
|
|
125
|
-
it "does not create a transaction" do
|
|
126
|
-
expect(Appsignal::JSExceptionTransaction).to_not receive(:new)
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
it "calls the next middleware" do
|
|
130
|
-
expect(app).to receive(:call).with(env)
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
context "when `name` is empty" do
|
|
135
|
-
let(:env) do
|
|
136
|
-
{
|
|
137
|
-
"PATH_INFO" => "/appsignal_error_catcher",
|
|
138
|
-
"rack.input" => double(:read => '{"name": ""}')
|
|
139
|
-
}
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
it "does not create a transaction" do
|
|
143
|
-
expect(Appsignal::JSExceptionTransaction).to_not receive(:new)
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
it "returns 422" do
|
|
147
|
-
expect(catcher.call(env)).to eq([422, {}, []])
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
context "when `name` doesn't exist" do
|
|
152
|
-
let(:env) do
|
|
153
|
-
{
|
|
154
|
-
"PATH_INFO" => "/appsignal_error_catcher",
|
|
155
|
-
"rack.input" => double(:read => '{"foo": ""}')
|
|
156
|
-
}
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
it "does not create a transaction" do
|
|
160
|
-
expect(Appsignal::JSExceptionTransaction).to_not receive(:new)
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
it "returns 422" do
|
|
164
|
-
expect(catcher.call(env)).to eq([422, {}, []])
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
end
|
|
170
|
-
end
|