appsignal 3.7.0-java → 3.7.1-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.
@@ -16,7 +16,7 @@ describe Appsignal::Hooks::MriHook do
16
16
  end
17
17
 
18
18
  it "should be added to minutely probes" do
19
- expect(Appsignal::Minutely.probes[:mri]).to be Appsignal::Probes::MriProbe
19
+ expect(Appsignal::Probes.probes[:mri]).to be Appsignal::Probes::MriProbe
20
20
  end
21
21
  end
22
22
  end
@@ -27,7 +27,7 @@ describe Appsignal::Hooks::PumaHook do
27
27
  end
28
28
 
29
29
  describe "installation" do
30
- before { Appsignal::Minutely.probes.clear }
30
+ before { Appsignal::Probes.probes.clear }
31
31
 
32
32
  context "when not clustered mode" do
33
33
  it "does not add AppSignal stop behavior Puma::Cluster" do
@@ -1,11 +1,40 @@
1
- describe Appsignal::Minutely do
1
+ describe Appsignal::Probes do
2
2
  include WaitForHelper
3
3
 
4
- before { Appsignal::Minutely.probes.clear }
4
+ before { Appsignal::Probes.probes.clear }
5
+
6
+ context "Minutely constant" do
7
+ let(:err_stream) { std_stream }
8
+ let(:stderr) { err_stream.read }
9
+
10
+ it "returns the Probes constant calling the Minutely constant" do
11
+ silence { expect(Appsignal::Minutely).to be(Appsignal::Probes) }
12
+ end
13
+
14
+ it "prints a deprecation warning to STDERR" do
15
+ capture_std_streams(std_stream, err_stream) do
16
+ expect(Appsignal::Minutely).to be(Appsignal::Probes)
17
+ end
18
+
19
+ expect(stderr)
20
+ .to include("appsignal WARNING: The constant Appsignal::Minutely has been deprecated.")
21
+ end
22
+
23
+ it "logs a warning to STDERR" do
24
+ logs =
25
+ capture_logs do
26
+ silence do
27
+ expect(Appsignal::Minutely).to be(Appsignal::Probes)
28
+ end
29
+ end
30
+
31
+ expect(logs).to include("The constant Appsignal::Minutely has been deprecated.")
32
+ end
33
+ end
5
34
 
6
35
  it "returns a ProbeCollection" do
7
- expect(Appsignal::Minutely.probes)
8
- .to be_instance_of(Appsignal::Minutely::ProbeCollection)
36
+ expect(Appsignal::Probes.probes)
37
+ .to be_instance_of(Appsignal::Probes::ProbeCollection)
9
38
  end
10
39
 
11
40
  describe ".start" do
@@ -43,16 +72,31 @@ describe Appsignal::Minutely do
43
72
  let(:log) { log_contents(log_stream) }
44
73
  before do
45
74
  Appsignal.internal_logger = test_logger(log_stream)
46
- # Speed up test time
47
- allow(Appsignal::Minutely).to receive(:initial_wait_time).and_return(0.001)
48
- allow(Appsignal::Minutely).to receive(:wait_time).and_return(0.001)
75
+ speed_up_tests!
76
+ end
77
+
78
+ describe ".started?" do
79
+ it "returns true when the probes thread has been started" do
80
+ expect(Appsignal::Probes.started?).to be_falsy
81
+ Appsignal::Probes.register :my_probe, (lambda {})
82
+ Appsignal::Probes.start
83
+ expect(Appsignal::Probes.started?).to be_truthy
84
+ end
85
+
86
+ it "returns false when the probes thread has been stopped" do
87
+ Appsignal::Probes.register :my_probe, lambda {}
88
+ Appsignal::Probes.start
89
+ expect(Appsignal::Probes.started?).to be_truthy
90
+ Appsignal::Probes.stop
91
+ expect(Appsignal::Probes.started?).to be_falsy
92
+ end
49
93
  end
50
94
 
