glances_cpu.py 8.1 KB
Newer Older
N
Nicolas Hennion 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Glances - An eye on your system
#
# Copyright (C) 2014 Nicolargo <nicolas@nicolargo.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/>.

N
Nicolas Hennion 已提交
21 22
# Import system libs
# Check for PSUtil already done in the glances_core script
23
from psutil import cpu_times, cpu_times_percent
N
Nicolas Hennion 已提交
24

N
Nicolas Hennion 已提交
25 26
# from ..plugins.glances_plugin import GlancesPlugin
from glances_plugin import GlancesPlugin
N
Nicolas Hennion 已提交
27

28

N
Nicolas Hennion 已提交
29
class Plugin(GlancesPlugin):
N
Nicolas Hennion 已提交
30 31
    """
    Glances' Cpu Plugin
N
Nicolas Hennion 已提交
32

N
Nicolas Hennion 已提交
33 34
    stats is a dict
    """
N
Nicolas Hennion 已提交
35

N
Nicolas Hennion 已提交
36 37
    def __init__(self):
        GlancesPlugin.__init__(self)
N
Nicolas Hennion 已提交
38

39 40 41 42 43 44 45 46 47
        # We want to display the stat in the curse interface
        self.display_curse = True
        # Set the message position
        # It is NOT the curse position but the Glances column/line
        # Enter -1 to right align 
        self.column_curse = 0
        # Enter -1 to diplay bottom
        self.line_curse = 1

N
Nicolas Hennion 已提交
48

N
Nicolas Hennion 已提交
49 50 51 52
    def update(self):
        """
        Update CPU stats
        """
N
Nicolas Hennion 已提交
53

54
        # Grab CPU using the PSUtil cpu_times_percent method (PSUtil 0.7 or higher)
55 56 57 58
        try:
            cputimespercent = cpu_times_percent(interval=0, percpu=False)
        except:
            return self.update_deprecated()
59 60 61 62 63 64 65 66 67 68 69 70 71

        self.stats = {}
        for cpu in ['user', 'system', 'idle', 'nice', 
                    'iowait', 'irq', 'softirq', 'steal']:
            if hasattr(cputimespercent, cpu):
                self.stats[cpu] = getattr(cputimespercent, cpu)

        return self.stats


    def update_deprecated(self):
        """
        Update CPU stats
72
        Only used if cpu_times_percent failed
73 74
        """

N
Nicolas Hennion 已提交
75 76 77
        # Grab CPU using the PSUtil cpu_times method
        cputime = cpu_times(percpu=False)
        cputime_total = cputime.user + cputime.system + cputime.idle
N
Nicolas Hennion 已提交
78

N
Nicolas Hennion 已提交
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
        # Only available on some OS
        if hasattr(cputime, 'nice'):
            cputime_total += cputime.nice
        if hasattr(cputime, 'iowait'):
            cputime_total += cputime.iowait
        if hasattr(cputime, 'irq'):
            cputime_total += cputime.irq
        if hasattr(cputime, 'softirq'):
            cputime_total += cputime.softirq
        if hasattr(cputime, 'steal'):
            cputime_total += cputime.steal
        if not hasattr(self, 'cputime_old'):
            self.cputime_old = cputime
            self.cputime_total_old = cputime_total
            self.stats = {}
        else:
            self.cputime_new = cputime
            self.cputime_total_new = cputime_total
            try:
                percent = 100 / (self.cputime_total_new -
                                 self.cputime_total_old)
                self.stats = {'user': (self.cputime_new.user -
                                      self.cputime_old.user) * percent,
                               'system': (self.cputime_new.system -
                                         self.cputime_old.system) * percent,
                               'idle': (self.cputime_new.idle -
                                       self.cputime_old.idle) * percent}
                if hasattr(self.cputime_new, 'nice'):
                    self.stats['nice'] = (self.cputime_new.nice -
                                          self.cputime_old.nice) * percent
                if hasattr(self.cputime_new, 'iowait'):
                    self.stats['iowait'] = (self.cputime_new.iowait -
                                            self.cputime_old.iowait) * percent
                if hasattr(self.cputime_new, 'irq'):
                    self.stats['irq'] = (self.cputime_new.irq -
                                         self.cputime_old.irq) * percent
                if hasattr(self.cputime_new, 'softirq'):
                    self.stats['softirq'] = (self.cputime_new.softirq -
                                             self.cputime_old.softirq) * percent
                if hasattr(self.cputime_new, 'steal'):
                    self.stats['steal'] = (self.cputime_new.steal -
                                           self.cputime_old.steal) * percent
                self.cputime_old = self.cputime_new
                self.cputime_total_old = self.cputime_total_new
            except Exception, err:
                self.stats = {}
