appsignal 3.9.2-java → 3.10.0-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 +3138 -0
- data/.rubocop.yml +28 -20
- data/.rubocop_todo.yml +7 -33
- data/CHANGELOG.md +130 -0
- data/README.md +0 -1
- data/Rakefile +80 -65
- data/appsignal.gemspec +1 -1
- data/build_matrix.yml +112 -184
- data/ext/base.rb +1 -1
- data/gemfiles/hanami-2.1.gemfile +7 -0
- data/gemfiles/webmachine1.gemfile +5 -4
- data/lib/appsignal/cli/diagnose.rb +1 -1
- data/lib/appsignal/config.rb +5 -1
- data/lib/appsignal/demo.rb +0 -1
- data/lib/appsignal/environment.rb +11 -2
- data/lib/appsignal/extension/jruby.rb +1 -1
- data/lib/appsignal/helpers/instrumentation.rb +164 -2
- data/lib/appsignal/hooks/active_job.rb +1 -6
- data/lib/appsignal/integrations/grape.rb +19 -47
- data/lib/appsignal/integrations/hanami.rb +8 -7
- data/lib/appsignal/integrations/padrino.rb +51 -52
- data/lib/appsignal/integrations/railtie.rb +0 -3
- data/lib/appsignal/integrations/rake.rb +46 -12
- data/lib/appsignal/integrations/sidekiq.rb +1 -11
- data/lib/appsignal/integrations/sinatra.rb +0 -1
- data/lib/appsignal/integrations/webmachine.rb +15 -9
- 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 +104 -33
- data/lib/appsignal/rack/body_wrapper.rb +143 -0
- data/lib/appsignal/rack/event_handler.rb +12 -3
- data/lib/appsignal/rack/generic_instrumentation.rb +5 -4
- data/lib/appsignal/rack/grape_middleware.rb +40 -0
- data/lib/appsignal/rack/hanami_middleware.rb +2 -12
- data/lib/appsignal/rack/instrumentation_middleware.rb +62 -0
- data/lib/appsignal/rack/rails_instrumentation.rb +14 -57
- data/lib/appsignal/rack/sinatra_instrumentation.rb +1 -3
- data/lib/appsignal/rack/streaming_listener.rb +13 -59
- data/lib/appsignal/rack.rb +31 -0
- data/lib/appsignal/transaction.rb +50 -8
- 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 +36 -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 +8 -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 +107 -34
- 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 +190 -163
- 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 +10 -3
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +77 -40
- 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 +302 -105
- data/spec/lib/appsignal/rack/body_wrapper_spec.rb +263 -0
- data/spec/lib/appsignal/rack/event_handler_spec.rb +81 -78
- data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +70 -27
- 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/instrumentation_middleware_spec.rb +38 -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 +44 -139
- data/spec/lib/appsignal/transaction_spec.rb +239 -94
- data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +163 -0
- data/spec/lib/appsignal_spec.rb +556 -344
- 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 +20 -11
- 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/support/check_versions +0 -22
- /data/gemfiles/{hanami.gemfile → hanami-2.0.gemfile} +0 -0
@@ -23,9 +23,8 @@ if DependencyHelper.http_present?
|
|
23
23
|
|
24
24
|
HTTP.get("http://www.google.com")
|
25
25
|
|
26
|
-
|
27
|
-
expect(
|
28
|
-
expect(transaction_hash["events"].first).to include(
|
26
|
+
expect(transaction).to have_namespace(Appsignal::Transaction::HTTP_REQUEST)
|
27
|
+
expect(transaction).to include_event(
|
29
28
|
"body" => "",
|
30
29
|
"body_format" => Appsignal::EventFormatter::DEFAULT,
|
31
30
|
"name" => "request.http_rb",
|
@@ -38,9 +37,8 @@ if DependencyHelper.http_present?
|
|
38
37
|
|
39
38
|
HTTP.get("https://www.google.com")
|
40
39
|
|
41
|
-
|
42
|
-
expect(
|
43
|
-
expect(transaction_hash["events"].first).to include(
|
40
|
+
expect(transaction).to have_namespace(Appsignal::Transaction::HTTP_REQUEST)
|
41
|
+
expect(transaction).to include_event(
|
44
42
|
"body" => "",
|
45
43
|
"body_format" => Appsignal::EventFormatter::DEFAULT,
|
46
44
|
"name" => "request.http_rb",
|
@@ -54,7 +52,7 @@ if DependencyHelper.http_present?
|
|
54
52
|
|
55
53
|
HTTP.get("https://www.google.com", :params => { :q => "Appsignal" })
|
56
54
|
|
57
|
-
expect(transaction
|
55
|
+
expect(transaction).to include_event(
|
58
56
|
"body" => "",
|
59
57
|
"title" => "GET https://www.google.com"
|
60
58
|
)
|
@@ -66,7 +64,7 @@ if DependencyHelper.http_present?
|
|
66
64
|
|
67
65
|
HTTP.post("https://www.google.com", :json => { :q => "Appsignal" })
|
68
66
|
|
69
|
-
expect(transaction
|
67
|
+
expect(transaction).to include_event(
|
70
68
|
"body" => "",
|
71
69
|
"title" => "POST https://www.google.com"
|
72
70
|
)
|
@@ -83,20 +81,14 @@ if DependencyHelper.http_present?
|
|
83
81
|
HTTP.get("https://www.google.com")
|
84
82
|
end.to raise_error(ExampleException)
|
85
83
|
|
86
|
-
|
87
|
-
expect(
|
88
|
-
expect(transaction_hash["events"].first).to include(
|
84
|
+
expect(transaction).to have_namespace(Appsignal::Transaction::HTTP_REQUEST)
|
85
|
+
expect(transaction).to include_event(
|
89
86
|
"body" => "",
|
90
87
|
"body_format" => Appsignal::EventFormatter::DEFAULT,
|
91
88
|
"name" => "request.http_rb",
|
92
89
|
"title" => "GET https://www.google.com"
|
93
90
|
)
|
94
|
-
|
95
|
-
expect(transaction_hash["error"]).to include(
|
96
|
-
"backtrace" => kind_of(String),
|
97
|
-
"name" => error.class.name,
|
98
|
-
"message" => error.message
|
99
|
-
)
|
91
|
+
expect(transaction).to have_error(error.class.name, error.message)
|
100
92
|
end
|
101
93
|
end
|
102
94
|
|
@@ -112,7 +104,7 @@ if DependencyHelper.http_present?
|
|
112
104
|
|
113
105
|
HTTP.get(request_uri.new("http://www.google.com"))
|
114
106
|
|
115
|
-
expect(transaction
|
107
|
+
expect(transaction).to include_event(
|
116
108
|
"name" => "request.http_rb",
|
117
109
|
"title" => "GET http://www.google.com"
|
118
110
|
)
|
@@ -123,7 +115,7 @@ if DependencyHelper.http_present?
|
|
123
115
|
|
124
116
|
HTTP.get(URI("http://www.google.com"))
|
125
117
|
|
126
|
-
expect(transaction
|
118
|
+
expect(transaction).to include_event(
|
127
119
|
"name" => "request.http_rb",
|
128
120
|
"title" => "GET http://www.google.com"
|
129
121
|
)
|
@@ -134,7 +126,7 @@ if DependencyHelper.http_present?
|
|
134
126
|
|
135
127
|
HTTP.get("http://www.google.com")
|
136
128
|
|
137
|
-
expect(transaction
|
129
|
+
expect(transaction).to include_event(
|
138
130
|
"name" => "request.http_rb",
|
139
131
|
"title" => "GET http://www.google.com"
|
140
132
|
)
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require "appsignal/integrations/net_http"
|
2
|
+
|
3
|
+
describe Appsignal::Integrations::NetHttpIntegration do
|
4
|
+
let(:transaction) { http_request_transaction }
|
5
|
+
before(:context) { start_agent }
|
6
|
+
before { set_current_transaction transaction }
|
7
|
+
around { |example| keep_transactions { example.run } }
|
8
|
+
|
9
|
+
it "instruments a http request" do
|
10
|
+
stub_request(:any, "http://www.google.com/")
|
11
|
+
|
12
|
+
Net::HTTP.get_response(URI.parse("http://www.google.com"))
|
13
|
+
|
14
|
+
expect(transaction).to include_event(
|
15
|
+
"name" => "request.net_http",
|
16
|
+
"title" => "GET http://www.google.com"
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
it "instruments a https request" do
|
21
|
+
stub_request(:any, "https://www.google.com/")
|
22
|
+
|
23
|
+
uri = URI.parse("https://www.google.com")
|
24
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
25
|
+
http.use_ssl = true
|
26
|
+
http.get(uri.request_uri)
|
27
|
+
|
28
|
+
expect(transaction).to include_event(
|
29
|
+
"name" => "request.net_http",
|
30
|
+
"title" => "GET https://www.google.com"
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
@@ -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
|