51
95
  context "with an instance of a class" do
52
96
  it "calls the probe every <wait_time>" do
53
97
  probe = MockProbe.new
54
- Appsignal::Minutely.probes.register :my_probe, probe
55
- Appsignal::Minutely.start
98
+ Appsignal::Probes.register :my_probe, probe
99
+ Appsignal::Probes.start
56
100
 
57
101
  wait_for("enough probe calls") { probe.calls >= 2 }
58
102
  expect(log).to contains_log(:debug, "Gathering minutely metrics with 1 probe")
@@ -63,11 +107,11 @@ describe Appsignal::Minutely do
63
107
  it "does not initialize the probe" do
64
108
  # Working probe which we can use to wait for X ticks
65
109
  working_probe = ProbeWithoutDependency.new
66
- Appsignal::Minutely.probes.register :probe_without_dep, working_probe
110
+ Appsignal::Probes.register :probe_without_dep, working_probe
67
111
 
68
112
  probe = ProbeWithMissingDependency.new
69
- Appsignal::Minutely.probes.register :probe_with_missing_dep, probe
70
- Appsignal::Minutely.start
113
+ Appsignal::Probes.register :probe_with_missing_dep, probe
114
+ Appsignal::Probes.start
71
115
 
72
116
  wait_for("enough probe calls") { working_probe.calls >= 2 }
73
117
  # Only counts initialized probes
@@ -83,8 +127,8 @@ describe Appsignal::Minutely do
83
127
  probe = MockProbe
84
128
  probe_instance = MockProbe.new
85
129
  expect(probe).to receive(:new).and_return(probe_instance)
86
- Appsignal::Minutely.probes.register :my_probe, probe
87
- Appsignal::Minutely.start
130
+ Appsignal::Probes.register :my_probe, probe
131
+ Appsignal::Probes.start
88
132
 
89
133
  wait_for("enough probe calls") { probe_instance.calls >= 2 }
90
134
  expect(log).to contains_log(:debug, "Gathering minutely metrics with 1 probe")
@@ -97,11 +141,11 @@ describe Appsignal::Minutely do
97
141
  working_probe = ProbeWithoutDependency
98
142
  working_probe_instance = working_probe.new
99
143
  expect(working_probe).to receive(:new).and_return(working_probe_instance)
100
- Appsignal::Minutely.probes.register :probe_without_dep, working_probe
144
+ Appsignal::Probes.register :probe_without_dep, working_probe
101
145
 
102
146
  probe = ProbeWithMissingDependency
103
- Appsignal::Minutely.probes.register :probe_with_missing_dep, probe
104
- Appsignal::Minutely.start
147
+ Appsignal::Probes.register :probe_with_missing_dep, probe
148
+ Appsignal::Probes.start
105
149
 
106
150
  wait_for("enough probe calls") { working_probe_instance.calls >= 2 }
107
151
  # Only counts initialized probes
@@ -117,11 +161,11 @@ describe Appsignal::Minutely do
117
161
  working_probe = ProbeWithoutDependency
118
162
  working_probe_instance = working_probe.new
119
163
  expect(working_probe).to receive(:new).and_return(working_probe_instance)
120
- Appsignal::Minutely.probes.register :probe_without_dep, working_probe
164
+ Appsignal::Probes.register :probe_without_dep, working_probe
121
165
 
122
166
  probe = BrokenProbeOnInitialize
123
- Appsignal::Minutely.probes.register :broken_probe_on_initialize, probe
124
- Appsignal::Minutely.start
167
+ Appsignal::Probes.register :broken_probe_on_initialize, probe
168
+ Appsignal::Probes.start
125
169
 
126
170
  wait_for("enough probe calls") { working_probe_instance.calls >= 2 }
127
171
  # Only counts initialized probes
@@ -142,8 +186,8 @@ describe Appsignal::Minutely do
142
186
  it "calls the lambda every <wait time>" do
143
187
  calls = 0
