diff options
author | nicolargo <nicolas@nicolargo.com> | 2023-12-21 15:53:27 +0100 |
---|---|---|
committer | nicolargo <nicolas@nicolargo.com> | 2023-12-21 15:53:27 +0100 |
commit | 70250981b9ebabd3212c9e3d01c1fced49e1a33e (patch) | |
tree | 09569f96e0a7c0dfa2cd851e597f96379964e8a4 /glances/plugins/diskio/model.py | |
parent | e936a38dde886f151d75977b4ec947a8f5da2259 (diff) | |
parent | 380888a5648d914439f9b221dfd5ce589b2ffd54 (diff) |
Merge branch 'develop' into issue2183issue2183
Diffstat (limited to 'glances/plugins/diskio/model.py')
-rw-r--r-- | glances/plugins/diskio/model.py | 230 |
1 files changed, 0 insertions, 230 deletions
diff --git a/glances/plugins/diskio/model.py b/glances/plugins/diskio/model.py deleted file mode 100644 index 3502b8a0..00000000 --- a/glances/plugins/diskio/model.py +++ /dev/null @@ -1,230 +0,0 @@ -# -*- coding: utf-8 -*- -# -# This file is part of Glances. -# -# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com> -# -# SPDX-License-Identifier: LGPL-3.0-only -# - -"""Disk I/O plugin.""" -from __future__ import unicode_literals - -from glances.globals import nativestr -from glances.timer import getTimeSinceLastUpdate -from glances.plugins.plugin.model import GlancesPluginModel - -import psutil - - -# Define the history items list -items_history_list = [ - {'name': 'read_bytes', 'description': 'Bytes read per second', 'y_unit': 'B/s'}, - {'name': 'write_bytes', 'description': 'Bytes write per second', 'y_unit': 'B/s'}, -] - - -class PluginModel(GlancesPluginModel): - """Glances disks I/O plugin. - - stats is a list - """ - - def __init__(self, args=None, config=None): - """Init the plugin.""" - super(PluginModel, self).__init__( - args=args, config=config, items_history_list=items_history_list, stats_init_value=[] - ) - - # We want to display the stat in the curse interface - self.display_curse = True - - # Hide stats if it has never been != 0 - if config is not None: - self.hide_zero = config.get_bool_value(self.plugin_name, 'hide_zero', default=False) - else: - self.hide_zero = False - self.hide_zero_fields = ['read_bytes', 'write_bytes'] - - # Force a first update because we need two update to have the first stat - self.update() - self.refresh_timer.set(0) - - def get_key(self): - """Return the key of the list.""" - return 'disk_name' - - @GlancesPluginModel._check_decorator - @GlancesPluginModel._log_result_decorator - def update(self): - """Update disk I/O stats using the input method.""" - # Init new stats - stats = self.get_init_value() - - if self.input_method == 'local': - # Update stats using the standard system lib - # Grab the stat using the psutil disk_io_counters method - # read_count: number of reads - # write_count: number of writes - # read_bytes: number of bytes read - # write_bytes: number of bytes written - # read_time: time spent reading from disk (in milliseconds) - # write_time: time spent writing to disk (in milliseconds) - try: - diskio = psutil.disk_io_counters(perdisk=True) - except Exception: - return stats - - # Previous disk IO stats are stored in the diskio_old variable - # By storing time data we enable Rx/s and Tx/s calculations in the - # XML/RPC API, which would otherwise be overly difficult work - # for users of the API - time_since_update = getTimeSinceLastUpdate('disk') - - diskio = diskio - for disk in diskio: - # By default, RamFS is not displayed (issue #714) - if self.args is not None and not self.args.diskio_show_ramfs and disk.startswith('ram'): - continue - - # Shall we display the stats ? - if not self.is_display(disk): - continue - - # Compute count and bit rate - try: - diskstat = { - 'time_since_update': time_since_update, - 'disk_name': disk, - 'read_count': diskio[disk].read_count - self.diskio_old[disk].read_count, - 'write_count': diskio[disk].write_count - self.diskio_old[disk].write_count, - 'read_bytes': diskio[disk].read_bytes - self.diskio_old[disk].read_bytes, - 'write_bytes': diskio[disk].write_bytes - self.diskio_old[disk].write_bytes, - } - except (KeyError, AttributeError): - diskstat = { - 'time_since_update': time_since_update, - 'disk_name': disk, - 'read_count': 0, - 'write_count': 0, - 'read_bytes': 0, - 'write_bytes': 0, - } - - # Add alias if exist (define in the configuration file) - if self.has_alias(disk) is not None: - diskstat['alias'] = self.has_alias(disk) - - # Add the dict key - diskstat['key'] = self.get_key() - - # Add the current disk stat to the list - stats.append(diskstat) - - # Save stats to compute next bitrate - try: - self.diskio_old = diskio - except (IOError, UnboundLocalError): - pass - elif self.input_method == 'snmp': - # Update stats using SNMP - # No standard way for the moment... - pass - - # Update the stats - self.stats = stats - - return self.stats - - def update_views(self): - """Update stats views.""" - # Call the father's method - super(PluginModel, self).update_views() - - # Check if the stats should be hidden - self.update_views_hidden() - - # Add specifics information - # Alert - for i in self.get_raw(): - disk_real_name = i['disk_name'] - self.views[i[self.get_key()]]['read_bytes']['decoration'] = self.get_alert( - int(i['read_bytes'] // i['time_since_update']), header=disk_real_name + '_rx' - ) - self.views[i[self.get_key()]]['write_bytes']['decoration'] = self.get_alert( - int(i['write_bytes'] // i['time_since_update']), header=disk_real_name + '_tx' - ) - - def msg_curse(self, args=None, max_width=None): - """Return the dict to display in the curse interface.""" - # Init the return message - ret = [] - - # Only process if stats exist and display plugin enable... - if not self.stats or self.is_disabled(): - return ret - - # Max size for the interface name - name_max_width = max_width - 13 - - # Header - msg = '{:{width}}'.format('DISK I/O', width=name_max_width) - ret.append(self.curse_add_line(msg, "TITLE")) - if args.diskio_iops: - msg = '{:>8}'.format('IOR/s') - ret.append(self.curse_add_line(msg)) - msg = '{:>7}'.format('IOW/s') - ret.append(self.curse_add_line(msg)) - else: - msg = '{:>8}'.format('R/s') - ret.append(self.curse_add_line(msg)) - msg = '{:>7}'.format('W/s') - ret.append(self.curse_add_line(msg)) - # Disk list (sorted by name) - for i in self.sorted_stats(): - # Hide stats if never be different from 0 (issue #1787) - if all([self.get_views(item=i[self.get_key()], key=f, option='hidden') for f in self.hide_zero_fields]): - continue - # Is there an alias for the disk name ? - disk_name = self.has_alias(i['disk_name']) if self.has_alias(i['disk_name']) else i['disk_name'] - # New line - ret.append(self.curse_new_line()) - if len(disk_name) > name_max_width: - # Cut disk name if it is too long - disk_name = '_' + disk_name[-name_max_width + 1 :] - msg = '{:{width}}'.format(nativestr(disk_name), width=name_max_width + 1) - ret.append(self.curse_add_line(msg)) - if args.diskio_iops: - # count - txps = self.auto_unit(int(i['read_count'] // i['time_since_update'])) - rxps = self.auto_unit(int(i['write_count'] // i['time_since_update'])) - msg = '{:>7}'.format(txps) - ret.append( - self.curse_add_line( - msg, self.get_views(item=i[self.get_key()], key='read_count', option='decoration') - ) - ) - msg = '{:>7}'.format(rxps) - ret.append( - self.curse_add_line( - msg, self.get_views(item=i[self.get_key()], key='write_count', option='decoration') - ) - ) - else: - # Bitrate - txps = self.auto_unit(int(i['read_bytes'] // i['time_since_update'])) - rxps = self.auto_unit(int(i['write_bytes'] // i['time_since_update'])) - msg = '{:>7}'.format(txps) - ret.append( - self.curse_add_line( - msg, self.get_views(item=i[self.get_key()], key='read_bytes', option='decoration') - ) - ) - msg = '{:>7}'.format(rxps) - ret.append( - self.curse_add_line( - msg, self.get_views(item=i[self.get_key()], key='write_bytes', option='decoration') - ) - ) - - return ret |