puma-status 0.2 → 0.2.1

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.
Files changed (5) hide show
  1. checksums.yaml +4 -4
  2. data/lib/core.rb +38 -8
  3. data/lib/helpers.rb +2 -1
  4. data/lib/stats.rb +17 -1
  5. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 46a19b27c114c23f83f652c395c9157d2581a0c688a42c2784c3660bef0f3277
4
- data.tar.gz: 94a7a2cbee9aa0a082ddc38b61a32a4d2db3c3f8ad44a70b546a67b4a884dde8
3
+ metadata.gz: 379b1ab081684ba19977385c0bad2d6b1635d9fd56225a35b89698574281c832
4
+ data.tar.gz: 1e8db9d9acbe9a74e850c5ff214bd8258a5c6d748e1e662367003297c40d185a
5
5
  SHA512:
6
- metadata.gz: f3b70ede2ef3c33c2436efe7da75faa5e858c5042572d07d26204487ea61a60d31cd2f9497502a5f8ae00bf00ecbdae0ac5ea6bceba1bfeec28036e9e18dc39c
7
- data.tar.gz: f930e67b9deff2945d5f3a02c5635caf808b17a927527e533a3b7894e7b91ac59670c114c6fbb066a3be325fc9a78dc62cbfad12d26020a8e588b2a152d5e436
6
+ metadata.gz: 8f2f695e9b510c2dd0f3eb6f808e927dae5a596a69d1e7d8347617c6590e09d0c299c2f66f63574fe95da971fe85c780cea407da2ade8a5eb443230ebbdc22ff
7
+ data.tar.gz: d618f0c0bc28f4fdf6720b3e595269670967185bacbb5c754fde0e6bf863d37dbe5bb12692099bb25f15a46a634894b494a5bb5dba6c649a5771653862d8567d
data/lib/core.rb CHANGED
@@ -1,13 +1,28 @@
1
1
  require 'yaml'
2
2
  require 'json'
3
3
  require 'net_x/http_unix'
4
+ require 'openssl'
4
5
  require 'time'
5
6
  require_relative 'stats'
6
7
 
7
8
  def get_stats(state_file_path)
8
9
  puma_state = YAML.load_file(state_file_path)
9
10
 
10
- client = NetX::HTTPUnix.new(puma_state["control_url"])
11
+ uri = URI.parse(puma_state["control_url"])
12
+
13
+ address = if uri.scheme =~ /unix/i
14
+ [uri.scheme, '://', uri.host, uri.path].join
15
+ else
16
+ [uri.host, uri.path].join
17
+ end
18
+
19
+ client = NetX::HTTPUnix.new(address, uri.port)
20
+
21
+ if uri.scheme =~ /ssl/i
22
+ client.use_ssl = true
23
+ client.verify_mode = OpenSSL::SSL::VERIFY_NONE if ENV['SSL_NO_VERIFY'] == '1'
24
+ end
25
+
11
26
  req = Net::HTTP::Get.new("/stats?token=#{puma_state["control_auth_token"]}")
12
27
  resp = client.request(req)
13
28
  raw_stats = JSON.parse(resp.body)
@@ -36,8 +51,9 @@ def hydrate_stats(stats, puma_state, state_file_path)
36
51
 
37
52
  stats.tap do |s|
38
53
  stats.workers.map do |wstats|
39
- wstats.mem = top_stats[wstats.pid][:mem]
40
- wstats.pcpu = top_stats[wstats.pid][:pcpu]
54
+ wstats.mem = top_stats.dig(wstats.pid, :mem) || 0
55
+ wstats.pcpu = top_stats.dig(wstats.pid, :pcpu) || 0
56
+ wstats.killed = !top_stats.key?(wstats.pid) || (wstats.mem <=0 && wstats.pcpu <= 0)
41
57
  end
42
58
  end
43
59
  end
@@ -45,13 +61,27 @@ end
45
61
  def format_stats(stats)
46
62
  master_line = "#{stats.pid} (#{stats.state_file_path}) Uptime: #{seconds_to_human(stats.uptime)} "
47
63
  master_line += "| Phase: #{stats.phase} " if stats.phase
