/usr/lib/python3/dist-packages/glances/plugins/glances_irq.py is in glances 2.7.1.1-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | # -*- coding: utf-8 -*-
#
# This file is part of Glances.
#
# Copyright (C) 2015 Angelo Poerio <angelo.poerio@gmail.com>
#
# Glances is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Glances is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
"""IRQ plugin."""
import operator
from glances.globals import LINUX
from glances.timer import getTimeSinceLastUpdate
from glances.plugins.glances_plugin import GlancesPlugin
class Plugin(GlancesPlugin):
"""Glances IRQ plugin.
stats is a list
"""
def __init__(self, args=None):
"""Init the plugin."""
super(Plugin, self).__init__(args=args)
# We want to display the stat in the curse interface
self.display_curse = True
self.lasts = {}
# Init the stats
self.reset()
def get_key(self):
"""Return the key of the list."""
return 'irq_line'
def reset(self):
"""Reset/init the stats."""
self.stats = []
@GlancesPlugin._log_result_decorator
def update(self):
"""Update the IRQ stats"""
# Reset the list
self.reset()
if not LINUX: # only available on GNU/Linux
return self.stats
if self.input_method == 'local':
with open('/proc/interrupts') as irq_proc:
time_since_update = getTimeSinceLastUpdate('irq')
irq_proc.readline() # skip header line
for irq_line in irq_proc.readlines():
splitted_line = irq_line.split()
irq_line = splitted_line[0].replace(':', '')
current_irqs = sum([int(count) for count in splitted_line[
1:] if count.isdigit()]) # sum interrupts on all CPUs
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
elif self.input_method == 'snmp':
# not available
pass
# Update the view
self.update_views()
self.stats = sorted(self.stats, key=operator.itemgetter(
'irq_rate'), reverse=True)[:5] # top 5 IRQ by rate/s
return self.stats
def update_views(self):
"""Update stats views."""
# Call the father's method
super(Plugin, 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 = []
if not LINUX: # only available on GNU/Linux
return ret
# Only process if stats exist and display plugin enable...
if not self.stats or args.disable_irq:
return ret
if max_width is not None and max_width >= 23:
irq_max_width = max_width - 14
else:
irq_max_width = 9
# Build the string message
# Header
msg = '{:{width}}'.format('IRQ', width=irq_max_width)
ret.append(self.curse_add_line(msg, "TITLE"))
msg = '{:>14}'.format('Rate/s')
ret.append(self.curse_add_line(msg))
for i in self.stats:
ret.append(self.curse_new_line())
msg = '{:>3}'.format(i['irq_line'])
ret.append(self.curse_add_line(msg))
msg = '{:>20}'.format(str(i['irq_rate']))
ret.append(self.curse_add_line(msg))
return ret
|