LoadAverage   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 51
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 6
c 2
b 0
f 0
dl 0
loc 51
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A poll() 0 6 1
A __init__() 0 17 2
A check() 0 16 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