144
188
  probe = lambda { calls += 1 }
145
- Appsignal::Minutely.probes.register :my_probe, probe
146
- Appsignal::Minutely.start
189
+ Appsignal::Probes.register :my_probe, probe
190
+ Appsignal::Probes.start
147
191
 
148
192
  wait_for("enough probe calls") { calls >= 2 }
149
193
  expect(log).to contains_log(:debug, "Gathering minutely metrics with 1 probe")
@@ -155,9 +199,9 @@ describe Appsignal::Minutely do
155
199
  it "logs the error and continues calling the probes every <wait_time>" do
156
200
  probe = MockProbe.new
157
201
  broken_probe = BrokenProbe.new
158
- Appsignal::Minutely.probes.register :my_probe, probe
159
- Appsignal::Minutely.probes.register :broken_probe, broken_probe
160
- Appsignal::Minutely.start
202
+ Appsignal::Probes.register :my_probe, probe
203
+ Appsignal::Probes.register :broken_probe, broken_probe
204
+ Appsignal::Probes.start
161
205
 
162
206
  wait_for("enough probe calls") { probe.calls >= 2 }
163
207
  wait_for("enough broken_probe calls") { broken_probe.calls >= 2 }
@@ -174,53 +218,101 @@ describe Appsignal::Minutely do
174
218
  it "ensures only one minutely probes thread is active at a time" do
175
219
  alive_thread_counter = proc { Thread.list.reject { |t| t.status == "dead" }.length }
176
220
  probe = MockProbe.new
177
- Appsignal::Minutely.probes.register :my_probe, probe
221
+ Appsignal::Probes.register :my_probe, probe
178
222
  expect do
179
- Appsignal::Minutely.start
223
+ Appsignal::Probes.start
180
224
  end.to change { alive_thread_counter.call }.by(1)
181
225
 
182
226
  wait_for("enough probe calls") { probe.calls >= 2 }
183
- expect(Appsignal::Minutely).to have_received(:initial_wait_time).once
184
- expect(Appsignal::Minutely).to have_received(:wait_time).at_least(:once)
227
+ expect(Appsignal::Probes).to have_received(:initial_wait_time).once
228
+ expect(Appsignal::Probes).to have_received(:wait_time).at_least(:once)
185
229
  expect(log).to contains_log(:debug, "Gathering minutely metrics with 1 probe")
186
230
  expect(log).to contains_log(:debug, "Gathering minutely metrics with 'my_probe' probe")
187
231
 
188
232
  # Starting twice in this spec, so expecting it more than once
189
- expect(Appsignal::Minutely).to have_received(:initial_wait_time).once
233
+ expect(Appsignal::Probes).to have_received(:initial_wait_time).once
190
234
  expect do
191
235
  # Fetch old thread
192
- thread = Appsignal::Minutely.instance_variable_get(:@thread)
193
- Appsignal::Minutely.start
236
+ thread = Appsignal::Probes.instance_variable_get(:@thread)
237
+ Appsignal::Probes.start
194
238
  thread&.join # Wait for old thread to exit
195
239
  end.to_not(change { alive_thread_counter.call })
196
240
  end
