Format and display extra VM statistics
This commit is contained in:
parent
4cdf1f7247
commit
2967c97f1a
|
@ -44,6 +44,23 @@ def format_bytes(size_bytes):
|
||||||
break
|
break
|
||||||
return human_bytes
|
return human_bytes
|
||||||
|
|
||||||
|
def format_metric(integer):
|
||||||
|
integer_unit_matrix = {
|
||||||
|
'': 1,
|
||||||
|
'K': 1000,
|
||||||
|
'M': 1000*1000,
|
||||||
|
'B': 1000*1000*1000,
|
||||||
|
'T': 1000*1000*1000*1000,
|
||||||
|
'Q': 1000*1000*1000*1000*1000
|
||||||
|
}
|
||||||
|
human_integer = '0'
|
||||||
|
for unit in sorted(integer_unit_matrix, key=integer_unit_matrix.get):
|
||||||
|
formatted_integer = int(math.ceil(integer / integer_unit_matrix[unit]))
|
||||||
|
if formatted_integer < 10000:
|
||||||
|
human_integer = '{}{}'.format(formatted_integer, unit)
|
||||||
|
break
|
||||||
|
return human_integer
|
||||||
|
|
||||||
class UploadProgressBar(object):
|
class UploadProgressBar(object):
|
||||||
def __init__(self, filename, end_message='', end_nl=True):
|
def __init__(self, filename, end_message='', end_nl=True):
|
||||||
file_size = os.path.getsize(filename)
|
file_size = os.path.getsize(filename)
|
||||||
|
|
|
@ -28,7 +28,7 @@ from collections import deque
|
||||||
|
|
||||||
import cli_lib.ansiprint as ansiprint
|
import cli_lib.ansiprint as ansiprint
|
||||||
import cli_lib.ceph as ceph
|
import cli_lib.ceph as ceph
|
||||||
from cli_lib.common import call_api
|
from cli_lib.common import call_api, format_bytes, format_metric
|
||||||
|
|
||||||
#
|
#
|
||||||
# Primary functions
|
# Primary functions
|
||||||
|
@ -348,6 +348,24 @@ def format_info(config, domain_information, long_output):
|
||||||
ainformation.append('{}Arch:{} {}'.format(ansiprint.purple(), ansiprint.end(), domain_information['arch']))
|
ainformation.append('{}Arch:{} {}'.format(ansiprint.purple(), ansiprint.end(), domain_information['arch']))
|
||||||
ainformation.append('{}Machine:{} {}'.format(ansiprint.purple(), ansiprint.end(), domain_information['machine']))
|
ainformation.append('{}Machine:{} {}'.format(ansiprint.purple(), ansiprint.end(), domain_information['machine']))
|
||||||
ainformation.append('{}Features:{} {}'.format(ansiprint.purple(), ansiprint.end(), ' '.join(domain_information['features'])))
|
ainformation.append('{}Features:{} {}'.format(ansiprint.purple(), ansiprint.end(), ' '.join(domain_information['features'])))
|
||||||
|
ainformation.append('')
|
||||||
|
ainformation.append('{0}Memory stats:{1} {2}Swap In Swap Out Faults (maj/min) Available Usable Unused RSS{3}'.format(ansiprint.purple(), ansiprint.end(), ansiprint.bold(), ansiprint.end()))
|
||||||
|
ainformation.append(' {0: <7} {1: <8} {2: <16} {3: <10} {4: <7} {5: <7} {6: <10}'.format(
|
||||||
|
format_metric(domain_information['memory_stats'].get('swap_in')),
|
||||||
|
format_metric(domain_information['memory_stats'].get('swap_out')),
|
||||||
|
'/'.join([format_metric(domain_information['memory_stats'].get('major_fault')), format_metric(domain_information['memory_stats'].get('minor_fault'))]),
|
||||||
|
format_bytes(domain_information['memory_stats'].get('available')*1024),
|
||||||
|
format_bytes(domain_information['memory_stats'].get('usable')*1024),
|
||||||
|
format_bytes(domain_information['memory_stats'].get('unused')*1024),
|
||||||
|
format_bytes(domain_information['memory_stats'].get('rss')*1024)
|
||||||
|
))
|
||||||
|
ainformation.append('')
|
||||||
|
ainformation.append('{0}vCPU stats:{1} {2}CPU time (ns) User time (ns) System time (ns){3}'.format(ansiprint.purple(), ansiprint.end(), ansiprint.bold(), ansiprint.end()))
|
||||||
|
ainformation.append(' {0: <16} {1: <16} {2: <15}'.format(
|
||||||
|
str(domain_information['vcpu_stats'].get('cpu_time')),
|
||||||
|
str(domain_information['vcpu_stats'].get('user_time')),
|
||||||
|
str(domain_information['vcpu_stats'].get('system_time'))
|
||||||
|
))
|
||||||
|
|
||||||
# PVC cluster information
|
# PVC cluster information
|
||||||
ainformation.append('')
|
ainformation.append('')
|
||||||
|
@ -419,13 +437,31 @@ def format_info(config, domain_information, long_output):
|
||||||
_name_length = len(disk['name']) + 1
|
_name_length = len(disk['name']) + 1
|
||||||
if _name_length > name_length:
|
if _name_length > name_length:
|
||||||
name_length = _name_length
|
name_length = _name_length
|
||||||
ainformation.append('{0}Disks:{1} {2}ID Type {3: <{width}} Dev Bus{4}'.format(ansiprint.purple(), ansiprint.end(), ansiprint.bold(), 'Name', ansiprint.end(), width=name_length))
|
ainformation.append('{0}Disks:{1} {2}ID Type {3: <{width}} Dev Bus Requests (r/w) Data (r/w){4}'.format(ansiprint.purple(), ansiprint.end(), ansiprint.bold(), 'Name', ansiprint.end(), width=name_length))
|
||||||
for disk in domain_information['disks']:
|
for disk in domain_information['disks']:
|
||||||
ainformation.append(' {0: <3} {1: <5} {2: <{width}} {3: <4} {4: <5}'.format(domain_information['disks'].index(disk), disk['type'], disk['name'], disk['dev'], disk['bus'], width=name_length))
|
ainformation.append(' {0: <3} {1: <5} {2: <{width}} {3: <4} {4: <5} {5: <15} {6}'.format(
|
||||||
|
domain_information['disks'].index(disk),
|
||||||
|
disk['type'],
|
||||||
|
disk['name'],
|
||||||
|
disk['dev'],
|
||||||
|
disk['bus'],
|
||||||
|
'/'.join([str(format_metric(disk['rd_req'])), str(format_metric(disk['wr_req']))]),
|
||||||
|
'/'.join([str(format_bytes(disk['rd_bytes'])), str(format_bytes(disk['wr_bytes']))]),
|
||||||
|
width=name_length
|
||||||
|
))
|
||||||
ainformation.append('')
|
ainformation.append('')
|
||||||
ainformation.append('{}Interfaces:{} {}ID Type Source Model MAC{}'.format(ansiprint.purple(), ansiprint.end(), ansiprint.bold(), ansiprint.end()))
|
ainformation.append('{}Interfaces:{} {}ID Type Source Model MAC Data (r/w) Packets (r/w) Errors (r/w){}'.format(ansiprint.purple(), ansiprint.end(), ansiprint.bold(), ansiprint.end()))
|
||||||
for net in domain_information['networks']:
|
for net in domain_information['networks']:
|
||||||
ainformation.append(' {0: <3} {1: <8} {2: <10} {3: <8} {4}'.format(domain_information['networks'].index(net), net['type'], net['source'], net['model'], net['mac']))
|
ainformation.append(' {0: <3} {1: <7} {2: <10} {3: <8} {4: <18} {5: <12} {6: <15} {7: <12}'.format(
|
||||||
|
domain_information['networks'].index(net),
|
||||||
|
net['type'],
|
||||||
|
net['source'],
|
||||||
|
net['model'],
|
||||||
|
net['mac'],
|
||||||
|
'/'.join([str(format_bytes(net['rd_bytes'])), str(format_bytes(net['wr_bytes']))]),
|
||||||
|
'/'.join([str(format_metric(net['rd_packets'])), str(format_metric(net['wr_packets']))]),
|
||||||
|
'/'.join([str(format_metric(net['rd_errors'])), str(format_metric(net['wr_errors']))]),
|
||||||
|
))
|
||||||
# Controller list
|
# Controller list
|
||||||
ainformation.append('')
|
ainformation.append('')
|
||||||
ainformation.append('{}Controllers:{} {}ID Type Model{}'.format(ansiprint.purple(), ansiprint.end(), ansiprint.bold(), ansiprint.end()))
|
ainformation.append('{}Controllers:{} {}ID Type Model{}'.format(ansiprint.purple(), ansiprint.end(), ansiprint.bold(), ansiprint.end()))
|
||||||
|
|
Loading…
Reference in New Issue