Skip to content

Commit b70ee3c

Browse files
authored
Merge pull request #154 from bquorning/consistent-logging
Consistent logging
2 parents e8e3626 + 7882d37 commit b70ee3c

File tree

8 files changed

+96
-92
lines changed

8 files changed

+96
-92
lines changed

docs/CONFIGURATION.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ spawning the original workers.
325325

326326
```ruby
327327
after_monitor_ready do |server|
328-
server.logger.info("Monitor pid=#{Process.pid} ready")
328+
server.logger.info("monitor pid=#{Process.pid} ready")
329329
end
330330
```
331331

lib/pitchfork/configurator.rb

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,17 @@ class Configurator
4141
:worker_processes => 1,
4242
:before_fork => nil,
4343
:after_worker_fork => lambda { |server, worker|
44-
server.logger.info("worker=#{worker.nr} gen=#{worker.generation} pid=#{$$} spawned")
44+
server.logger.info("#{worker.to_log} spawned")
4545
},
4646
:after_mold_fork => lambda { |server, worker|
47-
server.logger.info("mold gen=#{worker.generation} pid=#{$$} spawned")
47+
server.logger.info("#{worker.to_log} spawned")
4848
},
4949
:before_worker_exit => nil,
5050
:after_worker_exit => lambda { |server, worker, status|
5151
m = if worker.nil?
52-
"repead unknown process (#{status.inspect})"
53-
elsif worker.mold?
54-
"mold pid=#{worker.pid rescue 'unknown'} gen=#{worker.generation rescue 'unknown'} reaped (#{status.inspect})"
55-
elsif worker.service?
56-
"service pid=#{worker.pid rescue 'unknown'} gen=#{worker.generation rescue 'unknown'} reaped (#{status.inspect})"
52+
"reaped unknown process (#{status.inspect})"
5753
else
58-
"worker=#{worker.nr rescue 'unknown'} pid=#{worker.pid rescue 'unknown'} gen=#{worker.generation rescue 'unknown'} reaped (#{status.inspect})"
54+
"#{worker.to_log} reaped (#{status.inspect})"
5955
end
6056
if status.success?
6157
server.logger.info(m)
@@ -64,10 +60,10 @@ class Configurator
6460
end
6561
},
6662
:after_worker_ready => lambda { |server, worker|
67-
server.logger.info("worker=#{worker.nr} gen=#{worker.generation} ready")
63+
server.logger.info("#{worker.to_log} ready")
6864
},
6965
:after_monitor_ready => lambda { |server|
70-
server.logger.info("Monitor pid=#{Process.pid} ready")
66+
server.logger.info("monitor pid=#{Process.pid} ready")
7167
},
7268
:after_worker_timeout => nil,
7369
:after_worker_hard_timeout => nil,

lib/pitchfork/http_server.rb

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def inspect
5050

5151
def call(original_thread) # :nodoc:
5252
begin
53-
@server.logger.error("worker=#{@worker.nr} pid=#{@worker.pid} timed out, exiting")
53+
@server.logger.error("#{@worker.to_log} timed out, exiting")
5454
if @callback
5555
@callback.call(@server, @worker, Info.new(original_thread, @rack_env))
5656
end
@@ -363,19 +363,19 @@ def monitor_loop(sleep = true)
363363
when Message::WorkerSpawned
364364
worker = @children.update(message)
365365
# TODO: should we send a message to the worker to acknowledge?
366-
logger.info "worker=#{worker.nr} pid=#{worker.pid} gen=#{worker.generation} registered"
366+
logger.info "#{worker.to_log} registered"
367367
when Message::MoldSpawned
368368
new_mold = @children.update(message)
369-
logger.info("mold pid=#{new_mold.pid} gen=#{new_mold.generation} spawned")
369+
logger.info("#{new_mold.to_log} spawned")
370370
when Message::ServiceSpawned
371371
new_service = @children.update(message)
372-
logger.info("service pid=#{new_service.pid} gen=#{new_service.generation} spawned")
372+
logger.info("#{new_service.to_log} spawned")
373373
when Message::MoldReady
374374
old_molds = @children.molds
375375
new_mold = @children.update(message)
376-
logger.info("mold pid=#{new_mold.pid} gen=#{new_mold.generation} ready")
376+
logger.info("#{new_mold.to_log} ready")
377377
old_molds.each do |old_mold|
378-
logger.info("Terminating old mold pid=#{old_mold.pid} gen=#{old_mold.generation}")
378+
logger.info("Terminating old #{old_mold.to_log}")
379379
old_mold.soft_kill(:TERM)
380380
end
381381
else
@@ -413,7 +413,7 @@ def stop(graceful = true)
413413
end
414414

415415
def worker_exit(worker)
416-
logger.info "worker=#{worker.nr} pid=#{worker.pid} gen=#{worker.generation} exiting"
416+
logger.info "#{worker.to_log} exiting"
417417
proc_name status: "exiting"
418418