241
+
242
+ context "with thread already started" do
243
+ before do
244
+ allow(Appsignal::Probes).to receive(:initial_wait_time).and_return(0.00001)
245
+ end
246
+
247
+ it "auto starts probes added after the thread is started" do
248
+ Appsignal::Probes.start
249
+ wait_for("Probes thread to start") { Appsignal::Probes.started? }
250
+
251
+ calls = 0
252
+ probe = lambda { calls += 1 }
253
+ Appsignal::Probes.register :late_probe, probe
254
+
255
+ wait_for("enough probe calls") { calls >= 2 }
256
+ expect(log).to contains_log(:debug, "Gathering minutely metrics with 1 probe")
257
+ expect(log).to contains_log(:debug, "Gathering minutely metrics with 'late_probe' probe")
258
+ end
259
+ end
260
+ end
261
+
262
+ describe ".unregister" do
263
+ let(:log_stream) { StringIO.new }
264
+ let(:log) { log_contents(log_stream) }
265
+ before do
266
+ Appsignal.internal_logger = test_logger(log_stream)
267
+ speed_up_tests!
268
+ end
269
+
270
+ it "does not call the initialized probe after unregistering" do
271
+ probe1_calls = 0
272
+ probe2_calls = 0
273
+ probe1 = lambda { probe1_calls += 1 }
274
+ probe2 = lambda { probe2_calls += 1 }
275
+ Appsignal::Probes.register :probe1, probe1
276
+ Appsignal::Probes.register :probe2, probe2
277
+ Appsignal::Probes.start
278
+ wait_for("enough probe1 calls") { probe1_calls >= 2 }
279
+ wait_for("enough probe2 calls") { probe2_calls >= 2 }
280
+
281
+ Appsignal::Probes.unregister :probe2
282
+ probe1_calls = 0
283
+ probe2_calls = 0
284
+ # Check the probe 1 calls to make sure the probes have been called before
285
+ # testing if the unregistered probe has not been called
286
+ wait_for("enough probe1 calls") { probe1_calls >= 2 }
287
+ expect(probe2_calls).to eq(0)
288
+ end
197
289
  end
198
290
 
199
291
  describe ".stop" do
200
292
  before do
201
- allow(Appsignal::Minutely).to receive(:initial_wait_time).and_return(0.001)
293
+ allow(Appsignal::Probes).to receive(:initial_wait_time).and_return(0.001)
202
294
  end
203
295
 
204
296
  it "stops the minutely thread" do
205
- Appsignal::Minutely.start
206
- thread = Appsignal::Minutely.instance_variable_get(:@thread)
297
+ Appsignal::Probes.start
298
+ thread = Appsignal::Probes.instance_variable_get(:@thread)
207
299
  expect(%w[sleep run]).to include(thread.status)
208
- Appsignal::Minutely.stop
300
+ Appsignal::Probes.stop
209
301
  thread.join
210
302
  expect(thread.status).to eql(false)
211
303
  end
212
304
 
213
305
  it "clears the probe instances array" do
214
- Appsignal::Minutely.probes.register :my_probe, lambda {}
215
- Appsignal::Minutely.start
216
- thread = Appsignal::Minutely.instance_variable_get(:@thread)
306
+ Appsignal::Probes.register :my_probe, lambda {}
307
+ Appsignal::Probes.start
308
+ thread = Appsignal::Probes.instance_variable_get(:@thread)
217
309
  wait_for("probes initialized") do
218
- !Appsignal::Minutely.send(:probe_instances).empty?
310
+ !Appsignal::Probes.send(:probe_instances).empty?
219
311
  end
220
- expect(Appsignal::Minutely.send(:probe_instances)).to_not be_empty
221
- Appsignal::Minutely.stop
312
+ expect(Appsignal::Probes.send(:probe_instances)).to_not be_empty
313
+ Appsignal::Probes.stop
222
314
  thread.join
223
- expect(Appsignal::Minutely.send(:probe_instances)).to be_empty
315
+ expect(Appsignal::Probes.send(:probe_instances)).to be_empty
224
316
  end
225
317
  end
226
318
 
@@ -228,7 +320,7 @@ describe Appsignal::Minutely do
228
320
  it "gets the time to the next minute" do
229
321
  time = Time.new(2019, 4, 9, 12, 0, 20)
230
322
  Timecop.freeze time do
231
- expect(Appsignal::Minutely.wait_time).to eq 40
323
+ expect(Appsignal::Probes.wait_time).to eq 40
232
324
  end
233
325
  end
234
326
  end
@@ -238,7 +330,7 @@ describe Appsignal::Minutely do
238
330
  it "waits for the number of seconds + 60" do
239
331
  time = Time.new(2019, 4, 9, 12, 0, 31)
