appsignal 3.10.0-java → 3.12.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/.rubocop.yml +1 -1
- data/CHANGELOG.md +197 -0
- data/Gemfile +1 -0
- data/Rakefile +1 -1
- data/benchmark.rake +99 -42
- data/lib/appsignal/cli/demo.rb +0 -1
- data/lib/appsignal/cli/diagnose.rb +1 -1
- data/lib/appsignal/config.rb +204 -130
- data/lib/appsignal/demo.rb +16 -26
- data/lib/appsignal/event_formatter/rom/sql_formatter.rb +1 -0
- data/lib/appsignal/event_formatter.rb +3 -2
- data/lib/appsignal/helpers/instrumentation.rb +331 -19
- data/lib/appsignal/hooks/action_cable.rb +21 -16
- data/lib/appsignal/hooks/active_job.rb +14 -8
- data/lib/appsignal/hooks/delayed_job.rb +1 -1
- data/lib/appsignal/hooks/shoryuken.rb +3 -63
- data/lib/appsignal/integrations/action_cable.rb +5 -7
- data/lib/appsignal/integrations/active_support_notifications.rb +1 -0
- data/lib/appsignal/integrations/capistrano/capistrano_2_tasks.rb +36 -35
- data/lib/appsignal/integrations/data_mapper.rb +1 -0
- data/lib/appsignal/integrations/delayed_job_plugin.rb +27 -33
- data/lib/appsignal/integrations/dry_monitor.rb +1 -0
- data/lib/appsignal/integrations/excon.rb +1 -0
- data/lib/appsignal/integrations/grape.rb +7 -0
- data/lib/appsignal/integrations/hanami.rb +8 -43
- data/lib/appsignal/integrations/http.rb +1 -0
- data/lib/appsignal/integrations/net_http.rb +1 -0
- data/lib/appsignal/integrations/object.rb +6 -0
- data/lib/appsignal/integrations/padrino.rb +8 -73
- data/lib/appsignal/integrations/que.rb +13 -20
- data/lib/appsignal/integrations/railtie.rb +36 -14
- data/lib/appsignal/integrations/rake.rb +1 -5
- data/lib/appsignal/integrations/redis.rb +1 -0
- data/lib/appsignal/integrations/redis_client.rb +1 -0
- data/lib/appsignal/integrations/resque.rb +2 -5
- data/lib/appsignal/integrations/shoryuken.rb +75 -0
- data/lib/appsignal/integrations/sidekiq.rb +7 -15
- data/lib/appsignal/integrations/sinatra.rb +8 -19
- data/lib/appsignal/integrations/unicorn.rb +1 -0
- data/lib/appsignal/integrations/webmachine.rb +2 -5
- data/lib/appsignal/loaders/grape.rb +13 -0
- data/lib/appsignal/loaders/hanami.rb +40 -0
- data/lib/appsignal/loaders/padrino.rb +68 -0
- data/lib/appsignal/loaders/sinatra.rb +24 -0
- data/lib/appsignal/loaders.rb +92 -0
- data/lib/appsignal/logger.rb +7 -3
- data/lib/appsignal/probes/helpers.rb +1 -0
- data/lib/appsignal/probes/mri.rb +1 -0
- data/lib/appsignal/probes/sidekiq.rb +1 -0
- data/lib/appsignal/probes.rb +3 -0
- data/lib/appsignal/rack/abstract_middleware.rb +20 -13
- data/lib/appsignal/rack/event_handler.rb +44 -13
- data/lib/appsignal/rack/generic_instrumentation.rb +1 -0
- data/lib/appsignal/rack/grape_middleware.rb +2 -1
- data/lib/appsignal/rack/streaming_listener.rb +1 -0
- data/lib/appsignal/rack.rb +35 -0
- data/lib/appsignal/span.rb +1 -0
- data/lib/appsignal/transaction.rb +308 -101
- data/lib/appsignal/utils/data.rb +0 -1
- data/lib/appsignal/utils/hash_sanitizer.rb +0 -1
- data/lib/appsignal/utils/integration_logger.rb +0 -13
- data/lib/appsignal/utils/integration_memory_logger.rb +0 -13
- data/lib/appsignal/utils/json.rb +0 -1
- data/lib/appsignal/utils/query_params_sanitizer.rb +0 -1
- data/lib/appsignal/utils/stdout_and_logger_message.rb +0 -1
- data/lib/appsignal/utils.rb +6 -0
- data/lib/appsignal/version.rb +1 -1
- data/lib/appsignal.rb +169 -14
- data/spec/lib/appsignal/capistrano2_spec.rb +1 -1
- data/spec/lib/appsignal/cli/demo_spec.rb +0 -1
- data/spec/lib/appsignal/cli/diagnose/paths_spec.rb +1 -1
- data/spec/lib/appsignal/cli/diagnose_spec.rb +0 -1
- data/spec/lib/appsignal/config_spec.rb +291 -44
- data/spec/lib/appsignal/demo_spec.rb +1 -2
- data/spec/lib/appsignal/environment_spec.rb +4 -2
- data/spec/lib/appsignal/hooks/action_cable_spec.rb +43 -74
- data/spec/lib/appsignal/hooks/active_support_notifications_spec.rb +3 -6
- data/spec/lib/appsignal/hooks/activejob_spec.rb +12 -3
- data/spec/lib/appsignal/hooks/delayed_job_spec.rb +2 -443
- data/spec/lib/appsignal/hooks/dry_monitor_spec.rb +4 -7
- data/spec/lib/appsignal/hooks/excon_spec.rb +3 -6
- data/spec/lib/appsignal/hooks/gvl_spec.rb +2 -2
- data/spec/lib/appsignal/hooks/http_spec.rb +1 -3
- data/spec/lib/appsignal/hooks/net_http_spec.rb +1 -1
- data/spec/lib/appsignal/hooks/redis_client_spec.rb +5 -8
- data/spec/lib/appsignal/hooks/redis_spec.rb +3 -6
- data/spec/lib/appsignal/hooks/resque_spec.rb +1 -1
- data/spec/lib/appsignal/hooks/sequel_spec.rb +3 -5
- data/spec/lib/appsignal/hooks/shoryuken_spec.rb +0 -171
- data/spec/lib/appsignal/hooks/sidekiq_spec.rb +1 -1
- data/spec/lib/appsignal/hooks/webmachine_spec.rb +1 -1
- data/spec/lib/appsignal/integrations/delayed_job_plugin_spec.rb +459 -0
- data/spec/lib/appsignal/integrations/grape_spec.rb +36 -0
- data/spec/lib/appsignal/integrations/hanami_spec.rb +9 -178
- data/spec/lib/appsignal/integrations/http_spec.rb +1 -5
- data/spec/lib/appsignal/integrations/mongo_ruby_driver_spec.rb +4 -2
- data/spec/lib/appsignal/integrations/net_http_spec.rb +1 -1
- data/spec/lib/appsignal/integrations/object_spec.rb +1 -3
- data/spec/lib/appsignal/integrations/padrino_spec.rb +8 -330
- data/spec/lib/appsignal/integrations/que_spec.rb +3 -4
- data/spec/lib/appsignal/integrations/railtie_spec.rb +275 -191
- data/spec/lib/appsignal/integrations/shoryuken_spec.rb +167 -0
- data/spec/lib/appsignal/integrations/sidekiq_spec.rb +15 -13
- data/spec/lib/appsignal/integrations/sinatra_spec.rb +9 -104
- data/spec/lib/appsignal/integrations/webmachine_spec.rb +13 -1
- data/spec/lib/appsignal/loaders/grape_spec.rb +12 -0
- data/spec/lib/appsignal/loaders/hanami_spec.rb +95 -0
- data/spec/lib/appsignal/loaders/padrino_spec.rb +277 -0
- data/spec/lib/appsignal/loaders/sinatra_spec.rb +47 -0
- data/spec/lib/appsignal/loaders_spec.rb +137 -0
- data/spec/lib/appsignal/probes/sidekiq_spec.rb +1 -1
- data/spec/lib/appsignal/probes_spec.rb +6 -5
- data/spec/lib/appsignal/rack/abstract_middleware_spec.rb +51 -5
- data/spec/lib/appsignal/rack/event_handler_spec.rb +114 -10
- data/spec/lib/appsignal/rack/generic_instrumentation_spec.rb +1 -1
- data/spec/lib/appsignal/rack/grape_middleware_spec.rb +2 -35
- data/spec/lib/appsignal/rack/hanami_middleware_spec.rb +1 -1
- data/spec/lib/appsignal/rack/rails_instrumentation_spec.rb +4 -2
- data/spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb +3 -3
- data/spec/lib/appsignal/rack_spec.rb +63 -0
- data/spec/lib/appsignal/span_spec.rb +1 -3
- data/spec/lib/appsignal/transaction_spec.rb +1640 -1075
- data/spec/lib/appsignal/utils/integration_logger_spec.rb +12 -16
- data/spec/lib/appsignal/utils/integration_memory_logger_spec.rb +0 -10
- data/spec/lib/appsignal_spec.rb +601 -36
- data/spec/lib/puma/appsignal_spec.rb +0 -3
- data/spec/spec_helper.rb +5 -4
- data/spec/support/helpers/config_helpers.rb +2 -1
- data/spec/support/helpers/loader_helper.rb +21 -0
- data/spec/support/helpers/transaction_helpers.rb +44 -20
- data/spec/support/matchers/transaction.rb +15 -1
- data/spec/support/stubs/appsignal/loaders/loader_stub.rb +7 -0
- data/spec/support/testing.rb +47 -1
- metadata +19 -2
|
@@ -15,9 +15,7 @@ describe Appsignal::Hooks::DelayedJobHook do
|
|
|
15
15
|
end
|
|
16
16
|
end
|
|
17
17
|
after(:context) { Object.send(:remove_const, :Delayed) }
|
|
18
|
-
before
|
|
19
|
-
start_agent
|
|
20
|
-
end
|
|
18
|
+
before { start_agent }
|
|
21
19
|
|
|
22
20
|
describe "#dependencies_present?" do
|
|
23
21
|
subject { described_class.new.dependencies_present? }
|
|
@@ -26,446 +24,7 @@ describe Appsignal::Hooks::DelayedJobHook do
|
|
|
26
24
|
end
|
|
27
25
|
|
|
28
26
|
it "adds the plugin" do
|
|
29
|
-
expect(::Delayed::Worker.plugins).to include
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# We haven't found a way to test the hooks, we'll have to do that manually
|
|
33
|
-
|
|
34
|
-
describe ".invoke_with_instrumentation" do
|
|
35
|
-
let(:plugin) { Appsignal::Hooks::DelayedJobPlugin }
|
|
36
|
-
let(:time) { Time.parse("01-01-2001 10:01:00UTC") }
|
|
37
|
-
let(:created_at) { time - 3600 }
|
|
38
|
-
let(:run_at) { time - 3600 }
|
|
39
|
-
let(:payload_object) { double(:args => args) }
|
|
40
|
-
let(:job_data) do
|
|
41
|
-
{
|
|
42
|
-
:id => 123,
|
|
43
|
-
:name => "TestClass#perform",
|
|
44
|
-
:priority => 1,
|
|
45
|
-
:attempts => 1,
|
|
46
|
-
:queue => "default",
|
|
47
|
-
:created_at => created_at,
|
|
48
|
-
:run_at => run_at,
|
|
49
|
-
:payload_object => payload_object
|
|
50
|
-
}
|
|
51
|
-
end
|
|
52
|
-
let(:args) { ["argument"] }
|
|
53
|
-
let(:job) { double(job_data) }
|
|
54
|
-
let(:invoked_block) { proc {} }
|
|
55
|
-
|
|
56
|
-
def perform
|
|
57
|
-
Timecop.freeze(time) do
|
|
58
|
-
keep_transactions do
|
|
59
|
-
plugin.invoke_with_instrumentation(job, invoked_block)
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
context "with a normal call" do
|
|
65
|
-
it "wraps it in a transaction" do
|
|
66
|
-
perform
|
|
67
|
-
transaction = last_transaction
|
|
68
|
-
expect(transaction).to have_action("TestClass#perform")
|
|
69
|
-
expect(transaction).to have_namespace("background_job")
|
|
70
|
-
expect(transaction).to_not have_error
|
|
71
|
-
expect(transaction).to include_event(:name => "perform_job.delayed_job")
|
|
72
|
-
expect(transaction).to include_sample_metadata(
|
|
73
|
-
"priority" => 1,
|
|
74
|
-
"attempts" => 1,
|
|
75
|
-
"queue" => "default",
|
|
76
|
-
"id" => "123"
|
|
77
|
-
)
|
|
78
|
-
expect(transaction).to include_params(["argument"])
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
context "with more complex params" do
|
|
82
|
-
let(:args) do
|
|
83
|
-
{
|
|
84
|
-
:foo => "Foo",
|
|
85
|
-
:bar => "Bar"
|
|
86
|
-
}
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it "adds the more complex arguments" do
|
|
90
|
-
perform
|
|
91
|
-
|
|
92
|
-
expect(last_transaction).to include_params("foo" => "Foo", "bar" => "Bar")
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
context "with parameter filtering" do
|
|
96
|
-
before do
|
|
97
|
-
Appsignal.config = project_fixture_config("production")
|
|
98
|
-
Appsignal.config[:filter_parameters] = ["foo"]
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
it "filters selected arguments" do
|
|
102
|
-
perform
|
|
103
|
-
|
|
104
|
-
expect(last_transaction).to include_params("foo" => "[FILTERED]", "bar" => "Bar")
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
context "with run_at in the future" do
|
|
110
|
-
let(:run_at) { Time.parse("2017-01-01 10:01:00UTC") }
|
|
111
|
-
|
|
112
|
-
it "reports queue_start with run_at time" do
|
|
113
|
-
perform
|
|
114
|
-
|
|
115
|
-
expect(last_transaction).to have_queue_start(run_at.to_i * 1000)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
context "with class method job" do
|
|
120
|
-
let(:job_data) do
|
|
121
|
-
{ :name => "CustomClassMethod.perform", :payload_object => payload_object }
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
it "wraps it in a transaction using the class method job name" do
|
|
125
|
-
perform
|
|
126
|
-
expect(last_transaction).to have_action("CustomClassMethod.perform")
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
context "with custom name call" do
|
|
131
|
-
before { perform }
|
|
132
|
-
|
|
133
|
-
context "with appsignal_name defined" do
|
|
134
|
-
context "with payload_object being an object" do
|
|
135
|
-
context "with value" do
|
|
136
|
-
let(:payload_object) { double(:appsignal_name => "CustomClass#perform") }
|
|
137
|
-
|
|
138
|
-
it "wraps it in a transaction using the custom name" do
|
|
139
|
-
expect(last_transaction).to have_action("CustomClass#perform")
|
|
140
|
-
end
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
context "with non-String value" do
|
|
144
|
-
let(:payload_object) { double(:appsignal_name => Object.new) }
|
|
145
|
-
|
|
146
|
-
it "wraps it in a transaction using the original job name" do
|
|
147
|
-
expect(last_transaction).to have_action("TestClass#perform")
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
context "with class method name as job" do
|
|
152
|
-
let(:payload_object) { double(:appsignal_name => "CustomClassMethod.perform") }
|
|
153
|
-
|
|
154
|
-
it "wraps it in a transaction using the custom name" do
|
|
155
|
-
perform
|
|
156
|
-
expect(last_transaction).to have_action("CustomClassMethod.perform")
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
context "with payload_object being a Hash" do
|
|
162
|
-
context "with value" do
|
|
163
|
-
let(:payload_object) { double(:appsignal_name => "CustomClassHash#perform") }
|
|
164
|
-
|
|
165
|
-
it "wraps it in a transaction using the custom name" do
|
|
166
|
-
expect(last_transaction).to have_action("CustomClassHash#perform")
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
context "with non-String value" do
|
|
171
|
-
let(:payload_object) { double(:appsignal_name => Object.new) }
|
|
172
|
-
|
|
173
|
-
it "wraps it in a transaction using the original job name" do
|
|
174
|
-
expect(last_transaction).to have_action("TestClass#perform")
|
|
175
|
-
end
|
|
176
|
-
end
|
|
177
|
-
|
|
178
|
-
context "with class method name as job" do
|
|
179
|
-
let(:payload_object) { { :appsignal_name => "CustomClassMethod.perform" } }
|
|
180
|
-
|
|
181
|
-
it "wraps it in a transaction using the custom name" do
|
|
182
|
-
perform
|
|
183
|
-
expect(last_transaction).to have_action("CustomClassMethod.perform")
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
context "with payload_object acting like a Hash and returning a non-String value" do
|
|
189
|
-
class ClassActingAsHash
|
|
190
|
-
def self.[](_key)
|
|
191
|
-
Object.new
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
def self.appsignal_name
|
|
195
|
-
"ClassActingAsHash#perform"
|
|
196
|
-
end
|
|
197
|
-
end
|
|
198
|
-
let(:payload_object) { ClassActingAsHash }
|
|
199
|
-
|
|
200
|
-
# We check for hash values before object values
|
|
201
|
-
# this means ClassActingAsHash returns `Object.new` instead
|
|
202
|
-
# of `self.appsignal_name`. Since this isn't a valid `String`
|
|
203
|
-
# we return the default job name as action name.
|
|
204
|
-
it "wraps it in a transaction using the original job name" do
|
|
205
|
-
expect(last_transaction).to have_action("TestClass#perform")
|
|
206
|
-
end
|
|
207
|
-
end
|
|
208
|
-
end
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
context "with only job class name" do
|
|
212
|
-
let(:job_data) do
|
|
213
|
-
{ :name => "Banana", :payload_object => payload_object }
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
it "appends #perform to the class name" do
|
|
217
|
-
perform
|
|
218
|
-
expect(last_transaction).to have_action("Banana#perform")
|
|
219
|
-
end
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
if active_job_present?
|
|
223
|
-
require "active_job"
|
|
224
|
-
|
|
225
|
-
context "when wrapped by ActiveJob" do
|
|
226
|
-
let(:payload_object) do
|
|
227
|
-
ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper.new(
|
|
228
|
-
"arguments" => args,
|
|
229
|
-
"job_class" => "TestClass",
|
|
230
|
-
"job_id" => 123,
|
|
231
|
-
"locale" => :en,
|
|
232
|
-
"queue_name" => "default"
|
|
233
|
-
)
|
|
234
|
-
end
|
|
235
|
-
let(:job) do
|
|
236
|
-
double(
|
|
237
|
-
:id => 123,
|
|
238
|
-
:name => "ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper",
|
|
239
|
-
:priority => 1,
|
|
240
|
-
:attempts => 1,
|
|
241
|
-
:queue => "default",
|
|
242
|
-
:created_at => created_at,
|
|
243
|
-
:run_at => run_at,
|
|
244
|
-
:payload_object => payload_object
|
|
245
|
-
)
|
|
246
|
-
end
|
|
247
|
-
let(:args) { ["activejob_argument"] }
|
|
248
|
-
|
|
249
|
-
it "wraps it in a transaction with the correct params" do
|
|
250
|
-
perform
|
|
251
|
-
|
|
252
|
-
transaction = last_transaction
|
|
253
|
-
expect(transaction).to have_namespace("background_job")
|
|
254
|
-
expect(transaction).to have_action("TestClass#perform")
|
|
255
|
-
expect(transaction).to_not have_error
|
|
256
|
-
expect(transaction).to include_event("name" => "perform_job.delayed_job")
|
|
257
|
-
expect(transaction).to include_sample_metadata(
|
|
258
|
-
"priority" => 1,
|
|
259
|
-
"attempts" => 1,
|
|
260
|
-
"queue" => "default",
|
|
261
|
-
"id" => "123"
|
|
262
|
-
)
|
|
263
|
-
expect(transaction).to include_params(["activejob_argument"])
|
|
264
|
-
end
|
|
265
|
-
|
|
266
|
-
context "with more complex params" do
|
|
267
|
-
let(:args) do
|
|
268
|
-
{
|
|
269
|
-
:foo => "Foo",
|
|
270
|
-
:bar => "Bar"
|
|
271
|
-
}
|
|
272
|
-
end
|
|
273
|
-
|
|
274
|
-
it "adds the more complex arguments" do
|
|
275
|
-
perform
|
|
276
|
-
transaction = last_transaction
|
|
277
|
-
expect(transaction).to have_action("TestClass#perform")
|
|
278
|
-
expect(transaction).to include_params(
|
|
279
|
-
"foo" => "Foo",
|
|
280
|
-
"bar" => "Bar"
|
|
281
|
-
)
|
|
282
|
-
end
|
|
283
|
-
|
|
284
|
-
context "with parameter filtering" do
|
|
285
|
-
before do
|
|
286
|
-
Appsignal.config = project_fixture_config("production")
|
|
287
|
-
Appsignal.config[:filter_parameters] = ["foo"]
|
|
288
|
-
end
|
|
289
|
-
|
|
290
|
-
it "filters selected arguments" do
|
|
291
|
-
perform
|
|
292
|
-
transaction = last_transaction
|
|
293
|
-
expect(transaction).to have_action("TestClass#perform")
|
|
294
|
-
expect(transaction).to include_params(
|
|
295
|
-
"foo" => "[FILTERED]",
|
|
296
|
-
"bar" => "Bar"
|
|
297
|
-
)
|
|
298
|
-
end
|
|
299
|
-
end
|
|
300
|
-
end
|
|
301
|
-
|
|
302
|
-
context "with run_at in the future" do
|
|
303
|
-
let(:run_at) { Time.parse("2017-01-01 10:01:00UTC") }
|
|
304
|
-
|
|
305
|
-
it "reports queue_start with run_at time" do
|
|
306
|
-
perform
|
|
307
|
-
|
|
308
|
-
expect(last_transaction).to have_queue_start(run_at.to_i * 1000)
|
|
309
|
-
end
|
|
310
|
-
end
|
|
311
|
-
end
|
|
312
|
-
end
|
|
313
|
-
end
|
|
314
|
-
|
|
315
|
-
context "with an erroring call" do
|
|
316
|
-
let(:error) { ExampleException.new("uh oh") }
|
|
317
|
-
before do
|
|
318
|
-
expect(invoked_block).to receive(:call).and_raise(error)
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
it "adds the error to the transaction" do
|
|
322
|
-
expect do
|
|
323
|
-
perform
|
|
324
|
-
end.to raise_error(error)
|
|
325
|
-
|
|
326
|
-
transaction = last_transaction
|
|
327
|
-
expect(transaction).to have_namespace("background_job")
|
|
328
|
-
expect(transaction).to have_action("TestClass#perform")
|
|
329
|
-
expect(transaction).to have_error("ExampleException", "uh oh")
|
|
330
|
-
end
|
|
331
|
-
end
|
|
332
|
-
end
|
|
333
|
-
|
|
334
|
-
describe ".extract_value" do
|
|
335
|
-
let(:plugin) { Appsignal::Hooks::DelayedJobPlugin }
|
|
336
|
-
|
|
337
|
-
context "for a hash" do
|
|
338
|
-
let(:hash) { { :key => "value", :bool_false => false } }
|
|
339
|
-
|
|
340
|
-
context "when the key exists" do
|
|
341
|
-
subject { plugin.extract_value(hash, :key) }
|
|
342
|
-
|
|
343
|
-
it { is_expected.to eq "value" }
|
|
344
|
-
|
|
345
|
-
context "when the value is false" do
|
|
346
|
-
subject { plugin.extract_value(hash, :bool_false) }
|
|
347
|
-
|
|
348
|
-
it { is_expected.to be false }
|
|
349
|
-
end
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
context "when the key does not exist" do
|
|
353
|
-
subject { plugin.extract_value(hash, :nonexistent_key) }
|
|
354
|
-
|
|
355
|
-
it { is_expected.to be_nil }
|
|
356
|
-
|
|
357
|
-
context "with a default value" do
|
|
358
|
-
subject { plugin.extract_value(hash, :nonexistent_key, 1) }
|
|
359
|
-
|
|
360
|
-
it { is_expected.to eq 1 }
|
|
361
|
-
end
|
|
362
|
-
end
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
context "for a struct" do
|
|
366
|
-
before :context do
|
|
367
|
-
TestStruct = Struct.new(:key)
|
|
368
|
-
end
|
|
369
|
-
let(:struct) { TestStruct.new("value") }
|
|
370
|
-
|
|
371
|
-
context "when the key exists" do
|
|
372
|
-
subject { plugin.extract_value(struct, :key) }
|
|
373
|
-
|
|
374
|
-
it { is_expected.to eq "value" }
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
context "when the key does not exist" do
|
|
378
|
-
subject { plugin.extract_value(struct, :nonexistent_key) }
|
|
379
|
-
|
|
380
|
-
it { is_expected.to be_nil }
|
|
381
|
-
|
|
382
|
-
context "with a default value" do
|
|
383
|
-
subject { plugin.extract_value(struct, :nonexistent_key, 1) }
|
|
384
|
-
|
|
385
|
-
it { is_expected.to eq 1 }
|
|
386
|
-
end
|
|
387
|
-
end
|
|
388
|
-
end
|
|
389
|
-
|
|
390
|
-
context "for a struct with a method" do
|
|
391
|
-
before :context do
|
|
392
|
-
class TestStructClass < Struct.new(:id) # rubocop:disable Style/StructInheritance
|
|
393
|
-
def appsignal_name
|
|
394
|
-
"TestStruct#perform"
|
|
395
|
-
end
|
|
396
|
-
|
|
397
|
-
def bool_false
|
|
398
|
-
false
|
|
399
|
-
end
|
|
400
|
-
end
|
|
401
|
-
end
|
|
402
|
-
let(:struct) { TestStructClass.new("id") }
|
|
403
|
-
|
|
404
|
-
context "when the Struct responds to a method" do
|
|
405
|
-
subject { plugin.extract_value(struct, :appsignal_name) }
|
|
406
|
-
|
|
407
|
-
it "returns the method value" do
|
|
408
|
-
is_expected.to eq "TestStruct#perform"
|
|
409
|
-
end
|
|
410
|
-
|
|
411
|
-
context "when the value is false" do
|
|
412
|
-
subject { plugin.extract_value(struct, :bool_false) }
|
|
413
|
-
|
|
414
|
-
it "returns the method value" do
|
|
415
|
-
is_expected.to be false
|
|
416
|
-
end
|
|
417
|
-
end
|
|
418
|
-
end
|
|
419
|
-
|
|
420
|
-
context "when the key does not exist" do
|
|
421
|
-
subject { plugin.extract_value(struct, :nonexistent_key) }
|
|
422
|
-
|
|
423
|
-
context "without a method with the same name" do
|
|
424
|
-
it "returns nil" do
|
|
425
|
-
is_expected.to be_nil
|
|
426
|
-
end
|
|
427
|
-
end
|
|
428
|
-
|
|
429
|
-
context "with a default value" do
|
|
430
|
-
let(:default_value) { :my_default_value }
|
|
431
|
-
subject { plugin.extract_value(struct, :nonexistent_key, default_value) }
|
|
432
|
-
|
|
433
|
-
it "returns the default value" do
|
|
434
|
-
is_expected.to eq default_value
|
|
435
|
-
end
|
|
436
|
-
end
|
|
437
|
-
end
|
|
438
|
-
end
|
|
439
|
-
|
|
440
|
-
context "for an object" do
|
|
441
|
-
let(:object) { double(:existing_method => "value") }
|
|
442
|
-
|
|
443
|
-
context "when the method exists" do
|
|
444
|
-
subject { plugin.extract_value(object, :existing_method) }
|
|
445
|
-
|
|
446
|
-
it { is_expected.to eq "value" }
|
|
447
|
-
end
|
|
448
|
-
|
|
449
|
-
context "when the method does not exist" do
|
|
450
|
-
subject { plugin.extract_value(object, :nonexistent_method) }
|
|
451
|
-
|
|
452
|
-
it { is_expected.to be_nil }
|
|
453
|
-
|
|
454
|
-
context "and there is a default value" do
|
|
455
|
-
subject { plugin.extract_value(object, :nonexistent_method, 1) }
|
|
456
|
-
|
|
457
|
-
it { is_expected.to eq 1 }
|
|
458
|
-
end
|
|
459
|
-
end
|
|
460
|
-
end
|
|
461
|
-
|
|
462
|
-
context "when we need to call to_s on the value" do
|
|
463
|
-
let(:object) { double(:existing_method => 1) }
|
|
464
|
-
|
|
465
|
-
subject { plugin.extract_value(object, :existing_method, nil, true) }
|
|
466
|
-
|
|
467
|
-
it { is_expected.to eq "1" }
|
|
468
|
-
end
|
|
27
|
+
expect(::Delayed::Worker.plugins).to include(Appsignal::Integrations::DelayedJobPlugin)
|
|
469
28
|
end
|
|
470
29
|
end
|
|
471
30
|
|
|
@@ -32,16 +32,13 @@ if DependencyHelper.dry_monitor_present?
|
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
describe "Dry Monitor Integration" do
|
|
35
|
-
|
|
35
|
+
let(:notifications) { Dry::Monitor::Notifications.new(:test) }
|
|
36
|
+
let(:transaction) { http_request_transaction }
|
|
37
|
+
before do
|
|
36
38
|
start_agent
|
|
39
|
+
set_current_transaction(transaction)
|
|
37
40
|
end
|
|
38
41
|
|
|
39
|
-
let!(:transaction) do
|
|
40
|
-
Appsignal::Transaction.create("uuid", Appsignal::Transaction::HTTP_REQUEST, "test")
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
let(:notifications) { Dry::Monitor::Notifications.new(:test) }
|
|
44
|
-
|
|
45
42
|
context "when is a dry-sql event" do
|
|
46
43
|
let(:event_id) { :sql }
|
|
47
44
|
let(:payload) do
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
describe Appsignal::Hooks::ExconHook do
|
|
2
|
-
before
|
|
3
|
-
start_agent
|
|
4
|
-
end
|
|
2
|
+
before { start_agent }
|
|
5
3
|
|
|
6
4
|
context "with Excon" do
|
|
7
5
|
before(:context) do
|
|
@@ -27,9 +25,8 @@ describe Appsignal::Hooks::ExconHook do
|
|
|
27
25
|
end
|
|
28
26
|
|
|
29
27
|
describe "instrumentation" do
|
|
30
|
-
let
|
|
31
|
-
|
|
32
|
-
end
|
|
28
|
+
let(:transaction) { http_request_transaction }
|
|
29
|
+
before { set_current_transaction(transaction) }
|
|
33
30
|
around { |example| keep_transactions { example.run } }
|
|
34
31
|
|
|
35
32
|
it "instruments a http request" do
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
describe Appsignal::Hooks::RedisClientHook do
|
|
2
2
|
before do
|
|
3
|
-
|
|
3
|
+
start_agent
|
|
4
4
|
end
|
|
5
5
|
|
|
6
6
|
if DependencyHelper.redis_client_present?
|
|
@@ -78,10 +78,9 @@ describe Appsignal::Hooks::RedisClientHook do
|
|
|
78
78
|
# track if it was installed already or not.
|
|
79
79
|
Appsignal::Hooks::RedisClientHook.new.install
|
|
80
80
|
end
|
|
81
|
-
let
|
|
82
|
-
Appsignal::Transaction.create("uuid", Appsignal::Transaction::HTTP_REQUEST, "test")
|
|
83
|
-
end
|
|
81
|
+
let(:transaction) { http_request_transaction }
|
|
84
82
|
let!(:client_config) { RedisClient::Config.new(:id => "stub_id") }
|
|
83
|
+
before { set_current_transaction(transaction) }
|
|
85
84
|
around { |example| keep_transactions { example.run } }
|
|
86
85
|
|
|
87
86
|
it "instrument a redis call" do
|
|
@@ -164,11 +163,9 @@ describe Appsignal::Hooks::RedisClientHook do
|
|
|
164
163
|
# track if it was installed already or not.
|
|
165
164
|
Appsignal::Hooks::RedisClientHook.new.install
|
|
166
165
|
end
|
|
167
|
-
let
|
|
168
|
-
Appsignal::Transaction.create("uuid", Appsignal::Transaction::HTTP_REQUEST,
|
|
169
|
-
"test")
|
|
170
|
-
end
|
|
166
|
+
let(:transaction) { http_request_transaction }
|
|
171
167
|
let!(:client_config) { RedisClient::Config.new(:id => "stub_id") }
|
|
168
|
+
before { set_current_transaction(transaction) }
|
|
172
169
|
around { |example| keep_transactions { example.run } }
|
|
173
170
|
|
|
174
171
|
it "instrument a redis call" do
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
describe Appsignal::Hooks::RedisHook do
|
|
2
|
-
before
|
|
3
|
-
Appsignal.config = project_fixture_config
|
|
4
|
-
end
|
|
2
|
+
before { start_agent }
|
|
5
3
|
|
|
6
4
|
if DependencyHelper.redis_present?
|
|
7
5
|
context "with redis" do
|
|
@@ -72,9 +70,8 @@ describe Appsignal::Hooks::RedisHook do
|
|
|
72
70
|
# track if it was installed already or not.
|
|
73
71
|
Appsignal::Hooks::RedisHook.new.install
|
|
74
72
|
end
|
|
75
|
-
let
|
|
76
|
-
|
|
77
|
-
end
|
|
73
|
+
let(:transaction) { http_request_transaction }
|
|
74
|
+
before { set_current_transaction(transaction) }
|
|
78
75
|
around { |example| keep_transactions { example.run } }
|
|
79
76
|
|
|
80
77
|
it "instrument a redis call" do
|
|
@@ -8,9 +8,7 @@ describe Appsignal::Hooks::SequelHook do
|
|
|
8
8
|
end
|
|
9
9
|
end
|
|
10
10
|
|
|
11
|
-
before
|
|
12
|
-
start_agent
|
|
13
|
-
end
|
|
11
|
+
before { start_agent }
|
|
14
12
|
|
|
15
13
|
describe "#dependencies_present?" do
|
|
16
14
|
subject { described_class.new.dependencies_present? }
|
|
@@ -19,9 +17,9 @@ describe Appsignal::Hooks::SequelHook do
|
|
|
19
17
|
end
|
|
20
18
|
|
|
21
19
|
context "with a transaction" do
|
|
22
|
-
let(:transaction) {
|
|
20
|
+
let(:transaction) { http_request_transaction }
|
|
23
21
|
before do
|
|
24
|
-
|
|
22
|
+
set_current_transaction(transaction)
|
|
25
23
|
db.logger = Logger.new($stdout) # To test #log_duration call
|
|
26
24
|
end
|
|
27
25
|
|