419419
if @before_worker_exit
@@ -427,7 +427,7 @@ def worker_exit(worker)
427427
end
428428

429429
def service_exit(service)
430-
logger.info "service pid=#{service.pid} gen=#{service.generation} exiting"
430+
logger.info "#{service.to_log} exiting"
431431
proc_name status: "exiting"
432432

433433
if @before_service_worker_exit
@@ -548,11 +548,7 @@ def hard_timeout(child)
548548
end
549549
end
550550

551-
if child.mold?
552-
logger.error "mold pid=#{child.pid} gen=#{child.generation} timed out, killing"
553-
else
554-
logger.error "worker=#{child.nr} pid=#{child.pid} gen=#{child.generation} timed out, killing"
555-
end
551+
logger.error "#{child.to_log} timed out, killing"
556552
@children.hard_kill(@timeout_signal.call(child.pid), child) # take no prisoners for hard timeout violations
557553
end
558554

@@ -583,7 +579,7 @@ def after_fork_internal
583579
end
584580

585581
def spawn_worker(worker, detach:)
586-
logger.info("worker=#{worker.nr} gen=#{worker.generation} spawning...")
582+
logger.info("#{worker.to_log} spawning...")
587583

588584
# We set the deadline before spawning the child so that if for some
589585
# reason it gets stuck before reaching the worker loop,
@@ -646,7 +642,7 @@ def service_loop(service)
646642
end
647643

648644
def spawn_service(service, detach:)
649-
logger.info("service gen=#{service.generation} spawning...")
645+
logger.info("#{service.to_log} spawning...")
650646

651647
# We set the deadline before spawning the child so that if for some
652648
# reason it gets stuck before reaching the worker loop,
@@ -759,9 +755,9 @@ def restart_outdated_workers
759755
if service = @children.service
760756
if service.outdated?
761757
if service.soft_kill(:TERM)
762-
logger.info("Sent SIGTERM to service pid=#{service.pid} gen=#{service.generation}")
758+
logger.info("Sent SIGTERM to #{service.to_log}")
763759
else
764-
logger.info("Failed to send SIGTERM to service pid=#{service.pid} gen=#{service.generation}")
760+
logger.info("Failed to send SIGTERM to #{service.to_log}")
765761
end
766762
end
767763
end
@@ -770,10 +766,10 @@ def restart_outdated_workers
770766
outdated_workers = @children.workers.select { |w| !w.exiting? && w.generation < @children.mold.generation }
771767
outdated_workers.each do |worker|
772768
if worker.soft_kill(:TERM)
773-
logger.info("Sent SIGTERM to worker=#{worker.nr} pid=#{worker.pid} gen=#{worker.generation}")
769+
logger.info("Sent SIGTERM to #{worker.to_log}")
774770
workers_to_restart -= 1
775771
else
776-
logger.info("Failed to send SIGTERM to worker=#{worker.nr} pid=#{worker.pid} gen=#{worker.generation}")
772+
logger.info("Failed to send SIGTERM to #{worker.to_log}")
777773
end
778774
break if workers_to_restart <= 0
779775
end
@@ -985,7 +981,7 @@ def worker_loop(worker)
985981
if Info.fork_safe?
986982
spawn_mold(worker)
987983
else
988-
logger.error("worker=#{worker.nr} gen=#{worker.generation} is no longer fork safe, can't refork")
984+
logger.error("#{worker.to_log} is no longer fork safe, can't refork")
989985
end
990986
when Message
991987
worker.update(client)
@@ -1005,7 +1001,7 @@ def worker_loop(worker)
10051001
if @refork_condition.met?(worker, logger)
10061002
proc_name status: "requests: #{worker.requests_count}, spawning mold"
10071003
if spawn_mold(worker)
1008-
logger.info("worker=#{worker.nr} gen=#{worker.generation} Refork condition met, promoting ourselves")
1004+
logger.info("#{worker.to_log} refork condition met, promoting ourselves")
10091005
end
10101006
@refork_condition.backoff!
10111007
end
@@ -1068,11 +1064,11 @@ def mold_loop(mold)
10681064
spawn_worker(Worker.new(message.nr, generation: mold.generation), detach: true)
10691065
rescue ForkFailure
10701066
if retries > 0
1071-
@logger.fatal("mold pid=#{mold.pid} gen=#{mold.generation} Failed to spawn a worker. Retrying.")
1067+
@logger.fatal("#{mold.to_log} failed to spawn a worker, retrying")
10721068
retries -= 1
10731069
retry
10741070
else
1075-
@logger.fatal("mold pid=#{mold.pid} gen=#{mold.generation} Failed to spawn a worker twice in a row. Corrupted mold process?")
1071+
@logger.fatal("#{mold.to_log} failed to spawn a worker twice in a row - corrupted mold process?")
10761072
Process.exit(1)
10771073
end
10781074
rescue => error
@@ -1084,11 +1080,11 @@ def mold_loop(mold)
10841080
spawn_service(Service.new(generation: mold.generation), detach: true)
10851081
rescue ForkFailure
10861082
if retries > 0
1087-
@logger.fatal("mold pid=#{mold.pid} gen=#{mold.generation} Failed to spawn a service. Retrying.")
1083+
@logger.fatal("#{mold.to_log} failed to spawn a service, retrying")
10881084
retries -= 1
10891085
retry
10901086
else
1091-
@logger.fatal("mold pid=#{mold.pid} gen=#{mold.generation} Failed to spawn a service twice in a row. Corrupted mold process?")
1087+
@logger.fatal("#{mold.to_log} failed to spawn a service twice in a row - corrupted mold process?")
10921088
Process.exit(1)
10931089
end
10941090
rescue => error