240
332
  Timecop.freeze time do
241
- expect(Appsignal::Minutely.send(:initial_wait_time)).to eql(29 + 60)
333
+ expect(Appsignal::Probes.send(:initial_wait_time)).to eql(29 + 60)
242
334
  end
243
335
  end
244
336
  end
@@ -247,29 +339,29 @@ describe Appsignal::Minutely do
247
339
  it "waits the remaining seconds in the minute" do
248
340
  time = Time.new(2019, 4, 9, 12, 0, 29)
249
341
  Timecop.freeze time do
250
- expect(Appsignal::Minutely.send(:initial_wait_time)).to eql(31)
342
+ expect(Appsignal::Probes.send(:initial_wait_time)).to eql(31)
251
343
  end
252
344
  end
253
345
  end
254
346
  end
255
347
 
256
- describe Appsignal::Minutely::ProbeCollection do
348
+ describe Appsignal::Probes::ProbeCollection do
257
349
  let(:collection) { described_class.new }
258
350
 
259
351
  describe "#count" do
260
352
  it "returns how many probes are registered" do
261
353
  expect(collection.count).to eql(0)
262
- collection.register :my_probe_1, lambda {}
354
+ collection.internal_register :my_probe_1, lambda {}
263
355
  expect(collection.count).to eql(1)
264
- collection.register :my_probe_2, lambda {}
356
+ collection.internal_register :my_probe_2, lambda {}
265
357
  expect(collection.count).to eql(2)
266
358
  end
267
359
  end
268
360
 
269
361
  describe "#clear" do
270
362
  it "clears the list of probes" do
271
- collection.register :my_probe_1, lambda {}
272
- collection.register :my_probe_2, lambda {}
363
+ collection.internal_register :my_probe_1, lambda {}
364
+ collection.internal_register :my_probe_2, lambda {}
273
365
  expect(collection.count).to eql(2)
274
366
  collection.clear
275
367
  expect(collection.count).to eql(0)
@@ -279,27 +371,65 @@ describe Appsignal::Minutely do
279
371
  describe "#[]" do
280
372
  it "returns the probe for that name" do
281
373
  probe = lambda {}
282
- collection.register :my_probe, probe
374
+ collection.internal_register :my_probe, probe
283
375
  expect(collection[:my_probe]).to eql(probe)
284
376
  end
285
377
  end
286
378
 
287
379
  describe "#register" do
380
+ it "adds the probe by key" do
381
+ expect(Appsignal::Probes).to receive(:probes).and_return(collection)
382
+
383
+ probe = lambda {}
384
+ silence { collection.register :my_probe, probe }
385
+ expect(collection[:my_probe]).to eql(probe)
386
+ end
387
+
388
+ context "logger" do
389
+ let(:log_stream) { std_stream }
390
+ let(:log) { log_contents(log_stream) }
391
+
392
+ around { |example| use_logger_with(log_stream) { example.run } }
393
+ it "logs a deprecation message" do
394
+ silence { collection.register :my_probe, lambda {} }
395
+ expect(log).to contains_log :warn,
396
+ "The method 'Appsignal::Probes.probes.register' is deprecated. " \
397
+ "Use 'Appsignal::Probes.register' instead."
398
+ end
399
+ end
400
+
401
+ context "stderr" do
402
+ let(:err_stream) { std_stream }
403
+ let(:stderr) { err_stream.read }
404
+
405
+ it "prints a deprecation warning" do
406
+ capture_std_streams(std_stream, err_stream) do
407
+ collection.register :my_probe, lambda {}
408
+ end
409
+ deprecation_message =
410
+ "The method 'Appsignal::Probes.probes.register' is deprecated. " \
411
+ "Use 'Appsignal::Probes.register' instead."
412
+ expect(stderr).to include("appsignal WARNING: #{deprecation_message}")
413
+ end
414
+ end
415
+ end
416
+
417
+ describe "#internal_register" do
288
418
  let(:log_stream) { std_stream }
