appsignal 3.9.2-java → 3.9.3-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/.github/workflows/ci.yml +3135 -0
- data/.rubocop.yml +28 -20
- data/.rubocop_todo.yml +7 -33
- data/CHANGELOG.md +38 -0
- data/Rakefile +79 -64
- data/appsignal.gemspec +1 -1
- data/build_matrix.yml +109 -179
- data/ext/base.rb +1 -1
- data/gemfiles/hanami-2.1.gemfile +7 -0
- data/lib/appsignal/cli/diagnose.rb +1 -1
- data/lib/appsignal/config.rb +1 -1
- data/lib/appsignal/demo.rb +0 -1
- data/lib/appsignal/environment.rb +5 -1
- data/lib/appsignal/extension/jruby.rb +1 -1
- data/lib/appsignal/helpers/instrumentation.rb +1 -1
- data/lib/appsignal/integrations/grape.rb +19 -47
- data/lib/appsignal/integrations/hanami.rb +8 -7
- data/lib/appsignal/integrations/padrino.rb +46 -43
- data/lib/appsignal/integrations/railtie.rb +0 -3
- data/lib/appsignal/integrations/sinatra.rb +0 -1
- data/lib/appsignal/probes/gvl.rb +24 -2
- data/lib/appsignal/probes/sidekiq.rb +1 -1
- data/lib/appsignal/probes.rb +1 -1
- data/lib/appsignal/rack/abstract_middleware.rb +62 -28
- data/lib/appsignal/rack/event_handler.rb +12 -3
- data/lib/appsignal/rack/grape_middleware.rb +40 -0
- data/lib/appsignal/rack/hanami_middleware.rb +1 -11
- data/lib/appsignal/rack/rails_instrumentation.rb +14 -55
- data/lib/appsignal/utils/integration_memory_logger.rb +78 -0
- data/lib/appsignal/utils.rb +1 -0
- data/lib/appsignal/version.rb +1 -1
- data/lib/appsignal.rb +34 -33
- data/spec/.rubocop.yml +1 -1
- data/spec/lib/appsignal/cli/diagnose_spec.rb +1 -1
- data/spec/lib/appsignal/cli/install_spec.rb +3 -3
- data/spec/lib/appsignal/config_spec.rb +7 -5
- data/spec/lib/appsignal/demo_spec.rb +38 -41
- data/spec/lib/appsignal/hooks/action_cable_spec.rb +86 -167
- data/spec/lib/appsignal/hooks/active_support_notifications/finish_with_state_shared_examples.rb +8 -20
- data/spec/lib/appsignal/hooks/active_support_notifications/instrument_shared_examples.rb +38 -84
- data/spec/lib/appsignal/hooks/active_support_notifications/start_finish_shared_examples.rb +16 -37
- data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +4 -4
- data/spec/lib/appsignal/hooks/activejob_spec.rb +111 -200
- data/spec/lib/appsignal/hooks/delayed_job_spec.rb +54 -91
- data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +14 -32
- data/spec/lib/appsignal/hooks/excon_spec.rb +8 -12
- data/spec/lib/appsignal/hooks/net_http_spec.rb +7 -42
- data/spec/lib/appsignal/hooks/rake_spec.rb +9 -19
- data/spec/lib/appsignal/hooks/redis_client_spec.rb +18 -30
- data/spec/lib/appsignal/hooks/redis_spec.rb +10 -16
- data/spec/lib/appsignal/hooks/resque_spec.rb +42 -62
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +33 -74
- data/spec/lib/appsignal/integrations/hanami_spec.rb +79 -21
- data/spec/lib/appsignal/integrations/http_spec.rb +12 -20
- data/spec/lib/appsignal/integrations/net_http_spec.rb +33 -0
- data/spec/lib/appsignal/integrations/object_spec.rb +29 -36
- data/spec/lib/appsignal/integrations/padrino_spec.rb +47 -70
- data/spec/lib/appsignal/integrations/que_spec.rb +43 -70
- data/spec/lib/appsignal/integrations/railtie_spec.rb +26 -67
- data/spec/lib/appsignal/integrations/sidekiq_spec.rb +86 -160
- data/spec/lib/appsignal/integrations/sinatra_spec.rb +0 -1
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +28 -39
- data/spec/lib/appsignal/probes/gvl_spec.rb +80 -3
- data/spec/lib/appsignal/probes_spec.rb +7 -4
- data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +215 -106
- data/spec/lib/appsignal/rack/event_handler_spec.rb +81 -78
- data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +2 -12
- data/spec/lib/appsignal/rack/grape_middleware_spec.rb +234 -0
- data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +2 -16
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +67 -131
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +36 -44
- data/spec/lib/appsignal/rack/streaming_listener_spec.rb +68 -86
- data/spec/lib/appsignal/transaction_spec.rb +76 -90
- data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +163 -0
- data/spec/lib/appsignal_spec.rb +363 -342
- data/spec/support/helpers/dependency_helper.rb +6 -1
- data/spec/support/helpers/std_streams_helper.rb +1 -1
- data/spec/support/helpers/transaction_helpers.rb +8 -0
- data/spec/support/matchers/transaction.rb +185 -0
- data/spec/support/mocks/dummy_app.rb +20 -0
- data/spec/support/shared_examples/instrument.rb +17 -12
- data/spec/support/testing.rb +18 -9
- metadata +15 -10
- data/.semaphore/semaphore.yml +0 -2347
- data/script/lint_git +0 -22
- data/spec/lib/appsignal/integrations/grape_spec.rb +0 -239
- data/spec/support/matchers/be_completed.rb +0 -5
- /data/gemfiles/{hanami.gemfile → hanami-2.0.gemfile} +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
require "appsignal/integrations/object"
|
|
2
2
|
|
|
3
3
|
describe Object do
|
|
4
|
+
around { |example| keep_transactions { example.run } }
|
|
5
|
+
|
|
4
6
|
describe "#instrument_method" do
|
|
5
7
|
context "with instance method" do
|
|
6
8
|
let(:klass) do
|
|
@@ -24,10 +26,8 @@ describe Object do
|
|
|
24
26
|
context "when active" do
|
|
25
27
|
let(:transaction) { http_request_transaction }
|
|
26
28
|
before do
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
.at_least(:once).and_return(transaction)
|
|
30
|
-
expect(Appsignal.active?).to be_truthy
|
|
29
|
+
start_agent
|
|
30
|
+
set_current_transaction(transaction)
|
|
31
31
|
end
|
|
32
32
|
after { Appsignal.config = nil }
|
|
33
33
|
|
|
@@ -80,10 +80,9 @@ describe Object do
|
|
|
80
80
|
|
|
81
81
|
context "with anonymous class" do
|
|
82
82
|
it "instruments the method and calls it" do
|
|
83
|
-
expect(transaction).to receive(:start_event)
|
|
84
|
-
expect(transaction).to receive(:finish_event).with \
|
|
85
|
-
"foo.AnonymousClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
86
83
|
expect(call_with_arguments).to eq(["abc", { :foo => "bar" }, 2])
|
|
84
|
+
|
|
85
|
+
expect(transaction).to include_event("name" => "foo.AnonymousClass.other")
|
|
87
86
|
end
|
|
88
87
|
end
|
|
89
88
|
|
|
@@ -100,10 +99,9 @@ describe Object do
|
|
|
100
99
|
let(:klass) { NamedClass }
|
|
101
100
|
|
|
102
101
|
it "instruments the method and calls it" do
|
|
103
|
-
expect(transaction).to receive(:start_event)
|
|
104
|
-
expect(transaction).to receive(:finish_event).with \
|
|
105
|
-
"foo.NamedClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
106
102
|
expect(instance.foo).to eq(1)
|
|
103
|
+
|
|
104
|
+
expect(transaction).to include_event("name" => "foo.NamedClass.other")
|
|
107
105
|
end
|
|
108
106
|
end
|
|
109
107
|
|
|
@@ -124,11 +122,11 @@ describe Object do
|
|
|
124
122
|
let(:klass) { MyModule::NestedModule::NamedClass }
|
|
125
123
|
|
|
126
124
|
it "instruments the method and calls it" do
|
|
127
|
-
expect(transaction).to receive(:start_event)
|
|
128
|
-
expect(transaction).to receive(:finish_event).with \
|
|
129
|
-
"bar.NamedClass.NestedModule.MyModule.other", nil, nil,
|
|
130
|
-
Appsignal::EventFormatter::DEFAULT
|
|
131
125
|
expect(instance.bar).to eq(2)
|
|
126
|
+
|
|
127
|
+
expect(transaction).to include_event(
|
|
128
|
+
"name" => "bar.NamedClass.NestedModule.MyModule.other"
|
|
129
|
+
)
|
|
132
130
|
end
|
|
133
131
|
end
|
|
134
132
|
|
|
@@ -143,10 +141,11 @@ describe Object do
|
|
|
143
141
|
end
|
|
144
142
|
|
|
145
143
|
it "instruments with custom name" do
|
|
146
|
-
expect(transaction).to receive(:start_event)
|
|
147
|
-
expect(transaction).to receive(:finish_event).with \
|
|
148
|
-
"my_method.group", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
149
144
|
expect(instance.foo).to eq(1)
|
|
145
|
+
|
|
146
|
+
expect(transaction).to include_event(
|
|
147
|
+
"name" => "my_method.group"
|
|
148
|
+
)
|
|
150
149
|
end
|
|
151
150
|
end
|
|
152
151
|
|
|
@@ -160,7 +159,7 @@ describe Object do
|
|
|
160
159
|
end
|
|
161
160
|
end
|
|
162
161
|
|
|
163
|
-
it "
|
|
162
|
+
it "yields the block" do
|
|
164
163
|
expect(instance.foo { 42 }).to eq(42)
|
|
165
164
|
end
|
|
166
165
|
end
|
|
@@ -171,7 +170,6 @@ describe Object do
|
|
|
171
170
|
|
|
172
171
|
it "does not instrument, but still calls the method" do
|
|
173
172
|
expect(Appsignal.active?).to be_falsy
|
|
174
|
-
expect(transaction).to_not receive(:start_event)
|
|
175
173
|
expect(call_with_arguments).to eq(["abc", { :foo => "bar" }, 2])
|
|
176
174
|
end
|
|
177
175
|
end
|
|
@@ -198,8 +196,7 @@ describe Object do
|
|
|
198
196
|
let(:transaction) { http_request_transaction }
|
|
199
197
|
before do
|
|
200
198
|
Appsignal.config = project_fixture_config
|
|
201
|
-
|
|
202
|
-
.and_return(transaction)
|
|
199
|
+
set_current_transaction(transaction)
|
|
203
200
|
end
|
|
204
201
|
after { Appsignal.config = nil }
|
|
205
202
|
|
|
@@ -253,10 +250,10 @@ describe Object do
|
|
|
253
250
|
context "with anonymous class" do
|
|
254
251
|
it "instruments the method and calls it" do
|
|
255
252
|
expect(Appsignal.active?).to be_truthy
|
|
256
|
-
expect(transaction).to receive(:start_event)
|
|
257
|
-
expect(transaction).to receive(:finish_event).with \
|
|
258
|
-
"bar.class_method.AnonymousClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
259
253
|
expect(call_with_arguments).to eq(["abc", { :foo => "bar" }, 2])
|
|
254
|
+
|
|
255
|
+
transaction._sample
|
|
256
|
+
expect(transaction).to include_event("name" => "bar.class_method.AnonymousClass.other")
|
|
260
257
|
end
|
|
261
258
|
end
|
|
262
259
|
|
|
@@ -274,10 +271,9 @@ describe Object do
|
|
|
274
271
|
|
|
275
272
|
it "instruments the method and calls it" do
|
|
276
273
|
expect(Appsignal.active?).to be_truthy
|
|
277
|
-
expect(transaction).to receive(:start_event)
|
|
278
|
-
expect(transaction).to receive(:finish_event).with \
|
|
279
|
-
"bar.class_method.NamedClass.other", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
280
274
|
expect(klass.bar).to eq(2)
|
|
275
|
+
|
|
276
|
+
expect(transaction).to include_event("name" => "bar.class_method.NamedClass.other")
|
|
281
277
|
end
|
|
282
278
|
|
|
283
279
|
context "with nested named class" do
|
|
@@ -298,11 +294,10 @@ describe Object do
|
|
|
298
294
|
|
|
299
295
|
it "instruments the method and calls it" do
|
|
300
296
|
expect(Appsignal.active?).to be_truthy
|
|
301
|
-
expect(transaction).to receive(:start_event)
|
|
302
|
-
expect(transaction).to receive(:finish_event).with \
|
|
303
|
-
"bar.class_method.NamedClass.NestedModule.MyModule.other", nil, nil,
|
|
304
|
-
Appsignal::EventFormatter::DEFAULT
|
|
305
297
|
expect(klass.bar).to eq(2)
|
|
298
|
+
expect(transaction).to include_event(
|
|
299
|
+
"name" => "bar.class_method.NamedClass.NestedModule.MyModule.other"
|
|
300
|
+
)
|
|
306
301
|
end
|
|
307
302
|
end
|
|
308
303
|
end
|
|
@@ -319,10 +314,9 @@ describe Object do
|
|
|
319
314
|
|
|
320
315
|
it "instruments with custom name" do
|
|
321
316
|
expect(Appsignal.active?).to be_truthy
|
|
322
|
-
expect(transaction).to receive(:start_event)
|
|
323
|
-
expect(transaction).to receive(:finish_event).with \
|
|
324
|
-
"my_method.group", nil, nil, Appsignal::EventFormatter::DEFAULT
|
|
325
317
|
expect(klass.bar).to eq(2)
|
|
318
|
+
|
|
319
|
+
expect(transaction).to include_event("name" => "my_method.group")
|
|
326
320
|
end
|
|
327
321
|
end
|
|
328
322
|
|
|
@@ -336,7 +330,7 @@ describe Object do
|
|
|
336
330
|
end
|
|
337
331
|
end
|
|
338
332
|
|
|
339
|
-
it "
|
|
333
|
+
it "yields the block" do
|
|
340
334
|
expect(klass.bar { 42 }).to eq(42)
|
|
341
335
|
end
|
|
342
336
|
end
|
|
@@ -347,7 +341,6 @@ describe Object do
|
|
|
347
341
|
|
|
348
342
|
it "does not instrument, but still call the method" do
|
|
349
343
|
expect(Appsignal.active?).to be_falsy
|
|
350
|
-
expect(transaction).to_not receive(:start_event)
|
|
351
344
|
expect(call_with_arguments).to eq(["abc", { :foo => "bar" }, 2])
|
|
352
345
|
end
|
|
353
346
|
end
|
|
@@ -2,21 +2,11 @@ if DependencyHelper.padrino_present?
|
|
|
2
2
|
describe "Padrino integration" do
|
|
3
3
|
require "appsignal/integrations/padrino"
|
|
4
4
|
|
|
5
|
-
before do
|
|
6
|
-
allow(Appsignal).to receive(:active?).and_return(true)
|
|
7
|
-
allow(Appsignal).to receive(:start).and_return(true)
|
|
8
|
-
allow(Appsignal).to receive(:start_logger).and_return(true)
|
|
9
|
-
end
|
|
10
|
-
|
|
11
5
|
describe Appsignal::Integrations::PadrinoPlugin do
|
|
12
6
|
it "starts AppSignal on init" do
|
|
13
7
|
expect(Appsignal).to receive(:start)
|
|
14
8
|
end
|
|
15
9
|
|
|
16
|
-
it "starts the logger on init" do
|
|
17
|
-
expect(Appsignal).to receive(:start_logger)
|
|
18
|
-
end
|
|
19
|
-
|
|
20
10
|
context "when not active" do
|
|
21
11
|
before { allow(Appsignal).to receive(:active?).and_return(false) }
|
|
22
12
|
|
|
@@ -59,20 +49,9 @@ if DependencyHelper.padrino_present?
|
|
|
59
49
|
let(:env) { {} }
|
|
60
50
|
# TODO: use an instance double
|
|
61
51
|
let(:settings) { double(:name => "TestApp") }
|
|
52
|
+
around { |example| keep_transactions { example.run } }
|
|
62
53
|
|
|
63
54
|
describe "routes" do
|
|
64
|
-
let(:transaction) do
|
|
65
|
-
instance_double "Appsignal::Transaction",
|
|
66
|
-
:set_http_or_background_action => nil,
|
|
67
|
-
:set_http_or_background_queue_start => nil,
|
|
68
|
-
:set_metadata => nil,
|
|
69
|
-
:set_action => nil,
|
|
70
|
-
:set_action_if_nil => nil,
|
|
71
|
-
:set_error => nil,
|
|
72
|
-
:start_event => nil,
|
|
73
|
-
:finish_event => nil,
|
|
74
|
-
:complete => nil
|
|
75
|
-
end
|
|
76
55
|
let(:request_kind) { kind_of(Sinatra::Request) }
|
|
77
56
|
let(:env) do
|
|
78
57
|
{
|
|
@@ -90,10 +69,6 @@ if DependencyHelper.padrino_present?
|
|
|
90
69
|
end
|
|
91
70
|
end
|
|
92
71
|
let(:response) { app.call(env) }
|
|
93
|
-
before do
|
|
94
|
-
allow(Appsignal::Transaction).to receive(:create).and_return(transaction)
|
|
95
|
-
allow(Appsignal::Transaction).to receive(:current).and_return(transaction)
|
|
96
|
-
end
|
|
97
72
|
|
|
98
73
|
RSpec::Matchers.define :match_response do |expected_status, expected_content|
|
|
99
74
|
match do |response|
|
|
@@ -109,46 +84,41 @@ if DependencyHelper.padrino_present?
|
|
|
109
84
|
end
|
|
110
85
|
|
|
111
86
|
def expect_a_transaction_to_be_created
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
.and_call_original
|
|
122
|
-
expect(transaction).to receive(:set_metadata).with("path", path)
|
|
123
|
-
expect(transaction).to receive(:set_metadata).with("method", "GET")
|
|
124
|
-
expect(transaction).to receive(:complete)
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
def expect_no_transaction_to_be_created
|
|
128
|
-
expect(Appsignal::Transaction).to_not receive(:create)
|
|
129
|
-
expect(Appsignal).to_not receive(:instrument)
|
|
87
|
+
transaction = last_transaction
|
|
88
|
+
expect(transaction).to have_id
|
|
89
|
+
expect(transaction).to have_namespace(Appsignal::Transaction::HTTP_REQUEST)
|
|
90
|
+
expect(transaction).to include_metadata(
|
|
91
|
+
"path" => path,
|
|
92
|
+
"method" => "GET"
|
|
93
|
+
)
|
|
94
|
+
expect(transaction).to include_event("name" => "process_action.padrino")
|
|
95
|
+
expect(transaction).to be_completed
|
|
130
96
|
end
|
|
131
97
|
|
|
132
98
|
context "when AppSignal is not active" do
|
|
133
99
|
before { allow(Appsignal).to receive(:active?).and_return(false) }
|
|
134
100
|
let(:path) { "/foo" }
|
|
135
101
|
before { app.controllers { get(:foo) { "content" } } }
|
|
136
|
-
after { expect(response).to match_response(200, "content") }
|
|
137
102
|
|
|
138
103
|
it "does not instrument the request" do
|
|
139
|
-
|
|
104
|
+
expect do
|
|
105
|
+
expect(response).to match_response(200, "content")
|
|
106
|
+
end.to_not(change { created_transactions.count })
|
|
140
107
|
end
|
|
141
108
|
end
|
|
142
109
|
|
|
143
110
|
context "when AppSignal is active" do
|
|
111
|
+
before { start_agent }
|
|
112
|
+
|
|
144
113
|
context "with not existing route" do
|
|
145
114
|
let(:path) { "/404" }
|
|
146
115
|
|
|
147
116
|
it "instruments the request" do
|
|
117
|
+
expect(response).to match_response(404, /^GET /404/)
|
|
118
|
+
|
|
148
119
|
expect_a_transaction_to_be_created
|
|
149
120
|
# Uses path for action name
|
|
150
|
-
expect(
|
|
151
|
-
expect(response).to match_response(404, /^GET /404/)
|
|
121
|
+
expect(last_transaction).to have_action("PadrinoTestApp#unknown")
|
|
152
122
|
end
|
|
153
123
|
end
|
|
154
124
|
|
|
@@ -158,10 +128,11 @@ if DependencyHelper.padrino_present?
|
|
|
158
128
|
env["sinatra.static_file"] = true
|
|
159
129
|
app.controllers { get(:static) { "Static!" } }
|
|
160
130
|
end
|
|
161
|
-
after { expect(response).to match_response(200, "Static!") }
|
|
162
131
|
|
|
163
132
|
it "does not instrument the request" do
|
|
164
|
-
|
|
133
|
+
expect do
|
|
134
|
+
expect(response).to match_response(200, "Static!")
|
|
135
|
+
end.to_not(change { created_transactions.count })
|
|
165
136
|
end
|
|
166
137
|
end
|
|
167
138
|
|
|
@@ -172,12 +143,14 @@ if DependencyHelper.padrino_present?
|
|
|
172
143
|
allow_any_instance_of(Sinatra::Request).to receive(:action).and_return(nil)
|
|
173
144
|
app.controllers { get(:my_original_path, :with => :id) { "content" } }
|
|
174
145
|
end
|
|
175
|
-
after { expect(response).to match_response(200, "content") }
|
|
176
146
|
|
|
177
147
|
it "falls back on Sinatra::Request#route_obj.original_path" do
|
|
148
|
+
expect do
|
|
149
|
+
expect(response).to match_response(200, "content")
|
|
150
|
+
end.to(change { created_transactions.count }.by(1))
|
|
151
|
+
|
|
178
152
|
expect_a_transaction_to_be_created
|
|
179
|
-
expect(
|
|
180
|
-
.to receive(:set_action_if_nil).with("PadrinoTestApp:/my_original_path/:id")
|
|
153
|
+
expect(last_transaction).to have_action("PadrinoTestApp:/my_original_path/:id")
|
|
181
154
|
end
|
|
182
155
|
end
|
|
183
156
|
|
|
@@ -188,11 +161,11 @@ if DependencyHelper.padrino_present?
|
|
|
188
161
|
allow_any_instance_of(Sinatra::Request).to receive(:route_obj).and_return(nil)
|
|
189
162
|
app.controllers { get(:my_original_path) { "content" } }
|
|
190
163
|
end
|
|
191
|
-
after { expect(response).to match_response(200, "content") }
|
|
192
164
|
|
|
193
165
|
it "falls back on app name" do
|
|
166
|
+
expect(response).to match_response(200, "content")
|
|
194
167
|
expect_a_transaction_to_be_created
|
|
195
|
-
expect(
|
|
168
|
+
expect(last_transaction).to have_action("PadrinoTestApp#unknown")
|
|
196
169
|
end
|
|
197
170
|
end
|
|
198
171
|
|
|
@@ -200,25 +173,25 @@ if DependencyHelper.padrino_present?
|
|
|
200
173
|
context "with an exception in the controller" do
|
|
201
174
|
let(:path) { "/exception" }
|
|
202
175
|
before do
|
|
203
|
-
app.controllers { get(:exception) { raise ExampleException } }
|
|
176
|
+
app.controllers { get(:exception) { raise ExampleException, "error message" } }
|
|
177
|
+
expect { response }.to raise_error(ExampleException, "error message")
|
|
204
178
|
expect_a_transaction_to_be_created
|
|
205
179
|
end
|
|
206
|
-
after do
|
|
207
|
-
expect { response }.to raise_error(ExampleException)
|
|
208
|
-
end
|
|
209
180
|
|
|
210
181
|
it "sets the action name based on the app name and action name" do
|
|
211
|
-
expect(
|
|
182
|
+
expect(last_transaction).to have_action("PadrinoTestApp:#exception")
|
|
212
183
|
end
|
|
213
184
|
|
|
214
185
|
it "sets the error on the transaction" do
|
|
215
|
-
expect(
|
|
186
|
+
expect(last_transaction).to have_error("ExampleException", "error message")
|
|
216
187
|
end
|
|
217
188
|
end
|
|
218
189
|
|
|
219
190
|
context "without an exception in the controller" do
|
|
220
191
|
let(:path) { "/" }
|
|
221
|
-
|
|
192
|
+
def make_request
|
|
193
|
+
expect(response).to match_response(200, "content")
|
|
194
|
+
end
|
|
222
195
|
|
|
223
196
|
context "with action name as symbol" do
|
|
224
197
|
context "with :index helper" do
|
|
@@ -228,8 +201,9 @@ if DependencyHelper.padrino_present?
|
|
|
228
201
|
end
|
|
229
202
|
|
|
230
203
|
it "sets the action with the app name and action name" do
|
|
204
|
+
make_request
|
|
231
205
|
expect_a_transaction_to_be_created
|
|
232
|
-
expect(
|
|
206
|
+
expect(last_transaction).to have_action("PadrinoTestApp:#index")
|
|
233
207
|
end
|
|
234
208
|
end
|
|
235
209
|
|
|
@@ -240,8 +214,9 @@ if DependencyHelper.padrino_present?
|
|
|
240
214
|
end
|
|
241
215
|
|
|
242
216
|
it "sets the action with the app name and action name" do
|
|
217
|
+
make_request
|
|
243
218
|
expect_a_transaction_to_be_created
|
|
244
|
-
expect(
|
|
219
|
+
expect(last_transaction).to have_action("PadrinoTestApp:#foo")
|
|
245
220
|
end
|
|
246
221
|
end
|
|
247
222
|
end
|
|
@@ -254,8 +229,9 @@ if DependencyHelper.padrino_present?
|
|
|
254
229
|
end
|
|
255
230
|
|
|
256
231
|
it "sets the action with the app name and action path" do
|
|
232
|
+
make_request
|
|
257
233
|
expect_a_transaction_to_be_created
|
|
258
|
-
expect(
|
|
234
|
+
expect(last_transaction).to have_action("PadrinoTestApp:#/")
|
|
259
235
|
end
|
|
260
236
|
end
|
|
261
237
|
|
|
@@ -266,8 +242,9 @@ if DependencyHelper.padrino_present?
|
|
|
266
242
|
end
|
|
267
243
|
|
|
268
244
|
it "sets the action with the app name and action path" do
|
|
245
|
+
make_request
|
|
269
246
|
expect_a_transaction_to_be_created
|
|
270
|
-
expect(
|
|
247
|
+
expect(last_transaction).to have_action("PadrinoTestApp:#/foo")
|
|
271
248
|
end
|
|
272
249
|
end
|
|
273
250
|
end
|
|
@@ -282,9 +259,9 @@ if DependencyHelper.padrino_present?
|
|
|
282
259
|
end
|
|
283
260
|
|
|
284
261
|
it "sets the action with the app name, controller name and action name" do
|
|
262
|
+
make_request
|
|
285
263
|
expect_a_transaction_to_be_created
|
|
286
|
-
expect(
|
|
287
|
-
.with("PadrinoTestApp:my_controller#index")
|
|
264
|
+
expect(last_transaction).to have_action("PadrinoTestApp:my_controller#index")
|
|
288
265
|
end
|
|
289
266
|
end
|
|
290
267
|
|
|
@@ -295,9 +272,9 @@ if DependencyHelper.padrino_present?
|
|
|
295
272
|
end
|
|
296
273
|
|
|
297
274
|
it "sets the action with the app name, controller name and action path" do
|
|
275
|
+
make_request
|
|
298
276
|
expect_a_transaction_to_be_created
|
|
299
|
-
expect(
|
|
300
|
-
.with("PadrinoTestApp:/my_controller#index")
|
|
277
|
+
expect(last_transaction).to have_action("PadrinoTestApp:/my_controller#index")
|
|
301
278
|
end
|
|
302
279
|
end
|
|
303
280
|
end
|
|
@@ -53,38 +53,27 @@ if DependencyHelper.que_present?
|
|
|
53
53
|
perform_que_job(instance)
|
|
54
54
|
end.to change { created_transactions.length }.by(1)
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
expect(
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
)
|
|
63
|
-
expect(transaction_hash["error"]).to be_nil
|
|
64
|
-
expect(transaction_hash["events"].first).to include(
|
|
65
|
-
"allocation_count" => kind_of(Integer),
|
|
56
|
+
transaction = last_transaction
|
|
57
|
+
expect(transaction).to have_id
|
|
58
|
+
expect(transaction).to have_namespace(Appsignal::Transaction::BACKGROUND_JOB)
|
|
59
|
+
expect(transaction).to have_action("MyQueJob#run")
|
|
60
|
+
expect(transaction).to_not have_error
|
|
61
|
+
expect(transaction).to include_event(
|
|
66
62
|
"body" => "",
|
|
67
63
|
"body_format" => Appsignal::EventFormatter::DEFAULT,
|
|
68
|
-
"child_allocation_count" => kind_of(Integer),
|
|
69
|
-
"child_duration" => kind_of(Float),
|
|
70
|
-
"child_gc_duration" => kind_of(Float),
|
|
71
64
|
"count" => 1,
|
|
72
|
-
"gc_duration" => kind_of(Float),
|
|
73
|
-
"start" => kind_of(Float),
|
|
74
|
-
"duration" => kind_of(Float),
|
|
75
65
|
"name" => "perform_job.que",
|
|
76
66
|
"title" => ""
|
|
77
67
|
)
|
|
78
|
-
expect(
|
|
79
|
-
|
|
80
|
-
"
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
"run_at" => fixed_time.to_s
|
|
86
|
-
}
|
|
68
|
+
expect(transaction).to include_params(%w[1 birds])
|
|
69
|
+
expect(transaction).to include_sample_metadata(
|
|
70
|
+
"attempts" => 0,
|
|
71
|
+
"id" => 123,
|
|
72
|
+
"priority" => 100,
|
|
73
|
+
"queue" => "dfl",
|
|
74
|
+
"run_at" => fixed_time.to_s
|
|
87
75
|
)
|
|
76
|
+
expect(transaction).to be_completed
|
|
88
77
|
end
|
|
89
78
|
end
|
|
90
79
|
|
|
@@ -100,28 +89,20 @@ if DependencyHelper.que_present?
|
|
|
100
89
|
end.to raise_error(ExampleException)
|
|
101
90
|
end.to change { created_transactions.length }.by(1)
|
|
102
91
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
expect(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
"
|
|
112
|
-
"
|
|
113
|
-
"
|
|
114
|
-
|
|
115
|
-
expect(transaction_hash["sample_data"]).to include(
|
|
116
|
-
"params" => %w[1 birds],
|
|
117
|
-
"metadata" => {
|
|
118
|
-
"attempts" => 0,
|
|
119
|
-
"id" => 123,
|
|
120
|
-
"priority" => 100,
|
|
121
|
-
"queue" => "dfl",
|
|
122
|
-
"run_at" => fixed_time.to_s
|
|
123
|
-
}
|
|
92
|
+
transaction = last_transaction
|
|
93
|
+
expect(transaction).to have_id
|
|
94
|
+
expect(transaction).to have_action("MyQueJob#run")
|
|
95
|
+
expect(transaction).to have_namespace(Appsignal::Transaction::BACKGROUND_JOB)
|
|
96
|
+
expect(transaction).to have_error(error.class.name, error.message)
|
|
97
|
+
expect(transaction).to include_params(%w[1 birds])
|
|
98
|
+
expect(transaction).to include_sample_metadata(
|
|
99
|
+
"attempts" => 0,
|
|
100
|
+
"id" => 123,
|
|
101
|
+
"priority" => 100,
|
|
102
|
+
"queue" => "dfl",
|
|
103
|
+
"run_at" => fixed_time.to_s
|
|
124
104
|
)
|
|
105
|
+
expect(transaction).to be_completed
|
|
125
106
|
end
|
|
126
107
|
end
|
|
127
108
|
|
|
@@ -133,28 +114,20 @@ if DependencyHelper.que_present?
|
|
|
133
114
|
|
|
134
115
|
expect { perform_que_job(instance) }.to change { created_transactions.length }.by(1)
|
|
135
116
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
expect(
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
"
|
|
145
|
-
"
|
|
146
|
-
"
|
|
147
|
-
|
|
148
|
-
expect(transaction_hash["sample_data"]).to include(
|
|
149
|
-
"params" => %w[1 birds],
|
|
150
|
-
"metadata" => {
|
|
151
|
-
"attempts" => 0,
|
|
152
|
-
"id" => 123,
|
|
153
|
-
"priority" => 100,
|
|
154
|
-
"queue" => "dfl",
|
|
155
|
-
"run_at" => fixed_time.to_s
|
|
156
|
-
}
|
|
117
|
+
transaction = last_transaction
|
|
118
|
+
expect(transaction).to have_id
|
|
119
|
+
expect(transaction).to have_action("MyQueJob#run")
|
|
120
|
+
expect(transaction).to have_namespace(Appsignal::Transaction::BACKGROUND_JOB)
|
|
121
|
+
expect(transaction).to have_error(error.class.name, error.message)
|
|
122
|
+
expect(transaction).to include_params(%w[1 birds])
|
|
123
|
+
expect(transaction).to include_sample_metadata(
|
|
124
|
+
"attempts" => 0,
|
|
125
|
+
"id" => 123,
|
|
126
|
+
"priority" => 100,
|
|
127
|
+
"queue" => "dfl",
|
|
128
|
+
"run_at" => fixed_time.to_s
|
|
157
129
|
)
|
|
130
|
+
expect(transaction).to be_completed
|
|
158
131
|
end
|
|
159
132
|
end
|
|
160
133
|
|
|
@@ -170,9 +143,9 @@ if DependencyHelper.que_present?
|
|
|
170
143
|
it "uses the custom action" do
|
|
171
144
|
perform_que_job(instance)
|
|
172
145
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
expect(
|
|
146
|
+
transaction = last_transaction
|
|
147
|
+
expect(transaction).to have_action("MyCustomJob#perform")
|
|
148
|
+
expect(transaction).to be_completed
|
|
176
149
|
end
|
|
177
150
|
end
|
|
178
151
|
end
|