__init__.py 4.11 KB
Newer Older
Mario Hock's avatar
Mario Hock committed
1
2
3
4
5
6
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import psutil
import time

7
8
9
10
11
12
13
14
from collections import namedtuple

import helpers

def get_time():
    """ Unified/comparable clock access """
    return time.time()

Mario Hock's avatar
Mario Hock committed
15
16
17
18
19
20
21
22
23
24

## XXX for interactive debugging only
def RELOAD():
    print ("import importlib")
    print ("importlib.reload(cpunetlog)")


MEASUREMENT_INTERVAL = 0.2


25
26

class Reading:
Mario Hock's avatar
Mario Hock committed
27
28
    """ A single reading of various CPU, NET, ... values. --> Building block for the »Measurement« class."""

Mario Hock's avatar
Mario Hock committed
29
30
    def __init__(self):
        ## * measurements *
31
        self.timestamp = get_time()
Mario Hock's avatar
Mario Hock committed
32
33
        #self.cpu_util = psutil.cpu_percent(interval=0, percpu=True)                      ## XXX
        #self.cpu_times_percent = psutil.cpu_times_percent(interval=0, percpu=True)       ## XXX
34
        self.cpu_times = psutil.cpu_times(percpu=True)
Mario Hock's avatar
Mario Hock committed
35
36
        self.memory = psutil.virtual_memory()
        self.net_io = psutil.net_io_counters(pernic=True)
Mario Hock's avatar
Mario Hock committed
37
38

    def __str__(self):
Mario Hock's avatar
Mario Hock committed
39
40
41
42
43
44
        ## •‣∘⁕∗◘☉☀★◾☞☛⦿
        return "◘ Timespan: " + str(self.timespan) +              \
                "\n◘ CPU utilization: " + str(self.cpu_util) +    \
                "\n◘ CPU times: " + str(self.cpu_times) +         \
                "\n◘ RAM: " + str(self.memory) +                  \
                "\n◘ NET: " + str(self.net_io)
Mario Hock's avatar
Mario Hock committed
45
46


47
48

class NetworkTraffic:
Mario Hock's avatar
Mario Hock committed
49
50
    """ Utility class for calculating and storing network traffic: Total amount (during a timespan) and ratio. """

51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
    def __init__(self, older_counters, younger_counters, timespan):
        self.total = dict()
        self.ratio = dict()

        for field in older_counters._fields:
            field_delta = getattr(younger_counters, field) - getattr(older_counters, field)

            self.total[field] = field_delta
            self.ratio[field] = field_delta / timespan

    def __str__(self):
        return "Total (bytes):" + str(self.total) + "; Ratio (bytes/s)" + str(self.ratio)



class Measurement:
Mario Hock's avatar
Mario Hock committed
67
68
    """ Calculates and stores CPU utilization, network traffic, ... during a timespan. Based two »Readings«. """

69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
    def __init__(self, reading1, reading2):
        self.r1 = reading1
        self.r2 = reading2

        ## calculate differences
        self.timespan = self.r2.timestamp - self.r1.timestamp
        self.cpu_times_percent = helpers.calculate_cpu_times_percent(self.r1.cpu_times, self.r2.cpu_times, percpu=True)
        self.net_io = self._calculate_net_io()


    def _calculate_net_io(self):
        ret = dict()

        for nic in self.r1.net_io.keys():
            ret[nic] = NetworkTraffic(self.r1.net_io[nic], self.r2.net_io[nic], self.timespan)

        return ret



def measure(interval = MEASUREMENT_INTERVAL):
Mario Hock's avatar
Mario Hock committed
90
91
    """ Convenience function to perform one »Measurement« """

92
93
94
95
96
97
98
99
100
101
    r1 = Reading()
    time.sleep(interval)
    r2 = Reading()

    m = Measurement(r1, r2)

    return m



Mario Hock's avatar
Mario Hock committed
102
## XXX TESTING
Mario Hock's avatar
Mario Hock committed
103
104
105
106
107
108
def display_cpu(measurement):
    num = 1
    for cpu in measurement.cpu_times_percent:
        print( "CPU" + str(num) + " util: " + str(100-cpu.idle) + "% (" + str(cpu.user) + "% user, " + str(cpu.system) + "% system)")
        num += 1

Mario Hock's avatar
Mario Hock committed
109
## XXX TESTING
Mario Hock's avatar
Mario Hock committed
110
111
112
113
114
115
116
117
118
119
120
def desplay_network_traffic(measurement, nics = None):
    if not nics:
        nics = measurement.net_io.keys()

    for nic in nics:
        values = measurement.net_io[nic]

        print( "[" + nic + "] Sending (bytes/s): " + str(values.ratio["packets_sent"]) +
              ", Receiving (bytes/s): " + str(values.ratio["packets_recv"]) )


Mario Hock's avatar
Mario Hock committed
121
## XXX TESTING
Mario Hock's avatar
Mario Hock committed
122
def display(measurement):
Mario Hock's avatar
Mario Hock committed
123
124
125
126
127
128
    nics = ("eth0", "wlan0")

    display_cpu(measurement)
    desplay_network_traffic( measurement, nics )


Mario Hock's avatar
Mario Hock committed
129
## XXX TESTING
Mario Hock's avatar
Mario Hock committed
130
def displayX(measurement):
Mario Hock's avatar
Mario Hock committed
131
    nic = "eth0"
Mario Hock's avatar
Mario Hock committed
132

133
134
135
136
137
    for cpu in measurement.cpu_times_percent:
        print( ", ".join([str(x) + "%" for x in cpu]))
        print( str(100-cpu.idle) + "%, " + str(cpu.user) + "%. " + str(cpu.system) + "%")
    for nic in measurement.net_io.keys():
        print( "[" + nic + "] " + str(measurement.net_io[nic]) )
Mario Hock's avatar
Mario Hock committed
138
139

    print
Mario Hock's avatar
Mario Hock committed
140
141


Mario Hock's avatar
Mario Hock committed
142
143


144
145
146
## XXX TESTING
def test_loop():
    for i in range(10):
Mario Hock's avatar
Mario Hock committed
147
148
149
        display( measure() )
        time.sleep(0.5)
        print
150
151
152


## XXX TESTING
Mario Hock's avatar
Mario Hock committed
153
154
#display( measure() )
test_loop()
Mario Hock's avatar
Mario Hock committed
155