289
419
  let(:log) { log_contents(log_stream) }
290
420
  before { Appsignal.internal_logger = test_logger(log_stream) }
291
421
 
292
- it "adds the by key probe" do
422
+ it "adds the probe by key" do
293
423
  probe = lambda {}
294
- collection.register :my_probe, probe
424
+ collection.internal_register :my_probe, probe
295
425
  expect(collection[:my_probe]).to eql(probe)
296
426
  end
297
427
 
298
428
  context "when a probe is already registered with the same key" do
299
429
  it "logs a debug message" do
300
430
  probe = lambda {}
301
- collection.register :my_probe, probe
302
- collection.register :my_probe, probe
431
+ collection.internal_register :my_probe, probe
432
+ collection.internal_register :my_probe, probe
303
433
  expect(log).to contains_log :debug, "A probe with the name " \
304
434
  "`my_probe` is already registered. Overwriting the entry " \
305
435
  "with the new probe."
@@ -308,10 +438,23 @@ describe Appsignal::Minutely do
308
438
  end
309
439
  end
310
440
 
441
+ describe "#unregister" do
442
+ it "removes the probe from the collection" do
443
+ expect(Appsignal::Probes).to receive(:probes).and_return(collection)
444
+
445
+ probe = lambda {}
446
+ silence { collection.register :my_probe, probe }
447
+ expect(collection[:my_probe]).to eql(probe)
448
+
449
+ silence { collection.unregister :my_probe }
450
+ expect(collection[:my_probe]).to be_nil
451
+ end
452
+ end
453
+
311
454
  describe "#each" do
312
455
  it "loops over the registered probes" do
313
456
  probe = lambda {}
314
- collection.register :my_probe, probe
457
+ collection.internal_register :my_probe, probe
315
458
  list = []
316
459
  collection.each do |name, p|
317
460
  list << [name, p]
@@ -320,4 +463,10 @@ describe Appsignal::Minutely do
320
463
  end
321
464
  end
322
465
  end
466
+
467
+ # Speed up test time by decreasing wait times in the probes mechanism
468
+ def speed_up_tests!
469
+ allow(Appsignal::Probes).to receive(:initial_wait_time).and_return(0.001)
470
+ allow(Appsignal::Probes).to receive(:wait_time).and_return(0.001)
471
+ end
323
472
  end
@@ -87,7 +87,7 @@ describe Appsignal do
87
87
  end
88
88
 
89
89
  it "should start minutely" do
90
- expect(Appsignal::Minutely).to receive(:start)
90
+ expect(Appsignal::Probes).to receive(:start)
91
91
  Appsignal.start
92
92
  end
93
93
  end
@@ -98,7 +98,7 @@ describe Appsignal do
98
98
  end
99
99
 
100
100
  it "should not start minutely" do
101
- expect(Appsignal::Minutely).to_not receive(:start)
101
+ expect(Appsignal::Probes).to_not receive(:start)
102
102
  Appsignal.start
103
103
  end
104
104
  end
@@ -151,13 +151,20 @@ describe Appsignal do
151
151
  end
152
152
 
153
153
  describe ".stop" do
154
- it "should call stop on the extension" do
154
+ it "calls stop on the extension" do
155
155
  expect(Appsignal.internal_logger).to receive(:debug).with("Stopping appsignal")
156
156
  expect(Appsignal::Extension).to receive(:stop)
157
157
  Appsignal.stop
158
158
  expect(Appsignal.active?).to be_falsy
159
159
  end
160
160
 
161
+ it "stops the minutely probes" do
162
+ Appsignal::Probes.start
163
+ expect(Appsignal::Probes.started?).to be_truthy
164
+ Appsignal.stop
165
+ expect(Appsignal::Probes.started?).to be_falsy
166
+ end
167
+
161
168
  context "with context specified" do
162
169
  it "should log the context" do
