class Kontena::Cli::Services::StatsCommand

Constants

MEM_MAX_LIMITS

Public Instance Methods

execute() click to toggle source
# File lib/kontena/cli/services/stats_command.rb, line 17
def execute
  require_api_url
  token = require_token
  if tail?
    system('clear')
    render_header
  end
  loop do
    fetch_stats(token, name, tail?)
    break unless tail?
    sleep(2)
  end
end

Private Instance Methods

fetch_stats(token, service_id, follow) click to toggle source
# File lib/kontena/cli/services/stats_command.rb, line 33
def fetch_stats(token, service_id, follow)
  result = client(token).get("services/#{parse_service_id(service_id)}/stats")
  system('clear') if follow
  render_header
  result['stats'].each do |stat|
    render_stat_row(stat)
  end
end
filesize_to_human(size) click to toggle source

@param [Integer] size @return [String]

# File lib/kontena/cli/services/stats_command.rb, line 69
def filesize_to_human(size)
  return '0B' if size.to_f == 0.0
  units = %w{B K M G T}
  e = (Math.log(size) / Math.log(1000)).floor
  s = '%.2f' % (size.to_f / 1000**e)
  s.sub(/\.?0*$/, units[e])
rescue FloatDomainError
  'N/A'
end
network_bytes(network, key) click to toggle source

@param [Hash] network @param [String] key @return [Integer]

# File lib/kontena/cli/services/stats_command.rb, line 83
def network_bytes(network, key)
  (network.dig('internal', key) || 0) + (network.dig('external', key) || 0)
end
render_header() click to toggle source
# File lib/kontena/cli/services/stats_command.rb, line 42
def render_header
  puts '%-30.30s %-15s %-20s %-15s %-15s' % ['INSTANCE', 'CPU %', 'MEM USAGE/LIMIT', 'MEM %', 'NET I/O']
end
render_stat_row(stat) click to toggle source
# File lib/kontena/cli/services/stats_command.rb, line 46
def render_stat_row(stat)
  memory = stat['memory'].nil? ? 'N/A' : filesize_to_human(stat['memory']['usage'])
  if !stat['memory'].nil? && (stat['memory']['limit'] && !MEM_MAX_LIMITS.include?(stat['memory']['limit']))
    memory_limit = filesize_to_human(stat['memory']['limit'])
    memory_pct = "#{(stat['memory']['usage'].to_f / stat['memory']['limit'].to_f * 100).round(2)}%"
  else
    memory_limit = 'N/A'
    memory_pct = 'N/A'
  end

  cpu = stat['cpu'].nil? ? 'N/A' : stat['cpu']['usage']

  network_in = stat['network'].nil? ? 'N/A' : filesize_to_human(network_bytes(stat['network'], 'rx_bytes'))
  network_out = stat['network'].nil? ? 'N/A' : filesize_to_human(network_bytes(stat['network'], 'tx_bytes'))

  prefix = self.name.split('/')[0]
  instance_name = stat['container_id'].gsub("#{prefix}-", "")
  puts '%-30.30s %-15s %-20s %-15s %-15s' % [ instance_name, "#{cpu}%", "#{memory} / #{memory_limit}", "#{memory_pct}", "#{network_in}/#{network_out}"]
end