125 126 127 128

        return self.stats


N
Nicolas Hennion 已提交
129
    def msg_curse(self, args=None):
130 131 132 133 134 135 136 137 138
        """
        Return the dict to display in the curse interface
        """

        # Init the return message
        ret = []

        # Build the string message
        # Header
139 140
        msg = "{0:8}".format(_("CPU"))
        ret.append(self.curse_add_line(msg, "TITLE"))
141 142
        # Total CPU usage
        msg = "{0}".format(format((100 - self.stats['idle']) / 100, '>6.1%'))
143
        ret.append(self.curse_add_line(msg))
144
        # Steal CPU usage
145
        ret.append(self.curse_add_line("  ", optional=True))
146
        if ('steal' in self.stats):
147
            msg = "{0:8}".format(_("steal:"))
N
Nicolas Hennion 已提交
148
            ret.append(self.curse_add_line(msg, optional=True))
149
            msg = "{0}".format(format(self.stats['steal'] / 100, '>6.1%'))
N
Nicolas Hennion 已提交
150 151
            ret.append(self.curse_add_line(msg, 
                                           self.get_alert(self.stats['steal'], header="steal"), optional=True))
152 153 154 155
        # New line
        ret.append(self.curse_new_line())
        # User CPU
        if ('user' in self.stats):
156 157 158
            msg = "{0:8}".format(_("user:"))
            ret.append(self.curse_add_line(msg))
            msg = "{0}".format(format(self.stats['user'] / 100, '>6.1%'))
N
Nicolas Hennion 已提交
159 160
            ret.append(self.curse_add_line(msg, 
                                           self.get_alert_log(self.stats['user'], header="user")))
161
        # IOWait CPU
162
        ret.append(self.curse_add_line("  ", optional=True))
163
        if ('iowait' in self.stats):
164 165
            msg = "{0:8}".format(_("iowait:"))
            ret.append(self.curse_add_line(msg, optional=True))
166
            msg = "{0}".format(format(self.stats['iowait'] / 100, '>6.1%'))
N
Nicolas Hennion 已提交
167 168
            ret.append(self.curse_add_line(msg, 
                                           self.get_alert_log(self.stats['iowait'], header="iowait"), optional=True))
169 170
        # New line
        ret.append(self.curse_new_line())
171 172 173
        # System CPU
        if ('system' in self.stats):
            msg = "{0:8}".format(_("system:"))
N
Nicolas Hennion 已提交
174
            ret.append(self.curse_add_line(msg))
175
            msg = "{0}".format(format(self.stats['system'] / 100, '>6.1%'))
N
Nicolas Hennion 已提交
176 177
            ret.append(self.curse_add_line(msg, 
                                           self.get_alert_log(self.stats['system'], header="system")))
178
        # IRQ CPU
179
        ret.append(self.curse_add_line("  ", optional=True))
180
        if ('irq' in self.stats):
181
            msg = "{0:7} {1}".format(
182 183
                    _("irq:"),
                    format(self.stats['irq'] / 100, '>6.1%'))
N
Nicolas Hennion 已提交
184
            ret.append(self.curse_add_line(msg, optional=True))
185 186 187 188 189 190 191 192 193
        # New line
        ret.append(self.curse_new_line())
        # Nice CPU
        if ('nice' in self.stats):
            msg = "{0:7} {1}".format(
                    _("nice:"), 
                    format(self.stats['nice'] / 100, '>6.1%'))
            ret.append(self.curse_add_line(msg, optional=True))
        # Idles CPU
194
        ret.append(self.curse_add_line("  ", optional=True))
195
        if ('idle' in self.stats):
196
            msg = "{0:7} {1}".format(
197 198 199
                    _("idle:"),
                    format(self.stats['idle'] / 100, '>6.1%'))
            ret.append(self.curse_add_line(msg))
200 201 202
  
        # Return the message with decoration 
        return ret