163
170
  expect(Appsignal.internal_logger).to receive(:debug).with("Stopping appsignal (something)")
@@ -1121,7 +1128,14 @@ describe Appsignal do
1121
1128
  let(:log_path) { File.join(tmp_dir, "log") }
1122
1129
  let(:log_file) { File.join(log_path, "appsignal.log") }
1123
1130
 
1124
- before { FileUtils.mkdir_p(log_path) }
1131
+ before do
1132
+ FileUtils.mkdir_p(log_path)
1133
+ # Clear state from previous test
1134
+ Appsignal.internal_logger = nil
1135
+ if Appsignal.instance_variable_defined?(:@in_memory_log)
1136
+ Appsignal.remove_instance_variable(:@in_memory_log)
1137
+ end
1138
+ end
1125
1139
  after { FileUtils.rm_rf(log_path) }
1126
1140
 
1127
1141
  def initialize_config
@@ -1130,6 +1144,7 @@ describe Appsignal do
1130
1144
  :log_path => log_path
1131
1145
  )
1132
1146
  Appsignal.internal_logger.error("Log in memory")
1147
+ expect(Appsignal.in_memory_log.string).to_not be_empty
1133
1148
  end
1134
1149
 
1135
1150
  context "when the log path is writable" do
@@ -1154,6 +1169,10 @@ describe Appsignal do
1154
1169
  it "amends in memory log to log file" do
1155
1170
  expect(log_file_contents).to include "[ERROR] appsignal: Log in memory"
1156
1171
  end
1172
+
1173
+ it "clears the in memory log after writing to the new logger" do
1174
+ expect(Appsignal.in_memory_log.string).to be_empty
1175
+ end
1157
1176
  end
1158
1177
 
1159
1178
  context "when the log file is not writable" do
@@ -1178,8 +1197,11 @@ describe Appsignal do
1178
1197
  expect(output).to include "[ERROR] appsignal: Log in memory"
1179
1198
  end
1180
1199
 
1200
+ it "clears the in memory log after writing to the new logger" do
1201
+ expect(Appsignal.in_memory_log.string).to be_empty
1202
+ end
1203
+
1181
1204
  it "outputs a warning" do
1182
- puts output
1183
1205
  expect(output).to include \
1184
1206
  "[WARN] appsignal: Unable to start internal logger with log path '#{log_file}'.",
1185
1207
  "[WARN] appsignal: Permission denied"
@@ -1237,6 +1259,10 @@ describe Appsignal do
1237
1259
  it "amends in memory log to stdout" do
1238
1260
  expect(output).to include "[ERROR] appsignal: Log in memory"
1239
1261
  end
1262
+
1263
+ it "clears the in memory log after writing to the new logger" do
1264
+ expect(Appsignal.in_memory_log.string).to be_empty
1265
+ end
1240
1266
  end
1241
1267
 
1242
1268
  describe "#logger#level" do
@@ -32,10 +32,14 @@ RSpec.describe "Puma plugin" do
32
32
  # StatsD server used for these tests.
33
33
  # Open a UDPSocket and listen for messages sent by the AppSignal Puma plugin.
34
34
  class StatsdServer
35
+ def initialize(statsd_port)
36
+ @statsd_port = statsd_port
37
+ end
38
+
35
39
  def start
36
40
  stop
37
41
  @socket = UDPSocket.new
38
- @socket.bind("127.0.0.1", 8125)
42
+ @socket.bind("127.0.0.1", @statsd_port)
39
43
 
40
44
  loop do
41
45
  # Listen for messages and track them on the messages Array.
@@ -115,13 +119,15 @@ RSpec.describe "Puma plugin" do
115
119
 
116
120
  def run_plugin(stats_data, plugin, &block)
117
121
  Puma._set_stats = stats_data
118
- @statsd = StatsdServer.new
122
+ ENV["APPSIGNAL_STATSD_PORT"] = "8126"
123
+ @statsd = StatsdServer.new(ENV.fetch("APPSIGNAL_STATSD_PORT"))
119
124
  @server_thread = Thread.new { @statsd.start }
