diff options
Diffstat (limited to 'src/pybind/mgr/iostat/module.py')
-rw-r--r-- | src/pybind/mgr/iostat/module.py | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/src/pybind/mgr/iostat/module.py b/src/pybind/mgr/iostat/module.py new file mode 100644 index 00000000..f5c3179d --- /dev/null +++ b/src/pybind/mgr/iostat/module.py @@ -0,0 +1,73 @@ + +from mgr_module import MgrModule + + +class Module(MgrModule): + COMMANDS = [ + { + "cmd": "iostat", + "desc": "Get IO rates", + "perm": "r", + "poll": "true" + }, + ] + + + def __init__(self, *args, **kwargs): + super(Module, self).__init__(*args, **kwargs) + + def self_test(self): + r = self.get('io_rate') + assert('pg_stats_delta' in r) + assert('stamp_delta' in r['pg_stats_delta']) + assert('stat_sum' in r['pg_stats_delta']) + assert('num_read_kb' in r['pg_stats_delta']['stat_sum']) + assert('num_write_kb' in r['pg_stats_delta']['stat_sum']) + assert('num_write' in r['pg_stats_delta']['stat_sum']) + assert('num_read' in r['pg_stats_delta']['stat_sum']) + + def handle_command(self, inbuf, command): + rd = 0 + wr = 0 + total = 0 + rd_ops = 0 + wr_ops = 0 + total_ops = 0 + ret = '' + + if command['prefix'] == 'iostat': + r = self.get('io_rate') + + stamp_delta = float(r['pg_stats_delta']['stamp_delta']) + if (stamp_delta > 0): + rd = int(r['pg_stats_delta']['stat_sum']['num_read_kb']) / stamp_delta + wr = int(r['pg_stats_delta']['stat_sum']['num_write_kb']) / stamp_delta + # The values are in kB, but to_pretty_iec() requires them to be in bytes + rd = int(rd) << 10 + wr = int(wr) << 10 + total = rd + wr + + rd_ops = int(r['pg_stats_delta']['stat_sum']['num_read']) / stamp_delta + wr_ops = int(r['pg_stats_delta']['stat_sum']['num_write']) / stamp_delta + total_ops = rd_ops + wr_ops + + if 'width' in command: + width = command['width'] + else: + width = 80 + + if command.get('print_header', False): + elems = ['Read', 'Write', 'Total', 'Read IOPS', 'Write IOPS', 'Total IOPS'] + ret += self.get_pretty_header(elems, width) + + elems = [ + self.to_pretty_iec(rd) + 'B/s', + self.to_pretty_iec(wr) + 'B/s', + self.to_pretty_iec(total) + 'B/s', + int(rd_ops), + int(wr_ops), + int(total_ops) + ] + ret += self.get_pretty_row(elems, width) + + return 0, '', ret |