summaryrefslogtreecommitdiffstats
path: root/glances/plugins/irq/model.py
diff options
context:
space:
mode:
Diffstat (limited to 'glances/plugins/irq/model.py')
-rw-r--r--glances/plugins/irq/model.py198
1 files changed, 0 insertions, 198 deletions
diff --git a/glances/plugins/irq/model.py b/glances/plugins/irq/model.py
deleted file mode 100644
index 81b30093..00000000
--- a/glances/plugins/irq/model.py
+++ /dev/null
@@ -1,198 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# This file is part of Glances.
-#
-# Copyright (C) 2018 Angelo Poerio <angelo.poerio@gmail.com>
-#
-# SPDX-License-Identifier: LGPL-3.0-only
-#
-
-"""IRQ plugin."""
-
-import os
-import operator
-
-from glances.globals import LINUX
-from glances.timer import getTimeSinceLastUpdate
-from glances.plugins.plugin.model import GlancesPluginModel
-
-
-class PluginModel(GlancesPluginModel):
- """Glances IRQ plugin.
-
- stats is a list
- """
-
- def __init__(self, args=None, config=None):
- """Init the plugin."""
- super(PluginModel, self).__init__(args=args, config=config, stats_init_value=[])
-
- # We want to display the stat in the curse interface
- self.display_curse = True
-
- # Init the stats
- self.irq = GlancesIRQ()
-
- def get_key(self):
- """Return the key of the list."""
- return self.irq.get_key()
-
- @GlancesPluginModel._check_decorator
- @GlancesPluginModel._log_result_decorator
- def update(self):
- """Update the IRQ stats."""
- # Init new stats
- stats = self.get_init_value()
-
- # IRQ plugin only available on GNU/Linux
- if not LINUX:
- return self.stats
-
- if self.input_method == 'local':
- # Grab the stats
- stats = self.irq.get()
-
- elif self.input_method == 'snmp':
- # not available
- pass
-
- # Get the TOP 5 (by rate/s)
- stats = sorted(stats, key=operator.itemgetter('irq_rate'), reverse=True)[:5]
-
- # 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()
-
- def msg_curse(self, args=None, max_width=None):
- """Return the dict to display in the curse interface."""
- # Init the return message
- ret = []
-
- # Only available on GNU/Linux
- # Only process if stats exist and display plugin enable...
- if not LINUX or not self.stats or self.is_disabled():
- return ret
-
- # Max size for the interface name
- name_max_width = max_width - 7
-
- # Build the string message
- # Header
- msg = '{:{width}}'.format('IRQ', width=name_max_width)
- ret.append(self.curse_add_line(msg, "TITLE"))
- msg = '{:>9}'.format('Rate/s')
- ret.append(self.curse_add_line(msg))
-
- for i in self.stats:
- ret.append(self.curse_new_line())
- msg = '{:{width}}'.format(i['irq_line'][:name_max_width], width=name_max_width)
- ret.append(self.curse_add_line(msg))
- msg = '{:>9}'.format(str(i['irq_rate']))
- ret.append(self.curse_add_line(msg))
-
- return ret
-
-
-class GlancesIRQ(object):
- """This class manages the IRQ file."""
-
- IRQ_FILE = '/proc/interrupts'
-
- def __init__(self):
- """Init the class.
-
- The stat are stored in a internal list of dict
- """
- self.lasts = {}
- self.reset()
-
- def reset(self):
- """Reset the stats."""
- self.stats = []
- self.cpu_number = 0
-
- def get(self):
- """Return the current IRQ stats."""
- return self.__update()
-
- def get_key(self):
- """Return the key of the dict."""
- return 'irq_line'
-
- def __header(self, line):
- """Build the header (contain the number of CPU).
-
- CPU0 CPU1 CPU2 CPU3
- 0: 21 0 0 0 IO-APIC 2-edge timer
- """
- self.cpu_number = len(line.split())
- return self.cpu_number
-
- def __humanname(self, line):
- """Return the IRQ name, alias or number (choose the best for human).
-
- IRQ line samples:
- 1: 44487 341 44 72 IO-APIC 1-edge i8042
- LOC: 33549868 22394684 32474570 21855077 Local timer interrupts
- """
- splitted_line = line.split()
- irq_line = splitted_line[0].replace(':', '')
- if irq_line.isdigit():
- # If the first column is a digit, use the alias (last column)
- irq_line += '_{}'.format(splitted_line[-1])
- return irq_line
-
- def __sum(self, line):
- """Return the IRQ sum number.
-
- IRQ line samples:
- 1: 44487 341 44 72 IO-APIC 1-edge i8042
- LOC: 33549868 22394684 32474570 21855077 Local timer interrupts
- FIQ: usb_fiq
- """
- splitted_line = line.split()
- try:
- ret = sum(map(int, splitted_line[1 : (self.cpu_number + 1)]))
- except ValueError:
- # Correct issue #1007 on some conf (Raspberry Pi with Raspbian)
- ret = 0
- return ret
-
- def __update(self):
- """Load the IRQ file and update the internal dict."""
- self.reset()
-
- if not os.path.exists(self.IRQ_FILE):
- # Correct issue #947: IRQ file do not exist on OpenVZ container
- return self.stats
-
- try:
- with open(self.IRQ_FILE) as irq_proc:
- time_since_update = getTimeSinceLastUpdate('irq')
- # Read the header
- self.__header(irq_proc.readline())
- # Read the rest of the lines (one line per IRQ)
- for line in irq_proc.readlines():
- irq_line = self.__humanname(line)
- current_irqs = self.__sum(line)
- irq_rate = int(
- current_irqs - self.lasts.get(irq_line) if self.lasts.get(irq_line) else 0 // time_since_update
- )
- irq_current = {
- 'irq_line': irq_line,
- 'irq_rate': irq_rate,
- 'key': self.get_key(),
- 'time_since_update': time_since_update,
- }
- self.stats.append(irq_current)
- self.lasts[irq_line] = current_irqs
- except (OSError, IOError):
- pass
-
- return self.stats