Completed
Push — master ( 8451c1...a45803 )
by Kenny
01:18
created

DiskStats.check()   A

Complexity

Conditions 4

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
c 1
b 0
f 0
dl 0
loc 21
rs 9.0534
1
# -*- coding: utf-8 -*-
2
3
__author__ = 'Kenny Freeman'
4
__email__ = '[email protected]'
5
__license__ = "ISCL"
6
__docformat__ = 'reStructuredText'
7
8
import re
9
import time
10
11
import plumd
12
import plumd.plugins
13
from plumd.calc import Differential
14
from plumd.util import get_file_map
15
16
17
class DiskStats(plumd.plugins.Reader):
18
    """Plugin to measure various kernel metrics from /proc."""
19
    defaults = {
20
        'poll.interval': 10,
21
        'proc_path': '/proc',
22
        'diskstats_dev_re': "dm-\d",
23
        'diskstats_cols': ["r", "r_merge", "r_sector", "r_time", "w", "w_merge",
24
                           "w_sector", "w_time", "io_inprog", "io_time",
25
                           "io_weighted_time"]
26
    }
27
28
    def __init__(self, log, config):
29
        """Plugin to measure various kernel metrics from /proc.
30
31
        :param log: A logger
32
        :type log: logging.RootLogger
33
        :param config: a plumd.config.Conf configuration helper instance.
34
        :type config: plumd.config.Conf
35
        """
36
        super(DiskStats, self).__init__(log, config)
37
        config.defaults(DiskStats.defaults)
38
        self.calc = Differential()
39
        self.proc_file = "{0}/diskstats".format(config.get('proc_path'))
40
        self.diskstats_dev_re = re.compile(config.get('diskstats_dev_re'))
41
        self.diskstats_cols = self.config.get('diskstats_cols')
42
43
44
    def poll(self):
45
        """Poll for kernel metrics under /proc.
46
47
        :rtype: ResultSet
48
        """
49
        return plumd.ResultSet(self.check())
50
51
52
    def check(self):
53
        """Return disk io metrics from proc file diskstats.
54
55
        :rtype: plumd.Result
56
        """
57
        # times in ms
58
        cols = self.diskstats_cols
59
        result = plumd.Result("diskstats")
60
        dat = {}
61
        # read and process /proc/diskstats
62
        dat = get_file_map(self.proc_file, 2, 0)
63
        ts = time.time()
64
        for key, val in dat.items():
65
            if self.diskstats_dev_re.match(key):
66
                continue
67
            for mname in cols:
68
                mval = int(val.popleft())
69
                mstr = "{0}.{1}".format(key, mname)
70
                dval = self.calc.per_second(mstr, mval, ts)
71
                result.add(plumd.Int(mstr, dval))
72
        return [result]
73