LoadAverage.check()   A
last analyzed

Complexity

Conditions 3

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 16
rs 9.4285
cc 3
1
# -*- coding: utf-8 -*-
2
"""Load average reader for /proc on Linux."""
3
import plumd
4
from plumd.util import get_file
5
6
__author__ = 'Kenny Freeman'
7
__email__ = '[email protected]'
8
__license__ = "ISCL"
9
__docformat__ = 'reStructuredText'
10
11
12
class LoadAverage(plumd.Reader):
13
    """Plugin to measure various kernel metrics from /proc."""
14
15
    proc_colums = 5
16
17
    defaults = {
18
        'poll.interval': 10,
19
        'proc_path': '/proc'
20
    }
21
22
    def __init__(self, log, config):
23
        """Plugin to measure various kernel metrics from /proc.
24
25
        :param log: A logger
26
        :type log: logging.RootLogger
27
        :param config: a plumd.config.Conf configuration helper instance.
28
        :type config: plumd.config.Conf
29
        """
30
        super(LoadAverage, self).__init__(log, config)
31
        config.defaults(LoadAverage.defaults)
32
        self.proc_file = "{0}/loadavg".format(config.get('proc_path'))
33
        ncols = len(get_file(self.proc_file).strip().split())
34
        self.enabled = ncols == LoadAverage.proc_colums
35
        if not self.enabled:
36
            msg = "LoadAverage: invalid: {0} has {1} cols, expected {2}"
37
            self.log.error(msg.format(self.proc_file, ncols,
38
                                      LoadAverage.proc_colums))
39
40
    def poll(self):
41
        """Poll for kernel metrics under /proc.
42
43
        :rtype: ResultSet
44
        """
45
        return plumd.ResultSet(self.check())
46
47
    def check(self):
48
        """Return 1, 5 and 15 minute load averages from proc file loadavg.
49
50
        :rtype: plumd.Result
51
        """
52
        result = plumd.Result("loadavg")
53
        if not self.enabled:
54
            return result
55
        dat = []
56
        # read and process /proc/stat
57
        dat = get_file(self.proc_file).split()
58
        if len(dat) >= 3:
59
            result.add(plumd.Float("1", dat[0]))
60
            result.add(plumd.Float("5", dat[1]))
61
            result.add(plumd.Float("15", dat[2]))
62
        return [result]
63