lib/pitchfork/refork_condition.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ def met?(worker, logger)
1919
if worker.requests_count >= limit
2020
return false if backoff?
2121

22-
logger.info("worker=#{worker.nr} pid=#{worker.pid} processed #{worker.requests_count} requests, triggering a refork")
22+
logger.info("#{worker.to_log} processed #{worker.requests_count} requests, triggering a refork")
2323
return true
2424
end
2525
end

lib/pitchfork/worker.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,14 @@ def after_fork_in_child
208208
@master&.close
209209
end
210210

211+
def to_log
212+
if mold?
213+
pid ? "mold gen=#{generation} pid=#{pid}" : "mold gen=#{generation}"
214+
else
215+
pid ? "worker=#{nr} gen=#{generation} pid=#{pid}" : "worker=#{nr} gen=#{generation}"
216+
end
217+
end
218+
211219
private
212220

213221
def init_deadline
@@ -257,6 +265,10 @@ def register_to_master(control_socket)
257265
@master.close
258266
end
259267

268+
def to_log
269+
pid ? "service gen=#{generation} pid=#{pid}" : "service gen=#{generation}"
270+
end
271+
260272
private
261273

262274
def init_deadline

test/integration/test_boot.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ def test_boot_worker_stuck_in_spawn
104104

105105
assert_healthy("http://#{addr}:#{port}")
106106

107-
assert_stderr("worker=0 gen=0 ready")
108-
assert_stderr(/worker=1 pid=(\d+) gen=0 registered/)
109-
assert_stderr(/worker=1 pid=\d+ gen=0 timed out, killing/, timeout: 4)
107+
assert_stderr(/worker=0 gen=0 pid=\d+ ready/)
108+
assert_stderr(/worker=1 gen=0 pid=\d+ registered/)
109+
assert_stderr(/worker=1 gen=0 pid=\d+ timed out, killing/, timeout: 4)
110110

111111
assert_clean_shutdown(pid)
112112
end
@@ -126,14 +126,14 @@ def test_boot_worker_stuck_in_spawn
126126
RUBY
127127

128128
assert_healthy("http://#{addr}:#{port}")
129-
assert_stderr("worker=0 gen=0 ready")
130-
assert_stderr("worker=1 gen=0 ready")
129+
assert_stderr(/worker=0 gen=0 pid=\d+ ready/)
130+
assert_stderr(/worker=1 gen=0 pid=\d+ ready/)
131131

132132
Process.kill(:KILL, pid)
133133
Process.waitpid(pid)
134134

135-
assert_stderr(/worker=0 pid=(\d+) gen=0 exiting/, timeout: 5)
136-
assert_stderr(/worker=1 pid=(\d+) gen=0 exiting/)
135+
assert_stderr(/worker=0 gen=0 pid=(\d+) exiting/, timeout: 5)
136+
assert_stderr(/worker=1 gen=0 pid=(\d+) exiting/)
137137

138138
assert_raises Errno::ESRCH, Errno::ECHILD do
139139
25.times do

test/integration/test_info.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ def test_after_request_complete
1111
CONFIG
1212

1313
assert_healthy("http://#{addr}:#{port}")
14-
assert_stderr "worker=3 gen=0 ready"
14+
assert_stderr(/worker=3 gen=0 pid=\d+ ready/)
1515

1616
response = http_get("http://#{addr}:#{port}/")
1717
assert_equal({workers_count: 4, live_workers_count: 4}.inspect, response.body)
1818

1919
Process.kill(:TTOU, pid)
20-
assert_stderr(/worker=3 pid=\d+ gen=0 reaped/)
20+
assert_stderr(/worker=3 gen=0 pid=\d+ reaped/)
2121
Process.kill(:TTOU, pid)
22-
assert_stderr(/worker=2 pid=\d+ gen=0 reaped/)
22+
assert_stderr(/worker=2 gen=0 pid=\d+ reaped/)
2323

2424
response = http_get("http://#{addr}:#{port}/")
2525
assert_equal({workers_count: 4, live_workers_count: 2}.inspect, response.body)

0 commit comments

Comments
 (0)