120
125
  @server_thread.abort_on_exception = true
121
126
  @client_thread = Thread.new { start_plugin(plugin) }
122
127
  @client_thread.abort_on_exception = true
123
128
  wait_for(:puma_client_wait, &block)
124
129
  ensure
130
+ ENV["APPSIGNAL_STATSD_PORT"] = nil
125
131
  Puma._set_stats = nil
126
132
  # Stop all threads in test and stop listening on the UDPSocket
127
133
  @client_thread.kill if defined?(@client_thread) && @client_thread
data/spec/spec_helper.rb CHANGED
@@ -171,11 +171,11 @@ RSpec.configure do |config|
171
171
  def stop_minutely_probes
172
172
  thread =
173
173
  begin
174
- Appsignal::Minutely.class_variable_get(:@@thread) # Fetch old thread
174
+ Appsignal::Probes.class_variable_get(:@@thread) # Fetch old thread
175
175
  rescue NameError
176
176
  nil
177
177
  end
178
- Appsignal::Minutely.stop
178
+ Appsignal::Probes.stop
179
179
  thread&.join # Wait for old thread to exit
180
180
  end
181
181
  end
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.7.0
4
+ version: 3.7.1
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-04-22 00:00:00.000000000 Z
13
+ date: 2024-04-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -277,7 +277,6 @@ files:
277
277
  - lib/appsignal/integrations/webmachine.rb
278
278
  - lib/appsignal/logger.rb
279
279
  - lib/appsignal/marker.rb
280
- - lib/appsignal/minutely.rb
281
280
  - lib/appsignal/probes.rb
282
281
  - lib/appsignal/probes/gvl.rb
283
282
  - lib/appsignal/probes/helpers.rb
@@ -293,12 +292,12 @@ files:
293
292
  - lib/appsignal/transmitter.rb
294
293
  - lib/appsignal/utils.rb
295
294
  - lib/appsignal/utils/data.rb
296
- - lib/appsignal/utils/deprecation_message.rb
297
295
  - lib/appsignal/utils/hash_sanitizer.rb
298
296
  - lib/appsignal/utils/integration_logger.rb
299
297
  - lib/appsignal/utils/json.rb
300
298
  - lib/appsignal/utils/query_params_sanitizer.rb
301
299
  - lib/appsignal/utils/rails_helper.rb
300
+ - lib/appsignal/utils/stdout_and_logger_message.rb
302
301
  - lib/appsignal/version.rb
303
302
  - lib/puma/plugin/appsignal.rb
304
303
  - lib/sequel/extensions/appsignal_integration.rb
@@ -378,10 +377,10 @@ files:
378
377
  - spec/lib/appsignal/integrations/webmachine_spec.rb
379
378
  - spec/lib/appsignal/logger_spec.rb
380
379
  - spec/lib/appsignal/marker_spec.rb
381
- - spec/lib/appsignal/minutely_spec.rb
382
380
  - spec/lib/appsignal/probes/gvl_spec.rb
383
381
  - spec/lib/appsignal/probes/mri_spec.rb
384
382
  - spec/lib/appsignal/probes/sidekiq_spec.rb
383
+ - spec/lib/appsignal/probes_spec.rb
385
384
  - spec/lib/appsignal/rack/generic_instrumentation_spec.rb
386
385
  - spec/lib/appsignal/rack/rails_instrumentation_spec.rb
387
386
  - spec/lib/appsignal/rack/sinatra_instrumentation_spec.rb
@@ -467,7 +466,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
467
466
  - !ruby/object:Gem::Version
468
467
  version: '0'
469
468
  requirements: []
470
- rubygems_version: 3.3.7
469
+ rubygems_version: 3.5.9
471
470
  signing_key:
472
471
  specification_version: 4
473
472
  summary: Logs performance and exception data from your app to appsignal.com