instrumental_agent 3.0.0.beta → 3.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/instrumental/agent.rb +32 -18
- data/lib/instrumental/version.rb +1 -1
- data/spec/agent_spec.rb +35 -6
- data/spec/spec_helper.rb +9 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a86fe597ab71c9660d590e42ef37e0d9012a4f5adbe7742d265f3d20ffda1b9e
|
4
|
+
data.tar.gz: cd56273db7523852982b58162361359fc3c9fcd3b8cae19bf87387bf63fe26b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c68427fe4c900db650e45b46423c808263d86df275b9f49b44896973f4db3e25cd61b8fe9a0b67cba54acbe831b4c00a7cbfb8c7b7d6cc30959159e9e149d3dd
|
7
|
+
data.tar.gz: 57f5554f876c9311d76305c60b754af1c7d1a8bb63b8682355217b014b927e1d0f500bea37daff954d5149d4015b1be80793f9f2ed8f713928b4af4d428e576f
|
data/lib/instrumental/agent.rb
CHANGED
@@ -265,22 +265,22 @@ module Instrumental
|
|
265
265
|
logger.info "Cleaning up agent, aggregator_size: #{@aggregator_queue.size}, thread_running: #{@aggregator_thread.alive?}"
|
266
266
|
logger.info "Cleaning up agent, queue size: #{@sender_queue.size}, thread running: #{@sender_thread.alive?}"
|
267
267
|
@allow_reconnect = false
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
268
|
+
begin
|
269
|
+
with_timeout(EXIT_FLUSH_TIMEOUT) do
|
270
|
+
@aggregator_queue << ['exit']
|
271
|
+
@aggregator_thread.join
|
272
|
+
@sender_queue << ['exit']
|
273
|
+
@sender_thread.join
|
274
|
+
end
|
275
|
+
rescue Timeout::Error
|
276
|
+
total_size = @sender_queue&.size.to_i +
|
277
|
+
@aggregator_queue&.size.to_i +
|
278
|
+
@event_aggregator&.size.to_i
|
279
|
+
|
280
|
+
if total_size > 0
|
281
|
+
logger.error "Timed out working agent thread on exit, dropping #{total_size} metrics"
|
282
|
+
else
|
283
|
+
logger.error "Timed out Instrumental Agent, exiting"
|
284
284
|
end
|
285
285
|
end
|
286
286
|
end
|
@@ -413,13 +413,23 @@ module Instrumental
|
|
413
413
|
disconnect
|
414
414
|
address = ipv4_address_for_host(@host, @port)
|
415
415
|
if address
|
416
|
-
@pid
|
416
|
+
new_pid = if @pid != Process.pid
|
417
|
+
@pid = Process.pid
|
418
|
+
true
|
419
|
+
else
|
420
|
+
false
|
421
|
+
end
|
422
|
+
|
417
423
|
@sync_mutex = Mutex.new
|
418
424
|
@failures = 0
|
419
425
|
@sockaddr_in = Socket.pack_sockaddr_in(@port, address)
|
420
426
|
|
421
427
|
logger.info "Starting aggregator thread"
|
422
428
|
if !@aggregator_thread&.alive?
|
429
|
+
if new_pid
|
430
|
+
@event_aggregator = nil
|
431
|
+
@aggregator_queue = Queue.new
|
432
|
+
end
|
423
433
|
@aggregator_thread = Thread.new do
|
424
434
|
run_aggregator_loop
|
425
435
|
end
|
@@ -427,6 +437,7 @@ module Instrumental
|
|
427
437
|
|
428
438
|
if !@sender_thread&.alive?
|
429
439
|
logger.info "Starting sender thread"
|
440
|
+
@sender_queue = Queue.new if new_pid
|
430
441
|
@sender_thread = Thread.new do
|
431
442
|
run_sender_loop
|
432
443
|
end
|
@@ -492,9 +503,12 @@ module Instrumental
|
|
492
503
|
end
|
493
504
|
end
|
494
505
|
if command_and_args
|
495
|
-
sync_resource = command_options && command_options[:sync_resource]
|
496
506
|
case command_and_args
|
497
507
|
when 'exit'
|
508
|
+
if !@event_aggregator.nil?
|
509
|
+
@sender_queue << @event_aggregator
|
510
|
+
@event_aggregator = nil
|
511
|
+
end
|
498
512
|
logger.info "Exiting, #{@aggregator_queue.size} commands remain"
|
499
513
|
return true
|
500
514
|
when 'flush'
|
data/lib/instrumental/version.rb
CHANGED
data/spec/agent_spec.rb
CHANGED
@@ -636,20 +636,21 @@ shared_examples "Instrumental Agent" do
|
|
636
636
|
end
|
637
637
|
end
|
638
638
|
|
639
|
-
it "should
|
639
|
+
it "should follow normal exit procedures whether or not there are commands queued" do
|
640
640
|
allow(agent).to receive(:open_socket) { |*args, &block| sleep(5) && block.call }
|
641
|
-
with_constants('Instrumental::Agent::EXIT_FLUSH_TIMEOUT' =>
|
641
|
+
with_constants('Instrumental::Agent::EXIT_FLUSH_TIMEOUT' => 1) do
|
642
642
|
if (pid = fork { agent.increment('foo', 1); agent.sender_queue.clear })
|
643
643
|
tm = Time.now.to_f
|
644
644
|
Process.wait(pid)
|
645
645
|
diff = Time.now.to_f - tm
|
646
|
-
expect(diff).to be <
|
646
|
+
expect(diff).to be < 2
|
647
|
+
expect(diff).to be > 1
|
647
648
|
end
|
648
649
|
end
|
649
650
|
end
|
650
651
|
end
|
651
652
|
|
652
|
-
it "should not wait longer than EXIT_FLUSH_TIMEOUT to attempt flushing the socket when disconnecting" do
|
653
|
+
it "should not wait much longer than EXIT_FLUSH_TIMEOUT to attempt flushing the socket when disconnecting" do
|
653
654
|
agent.increment('foo', 1)
|
654
655
|
wait do
|
655
656
|
expect(server.commands.grep(/foo/).size).to eq(1)
|
@@ -665,12 +666,13 @@ shared_examples "Instrumental Agent" do
|
|
665
666
|
raise
|
666
667
|
end
|
667
668
|
end.join
|
668
|
-
end
|
669
|
+
end.at_least(1).times
|
670
|
+
|
669
671
|
with_constants('Instrumental::Agent::EXIT_FLUSH_TIMEOUT' => 3) do
|
670
672
|
tm = Time.now.to_f
|
671
673
|
agent.cleanup
|
672
674
|
diff = Time.now.to_f - tm
|
673
|
-
expect(diff).to be <= 3
|
675
|
+
expect(diff).to be <= 3.1
|
674
676
|
end
|
675
677
|
end
|
676
678
|
|
@@ -1097,6 +1099,33 @@ shared_examples "Instrumental Agent" do
|
|
1097
1099
|
end
|
1098
1100
|
end
|
1099
1101
|
end
|
1102
|
+
|
1103
|
+
if FORK_SUPPORTED
|
1104
|
+
it "should automatically reconnect when forked when aggregation is enabled" do
|
1105
|
+
Timecop.travel start_of_minute
|
1106
|
+
agent.frequency = 10
|
1107
|
+
|
1108
|
+
agent.increment('fork_reconnect_test1', 1, 0, 1)
|
1109
|
+
fork do
|
1110
|
+
agent.increment('fork_reconnect_test2', 1, 0, 1) # triggers reconnect
|
1111
|
+
exit
|
1112
|
+
end
|
1113
|
+
|
1114
|
+
|
1115
|
+
sleep 1
|
1116
|
+
agent.increment('fork_reconnect_test3', 1, 0, 1) # triggers reconnect
|
1117
|
+
|
1118
|
+
agent.flush
|
1119
|
+
expect(server.connect_count).to eq(2)
|
1120
|
+
|
1121
|
+
wait do
|
1122
|
+
expect(server.commands).to include("increment fork_reconnect_test1 1 0 1")
|
1123
|
+
expect(server.commands).to include("increment fork_reconnect_test2 1 0 1")
|
1124
|
+
expect(server.commands).to include("increment fork_reconnect_test3 1 0 1")
|
1125
|
+
expect(server.commands.grep(/fork_reconnect/).size).to eq(3)
|
1126
|
+
end
|
1127
|
+
end
|
1128
|
+
end
|
1100
1129
|
end
|
1101
1130
|
end
|
1102
1131
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -9,6 +9,15 @@ require 'test_server'
|
|
9
9
|
RSpec.configure do |config|
|
10
10
|
|
11
11
|
config.before(:all) do
|
12
|
+
# this is heavily threaded code with lots of really interesting
|
13
|
+
# comparison and matching. forcing rspec to load all its differs
|
14
|
+
# and matchers up front can save considerable time.
|
15
|
+
# Lazy loading these things can be so slow that it causes false
|
16
|
+
# failures in some tests.
|
17
|
+
begin
|
18
|
+
expect(1).to eq(2)
|
19
|
+
rescue Exception
|
20
|
+
end
|
12
21
|
end
|
13
22
|
|
14
23
|
config.before(:each) do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: instrumental_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0.0.
|
4
|
+
version: 3.0.0.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Expected Behavior
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-10-
|
11
|
+
date: 2020-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: metrician
|