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

    def __str__(self):
Mario Hock's avatar
Mario Hock committed
38
39
40
41
42
43
        ## •‣∘⁕∗◘☉☀★◾☞☛⦿
        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
44
45


46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94

class NetworkTraffic:
    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:
    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):
    r1 = Reading()
    time.sleep(interval)
    r2 = Reading()

    m = Measurement(r1, r2)

    return m



Mario Hock's avatar
Mario Hock committed
95
## XXX TESTING
Mario Hock's avatar
Mario Hock committed
96
97
98
99
100
101
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
102
## XXX TESTING
Mario Hock's avatar
Mario Hock committed
103
104
105
106
107
108
109
110
111
112
113
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
114
## XXX TESTING
Mario Hock's avatar
Mario Hock committed
115
def display(measurement):
Mario Hock's avatar
Mario Hock committed
116
117
118
119
120
121
    nics = ("eth0", "wlan0")

    display_cpu(measurement)
    desplay_network_traffic( measurement, nics )


Mario Hock's avatar
Mario Hock committed
122
## XXX TESTING
Mario Hock's avatar
Mario Hock committed
123
def displayX(measurement):
Mario Hock's avatar
Mario Hock committed
124
    nic = "eth0"
Mario Hock's avatar
Mario Hock committed
125

126
127
128
129
130
    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
131
132

    print
Mario Hock's avatar
Mario Hock committed
133
134


135
136
137
## XXX TESTING
def test_loop():
    for i in range(10):
Mario Hock's avatar
Mario Hock committed
138
139
140
        display( measure() )
        time.sleep(0.5)
        print
141
142
143


## XXX TESTING
Mario Hock's avatar
Mario Hock committed
144
145
#display( measure() )
test_loop()
Mario Hock's avatar
Mario Hock committed
146