__init__.py 4.33 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
def desplay_network_traffic(measurement, nics = None):
Mario Hock's avatar
Mario Hock committed
111
112
113
114
    divisor = 1000
    rounding_digits = 2
    unit = "KBytes"

Mario Hock's avatar
Mario Hock committed
115
116
117
118
119
120
    if not nics:
        nics = measurement.net_io.keys()

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

Mario Hock's avatar
Mario Hock committed
121
122
123
124
125
        sending = str( round(values.ratio["bytes_sent"] / divisor, rounding_digits) )
        receiving = str( round(values.ratio["bytes_recv"] / divisor, rounding_digits) )

        print( "[" + nic + "] Sending (" + unit + "/s): " + sending +
              ", Receiving (" + unit + "/s): " + receiving )
Mario Hock's avatar
Mario Hock committed
126
127


Mario Hock's avatar
Mario Hock committed
128
## XXX TESTING
Mario Hock's avatar
Mario Hock committed
129
def display(measurement):
Mario Hock's avatar
Mario Hock committed
130
    nics = ("eth0", "wlan0", "lo")
Mario Hock's avatar
Mario Hock committed
131
132
133
134
135

    display_cpu(measurement)
    desplay_network_traffic( measurement, nics )


Mario Hock's avatar
Mario Hock committed
136
## XXX TESTING
Mario Hock's avatar
Mario Hock committed
137
def displayX(measurement):
Mario Hock's avatar
Mario Hock committed
138
    nic = "eth0"
Mario Hock's avatar
Mario Hock committed
139

140
141
142
143
144
    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
145
146

    print
Mario Hock's avatar
Mario Hock committed
147
148


Mario Hock's avatar
Mario Hock committed
149
150


Mario Hock's avatar
Mario Hock committed
151
## XXX TESTING -- NOTE: takes unnecessary Readings!!
152
def test_loop():
Mario Hock's avatar
Mario Hock committed
153
154
    for i in range(100):
        display( measure(2.0) )
Mario Hock's avatar
Mario Hock committed
155
        print
156
157
158


## XXX TESTING
Mario Hock's avatar
Mario Hock committed
159
160
#display( measure() )
test_loop()
Mario Hock's avatar
Mario Hock committed
161