appsignal 3.9.1-java → 3.9.3-java
Sign up to get free protection for your applications and to get access to all the features.
- 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 +58 -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 +3 -3
- data/lib/appsignal/hooks/active_job.rb +2 -1
- data/lib/appsignal/integrations/action_cable.rb +1 -1
- data/lib/appsignal/integrations/grape.rb +19 -47
- data/lib/appsignal/integrations/hanami.rb +27 -41
- data/lib/appsignal/integrations/padrino.rb +46 -43
- data/lib/appsignal/integrations/railtie.rb +1 -4
- data/lib/appsignal/integrations/resque.rb +1 -1
- data/lib/appsignal/integrations/sidekiq.rb +2 -4
- data/lib/appsignal/integrations/sinatra.rb +7 -2
- 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 +37 -26
- data/lib/appsignal/rack/grape_middleware.rb +40 -0
- data/lib/appsignal/rack/hanami_middleware.rb +20 -0
- data/lib/appsignal/rack/rails_instrumentation.rb +14 -56
- 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 +126 -64
- 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 +8 -3
- 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 +151 -69
- 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 +36 -0
- 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 +79 -93
- data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +163 -0
- data/spec/lib/appsignal_spec.rb +363 -342
- data/spec/support/hanami/hanami_app.rb +1 -3
- 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 +17 -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
|