appsignal 3.8.0-java → 3.9.0-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/CHANGELOG.md +29 -0
- data/lib/appsignal/config.rb +10 -2
- data/lib/appsignal/hooks/sidekiq.rb +18 -1
- data/lib/appsignal/integrations/sidekiq.rb +37 -18
- data/lib/appsignal/integrations/sinatra.rb +9 -7
- data/lib/appsignal/rack/abstract_middleware.rb +127 -0
- data/lib/appsignal/rack/event_handler.rb +29 -1
- data/lib/appsignal/rack/generic_instrumentation.rb +6 -33
- data/lib/appsignal/rack/sinatra_instrumentation.rb +16 -42
- data/lib/appsignal/version.rb +1 -1
- data/lib/appsignal.rb +1 -0
- data/spec/lib/appsignal/config_spec.rb +28 -0
- data/spec/lib/appsignal/integrations/sidekiq_spec.rb +175 -17
- data/spec/lib/appsignal/integrations/sinatra_spec.rb +57 -33
- data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +250 -0
- data/spec/lib/appsignal/rack/event_handler_spec.rb +56 -3
- data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +26 -79
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +80 -164
- data/support/install_deps +6 -0
- metadata +4 -2
@@ -1,91 +1,38 @@
|
|
1
1
|
describe Appsignal::Rack::GenericInstrumentation do
|
2
|
-
before :context do
|
3
|
-
start_agent
|
4
|
-
end
|
5
|
-
|
6
2
|
let(:app) { double(:call => true) }
|
7
|
-
let(:env) {
|
8
|
-
let(:
|
9
|
-
let(:middleware) { Appsignal::Rack::GenericInstrumentation.new(app, options) }
|
10
|
-
|
11
|
-
describe "#call" do
|
12
|
-
before do
|
13
|
-
allow(middleware).to receive(:raw_payload).and_return({})
|
14
|
-
end
|
15
|
-
|
16
|
-
context "when appsignal is active" do
|
17
|
-
before { allow(Appsignal).to receive(:active?).and_return(true) }
|
18
|
-
|
19
|
-
it "should call with monitoring" do
|
20
|
-
expect(middleware).to receive(:call_with_appsignal_monitoring).with(env)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
context "when appsignal is not active" do
|
25
|
-
before { allow(Appsignal).to receive(:active?).and_return(false) }
|
26
|
-
|
27
|
-
it "should not call with monitoring" do
|
28
|
-
expect(middleware).to_not receive(:call_with_appsignal_monitoring)
|
29
|
-
end
|
3
|
+
let(:env) { Rack::MockRequest.env_for("/some/path") }
|
4
|
+
let(:middleware) { Appsignal::Rack::GenericInstrumentation.new(app, {}) }
|
30
5
|
|
31
|
-
|
32
|
-
|
33
|
-
end
|
34
|
-
end
|
6
|
+
before(:context) { start_agent }
|
7
|
+
around { |example| keep_transactions { example.run } }
|
35
8
|
|
36
|
-
|
9
|
+
def make_request(env)
|
10
|
+
middleware.call(env)
|
37
11
|
end
|
38
12
|
|
39
|
-
|
40
|
-
it "
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
13
|
+
context "without an exception" do
|
14
|
+
it "reports a process_action.generic event" do
|
15
|
+
make_request(env)
|
16
|
+
|
17
|
+
expect(last_transaction.to_h).to include(
|
18
|
+
"events" => [
|
19
|
+
hash_including(
|
20
|
+
"body" => "",
|
21
|
+
"body_format" => Appsignal::EventFormatter::DEFAULT,
|
22
|
+
"count" => 1,
|
23
|
+
"name" => "process_action.generic",
|
24
|
+
"title" => ""
|
25
|
+
)
|
26
|
+
]
|
27
|
+
)
|
51
28
|
end
|
29
|
+
end
|
52
30
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
double.tap do |d|
|
57
|
-
allow(d).to receive(:call).and_raise(error)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
it "records the exception" do
|
62
|
-
expect_any_instance_of(Appsignal::Transaction).to receive(:set_error).with(error)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
it "should set the action to unknown" do
|
67
|
-
expect_any_instance_of(Appsignal::Transaction).to receive(:set_action_if_nil).with("unknown")
|
68
|
-
end
|
69
|
-
|
70
|
-
context "with a route specified in the env" do
|
71
|
-
before do
|
72
|
-
env["appsignal.route"] = "GET /"
|
73
|
-
end
|
74
|
-
|
75
|
-
it "should set the action" do
|
76
|
-
expect_any_instance_of(Appsignal::Transaction).to receive(:set_action_if_nil).with("GET /")
|
77
|
-
end
|
78
|
-
end
|
31
|
+
context "without action name metadata" do
|
32
|
+
it "reports 'unknown' as the action name" do
|
33
|
+
make_request(env)
|
79
34
|
|
80
|
-
|
81
|
-
expect_any_instance_of(Appsignal::Transaction).to receive(:set_metadata).twice
|
35
|
+
expect(last_transaction.to_h).to include("action" => "unknown")
|
82
36
|
end
|
83
|
-
|
84
|
-
it "should set the queue start" do
|
85
|
-
expect_any_instance_of(Appsignal::Transaction).to receive(:set_http_or_background_queue_start)
|
86
|
-
end
|
87
|
-
|
88
|
-
after(:error => false) { middleware.call(env) }
|
89
|
-
after(:error => true) { expect { middleware.call(env) }.to raise_error(error) }
|
90
37
|
end
|
91
38
|
end
|
@@ -16,7 +16,9 @@ if DependencyHelper.sinatra_present?
|
|
16
16
|
|
17
17
|
let(:settings) { double(:raise_errors => false) }
|
18
18
|
let(:app) { double(:call => true, :settings => settings) }
|
19
|
-
let(:env)
|
19
|
+
let(:env) do
|
20
|
+
Rack::MockRequest.env_for("/path", "sinatra.route" => "GET /path", "REQUEST_METHOD" => "GET")
|
21
|
+
end
|
20
22
|
let(:middleware) { Appsignal::Rack::SinatraInstrumentation.new(app) }
|
21
23
|
|
22
24
|
before(:context) { start_agent }
|
@@ -28,8 +30,7 @@ if DependencyHelper.sinatra_present?
|
|
28
30
|
before { allow(middleware).to receive(:raw_payload).and_return({}) }
|
29
31
|
|
30
32
|
it "doesn't instrument requests" do
|
31
|
-
make_request(env)
|
32
|
-
expect(created_transactions.count).to eq(0)
|
33
|
+
expect { make_request(env) }.to_not(change { created_transactions.count })
|
33
34
|
end
|
34
35
|
end
|
35
36
|
|
@@ -47,7 +48,9 @@ if DependencyHelper.sinatra_present?
|
|
47
48
|
|
48
49
|
let(:settings) { double(:raise_errors => false) }
|
49
50
|
let(:app) { double(:call => true, :settings => settings) }
|
50
|
-
let(:env)
|
51
|
+
let(:env) do
|
52
|
+
Rack::MockRequest.env_for("/path", "sinatra.route" => "GET /path", "REQUEST_METHOD" => "GET")
|
53
|
+
end
|
51
54
|
let(:options) { {} }
|
52
55
|
let(:middleware) { Appsignal::Rack::SinatraBaseInstrumentation.new(app, options) }
|
53
56
|
|
@@ -93,216 +96,129 @@ if DependencyHelper.sinatra_present?
|
|
93
96
|
describe "#call" do
|
94
97
|
before { allow(middleware).to receive(:raw_payload).and_return({}) }
|
95
98
|
|
96
|
-
context "when appsignal is active" do
|
97
|
-
it "instruments requests" do
|
98
|
-
expect(middleware).to receive(:call_with_appsignal_monitoring).with(env)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
99
|
context "when appsignal is not active" do
|
103
100
|
before { allow(Appsignal).to receive(:active?).and_return(false) }
|
104
101
|
|
105
102
|
it "does not instrument requests" do
|
106
|
-
expect(created_transactions.count
|
103
|
+
expect { make_request(env) }.to_not(change { created_transactions.count })
|
107
104
|
end
|
108
105
|
|
109
106
|
it "calls the next middleware in the stack" do
|
110
|
-
expect(app).to receive(:call).with(env)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
after { make_request(env) }
|
115
|
-
end
|
116
|
-
|
117
|
-
describe "#call_with_appsignal_monitoring" do
|
118
|
-
context "without an error" do
|
119
|
-
it "creates a transaction" do
|
120
|
-
expect(app).to receive(:call).with(env)
|
121
|
-
|
122
107
|
make_request(env)
|
123
108
|
|
124
|
-
expect(
|
125
|
-
expect(last_transaction.to_h).to include(
|
126
|
-
"namespace" => Appsignal::Transaction::HTTP_REQUEST,
|
127
|
-
"action" => "GET /",
|
128
|
-
"error" => nil,
|
129
|
-
"metadata" => { "path" => "" }
|
130
|
-
)
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
context "with an error" do
|
135
|
-
let(:error) { ExampleException }
|
136
|
-
let(:app) do
|
137
|
-
double.tap do |d|
|
138
|
-
allow(d).to receive(:call).and_raise(error)
|
139
|
-
allow(d).to receive(:settings).and_return(settings)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
it "records the exception" do
|
144
|
-
make_request_with_error(env, error)
|
145
|
-
|
146
|
-
expect(created_transactions.count).to eq(1)
|
147
|
-
expect(last_transaction.to_h).to include(
|
148
|
-
"namespace" => Appsignal::Transaction::HTTP_REQUEST,
|
149
|
-
"action" => "GET /",
|
150
|
-
"error" => hash_including(
|
151
|
-
"name" => "ExampleException",
|
152
|
-
"message" => "ExampleException"
|
153
|
-
)
|
154
|
-
)
|
109
|
+
expect(app).to have_received(:call).with(env)
|
155
110
|
end
|
156
111
|
end
|
157
112
|
|
158
|
-
context "
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
context "when raise_errors is off" do
|
163
|
-
let(:settings) { double(:raise_errors => false) }
|
164
|
-
|
165
|
-
it "record the error" do
|
113
|
+
context "when appsignal is active" do
|
114
|
+
context "without an exception" do
|
115
|
+
it "reports a process_action.sinatra event" do
|
166
116
|
make_request(env)
|
167
117
|
|
168
|
-
expect(created_transactions.count).to eq(1)
|
169
118
|
expect(last_transaction.to_h).to include(
|
170
|
-
"
|
171
|
-
|
172
|
-
|
173
|
-
|
119
|
+
"events" => [
|
120
|
+
hash_including(
|
121
|
+
"body" => "",
|
122
|
+
"body_format" => Appsignal::EventFormatter::DEFAULT,
|
123
|
+
"count" => 1,
|
124
|
+
"name" => "process_action.sinatra",
|
125
|
+
"title" => ""
|
126
|
+
)
|
127
|
+
]
|
174
128
|
)
|
175
129
|
end
|
176
130
|
end
|
177
131
|
|
178
|
-
context "
|
179
|
-
let(:
|
180
|
-
|
181
|
-
|
182
|
-
make_request(env)
|
183
|
-
|
184
|
-
expect(created_transactions.count).to eq(1)
|
185
|
-
expect(last_transaction.to_h).to include("error" => nil)
|
132
|
+
context "with an error in sinatra.error" do
|
133
|
+
let(:error) { ExampleException.new("error message") }
|
134
|
+
before do
|
135
|
+
env["sinatra.error"] = error
|
186
136
|
end
|
187
|
-
end
|
188
137
|
|
189
|
-
|
190
|
-
|
138
|
+
context "when raise_errors is off" do
|
139
|
+
let(:settings) { double(:raise_errors => false) }
|
191
140
|
|
192
|
-
|
193
|
-
|
141
|
+
it "record the error" do
|
142
|
+
expect { make_request(env) }
|
143
|
+
.to(change { created_transactions.count }.by(1))
|
194
144
|
|
195
|
-
|
196
|
-
|
145
|
+
expect(last_transaction.to_h).to include(
|
146
|
+
"error" => hash_including(
|
147
|
+
"name" => "ExampleException",
|
148
|
+
"message" => "error message"
|
149
|
+
)
|
150
|
+
)
|
151
|
+
end
|
197
152
|
end
|
198
|
-
end
|
199
|
-
end
|
200
153
|
|
201
|
-
|
202
|
-
|
203
|
-
make_request(env)
|
154
|
+
context "when raise_errors is on" do
|
155
|
+
let(:settings) { double(:raise_errors => true) }
|
204
156
|
|
205
|
-
|
206
|
-
|
207
|
-
|
157
|
+
it "does not record the error" do
|
158
|
+
expect { make_request(env) }
|
159
|
+
.to(change { created_transactions.count }.by(1))
|
160
|
+
|
161
|
+
expect(last_transaction.to_h).to include("error" => nil)
|
162
|
+
end
|
163
|
+
end
|
208
164
|
|
209
|
-
|
210
|
-
|
165
|
+
context "if sinatra.skip_appsignal_error is set" do
|
166
|
+
before do
|
167
|
+
env.merge!(
|
168
|
+
"sinatra.error" => error,
|
169
|
+
"sinatra.skip_appsignal_error" => true
|
170
|
+
)
|
171
|
+
end
|
211
172
|
|
212
|
-
|
213
|
-
|
173
|
+
it "does not record the error" do
|
174
|
+
expect { make_request(env) }
|
175
|
+
.to(change { created_transactions.count }.by(1))
|
214
176
|
|
215
|
-
|
216
|
-
|
177
|
+
expect(last_transaction.to_h).to include("error" => nil)
|
178
|
+
end
|
217
179
|
end
|
218
180
|
end
|
219
181
|
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
it "should call set_action with an application prefix path" do
|
182
|
+
describe "action name" do
|
183
|
+
it "sets the action to the request method and path" do
|
224
184
|
make_request(env)
|
225
185
|
|
226
|
-
expect(
|
227
|
-
expect(last_transaction.to_h).to include("action" => "GET /api/")
|
186
|
+
expect(last_transaction.to_h).to include("action" => "GET /path")
|
228
187
|
end
|
229
188
|
|
230
189
|
context "without 'sinatra.route' env" do
|
231
|
-
let(:env)
|
190
|
+
let(:env) do
|
191
|
+
Rack::MockRequest.env_for("/path", "REQUEST_METHOD" => "GET")
|
192
|
+
end
|
232
193
|
|
233
194
|
it "doesn't set an action name" do
|
234
195
|
make_request(env)
|
235
196
|
|
236
|
-
expect(created_transactions.count).to eq(1)
|
237
197
|
expect(last_transaction.to_h).to include("action" => nil)
|
238
198
|
end
|
239
199
|
end
|
240
|
-
end
|
241
|
-
end
|
242
|
-
|
243
|
-
context "metadata" do
|
244
|
-
let(:env) { { "PATH_INFO" => "/some/path", "REQUEST_METHOD" => "GET" } }
|
245
|
-
|
246
|
-
it "sets metadata from the environment" do
|
247
|
-
make_request(env)
|
248
|
-
|
249
|
-
expect(created_transactions.count).to eq(1)
|
250
|
-
expect(last_transaction.to_h).to include(
|
251
|
-
"metadata" => {
|
252
|
-
"method" => "GET",
|
253
|
-
"path" => "/some/path"
|
254
|
-
},
|
255
|
-
"sample_data" => hash_including(
|
256
|
-
"environment" => hash_including(
|
257
|
-
"REQUEST_METHOD" => "GET",
|
258
|
-
"PATH_INFO" => "/some/path"
|
259
|
-
)
|
260
|
-
)
|
261
|
-
)
|
262
|
-
end
|
263
|
-
end
|
264
200
|
|
265
|
-
|
266
|
-
|
267
|
-
let(:env) do
|
268
|
-
{ "HTTP_X_REQUEST_START" => "t=#{queue_start_time.to_i}" } # in milliseconds
|
269
|
-
end
|
270
|
-
|
271
|
-
it "sets the queue start" do
|
272
|
-
make_request(env)
|
273
|
-
expect(last_transaction.ext.queue_start).to eq(queue_start_time)
|
274
|
-
end
|
275
|
-
end
|
276
|
-
|
277
|
-
class FilteredRequest
|
278
|
-
def initialize(_args) # rubocop:disable Style/RedundantInitialize
|
279
|
-
end
|
280
|
-
|
281
|
-
def path
|
282
|
-
"/static/path"
|
283
|
-
end
|
201
|
+
context "with mounted modular application" do
|
202
|
+
before { env["SCRIPT_NAME"] = "/api" }
|
284
203
|
|
285
|
-
|
286
|
-
|
287
|
-
end
|
204
|
+
it "sets the action name with an application prefix path" do
|
205
|
+
make_request(env)
|
288
206
|
|
289
|
-
|
290
|
-
|
291
|
-
end
|
292
|
-
end
|
207
|
+
expect(last_transaction.to_h).to include("action" => "GET /api/path")
|
208
|
+
end
|
293
209
|
|
294
|
-
|
295
|
-
|
210
|
+
context "without 'sinatra.route' env" do
|
211
|
+
let(:env) do
|
212
|
+
Rack::MockRequest.env_for("/path", "REQUEST_METHOD" => "GET")
|
213
|
+
end
|
296
214
|
|
297
|
-
|
298
|
-
|
215
|
+
it "doesn't set an action name" do
|
216
|
+
make_request(env)
|
299
217
|
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
)
|
305
|
-
)
|
218
|
+
expect(last_transaction.to_h).to include("action" => nil)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
306
222
|
end
|
307
223
|
end
|
308
224
|
end
|
data/support/install_deps
CHANGED
@@ -4,6 +4,12 @@ set -eu
|
|
4
4
|
|
5
5
|
gem_args="--no-verbose --no-document"
|
6
6
|
|
7
|
+
# Workaround for https://github.com/jruby/jruby/issues/7059
|
8
|
+
if [[ "${RUBY_VERSION}" == *"jruby"* ]]; then
|
9
|
+
echo "Skipping rubygems and bundler update for JRuby"
|
10
|
+
exit 0
|
11
|
+
fi
|
12
|
+
|
7
13
|
case "${_RUBYGEMS_VERSION-"latest"}" in
|
8
14
|
"latest")
|
9
15
|
echo "Updating rubygems"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appsignal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.9.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Robert Beekman
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-06-
|
13
|
+
date: 2024-06-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rack
|
@@ -285,6 +285,7 @@ files:
|
|
285
285
|
- lib/appsignal/probes/helpers.rb
|
286
286
|
- lib/appsignal/probes/mri.rb
|
287
287
|
- lib/appsignal/probes/sidekiq.rb
|
288
|
+
- lib/appsignal/rack/abstract_middleware.rb
|
288
289
|
- lib/appsignal/rack/event_handler.rb
|
289
290
|
- lib/appsignal/rack/generic_instrumentation.rb
|
290
291
|
- lib/appsignal/rack/rails_instrumentation.rb
|
@@ -386,6 +387,7 @@ files:
|
|
386
387
|
- spec/lib/appsignal/probes/mri_spec.rb
|
387
388
|
- spec/lib/appsignal/probes/sidekiq_spec.rb
|
388
389
|
- spec/lib/appsignal/probes_spec.rb
|
390
|
+
- spec/lib/appsignal/rack/abstract_middleware_spec.rb
|
389
391
|
- spec/lib/appsignal/rack/event_handler_spec.rb
|
390
392
|
- spec/lib/appsignal/rack/generic_instrumentation_spec.rb
|
391
393
|
- spec/lib/appsignal/rack/rails_instrumentation_spec.rb
|