48
- master_line += "| Load: #{color(75, 50, stats.load, asciiThreadLoad(stats.running_threads, stats.max_threads))}"
64
+
65
+ if stats.booting?
66
+ master_line += warn("booting")
67
+ else
68
+ master_line += "| Load: #{color(75, 50, stats.load, asciiThreadLoad(stats.running_threads, stats.max_threads))}"
69
+ end
49
70
 
50
71
  output = [master_line] + stats.workers.map do |wstats|
51
- worker_line = " └ #{wstats.pid.to_s.rjust(5, ' ')} CPU: #{color(75, 50, wstats.pcpu, wstats.pcpu.to_s.rjust(5, ' '))}% Mem: #{color(1000, 750, wstats.mem, wstats.mem.to_s.rjust(4, ' '))} MB Uptime: #{seconds_to_human(wstats.uptime)} | Load: #{color(75, 50, wstats.load, asciiThreadLoad(wstats.running_threads, wstats.max_threads))}"
52
- worker_line += " #{("Queue: " + wstats.backlog.to_s).colorize(:red)}" if wstats.backlog > 0
53
- worker_line += " Last checkin: #{wstats.last_checkin}" if wstats.last_checkin >= 10
54
- worker_line += " Phase: #{wstats.phase}" if wstats.phase != stats.phase
72
+ worker_line = " └ #{wstats.pid.to_s.rjust(5, ' ')} CPU: #{color(75, 50, wstats.pcpu, wstats.pcpu.to_s.rjust(5, ' '))}% Mem: #{color(1000, 750, wstats.mem, wstats.mem.to_s.rjust(4, ' '))} MB Uptime: #{seconds_to_human(wstats.uptime)}"
73
+
74
+ if wstats.booting?
75
+ worker_line += " #{warn("booting")}"
76
+ elsif wstats.killed?
77
+ worker_line += " #{error("killed")}"
78
+ else
79
+ worker_line += " | Load: #{color(75, 50, wstats.load, asciiThreadLoad(wstats.running_threads, wstats.max_threads))}"
80
+ worker_line += " Phase: #{error(wstats.phase)}" if wstats.phase != stats.phase
81
+ worker_line += " Queue: #{error(wstats.backlog.to_s)}" if wstats.backlog > 0
82
+ worker_line += " Last checkin: #{error(wstats.last_checkin)}" if wstats.last_checkin >= 10
83
+ end
84
+
55
85
  worker_line
56
86
  end
57
87
 
data/lib/helpers.rb CHANGED
@@ -17,7 +17,8 @@ def colorize(str, color_name)
17
17
  str.to_s.colorize(color_name)
18
18
  end
19
19
 
20
- def color(critical, warn, value, str)
20
+ def color(critical, warn, value, str = nil)
21
+ str = value unless str
21
22
  color_level = if value >= critical
22
23
  :red
23
24
  elsif value < critical && value >= warn
data/lib/stats.rb CHANGED
@@ -9,6 +9,14 @@ class Stats
9
9
  @wstats['pid']
10
10
  end
11
11
 
12
+ def killed=(killed)
13
+ @wstats['killed'] = killed
14
+ end
15
+
16
+ def killed?
17
+ !!@wstats['killed']
18
+ end
19
+
12
20
  def mem=(mem)
13
21
  @wstats['mem'] = mem
14
22
  end
@@ -25,6 +33,10 @@ class Stats
25
33
  @wstats['pcpu']
26
34
  end
27
35
 
36
+ def booting?
37
+ @wstats.key?('last_status') && @wstats['last_status'].empty?
38
+ end
39
+
28
40
  def running
29
41
  @wstats.dig('last_status', 'running') || @wstats['running'] || 0
30
42
  end
@@ -71,7 +83,7 @@ class Stats
71
83
  end
72
84
 
73
85
  def workers
74
- (@stats['worker_status'] || [@stats]).map { |wstats| Worker.new(wstats) }
86
+ @workers ||= (@stats['worker_status'] || [@stats]).map { |wstats| Worker.new(wstats) }
75
87
  end
76
88
 
77
89
  def pid=(pid)
@@ -95,6 +107,10 @@ class Stats
95
107
  (Time.now - Time.parse(@stats['started_at'])).to_i
96
108
  end
97
109
 
110
+ def booting?
111
+ workers.all?(&:booting?)
112
+ end
113
+
98
114
  def total_threads
99
115
  workers.reduce(0) { |total, wstats| total + wstats.max_threads }
100
116
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puma-status
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.2'
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoann Lecuyer