Files
wlan-lanforge-scripts/cpu_stats.py
2020-12-31 17:39:21 +05:30

141 lines
6.2 KiB
Python

''' Author: Nikita Yadav
This script will calculate the cpu and memory utilization by the system during runtime the output of which is a graph on html page also the second tab of html gives the system logs
'''
import argparse
import os
import matplotlib.pyplot as plt
import datetime
import base64
import logging
import threading
import time
fh = ''
fh_1 = ''
def cpu_percent(cmd):
global fh
fh = os.popen(cmd)
def memory_percent(cmd):
global fh_1
fh_1 = os.popen(cmd)
def htmlimage(data_4, data):
html = open("log.html", 'w')
img = data_4 + " " + data
html.write(img)
def main():
global duration
parser = argparse.ArgumentParser()
parser.add_argument("-t", "--duration", type=int, help="Enter the Time for which you want to run test (in minutes)")
try:
args = parser.parse_args()
if (args.duration is not None):
duration = args.duration
except Exception as e:
logging.exception(e)
exit(2)
endTime = datetime.datetime.now() + datetime.timedelta(seconds=duration)
now = datetime.datetime.now()
starttime = datetime.datetime(now.year, now.month, now.day, now.hour, now.minute, now.second)
delta = datetime.timedelta(seconds=10)
cpu_stats_data = {"system": [], "kernel": []}
memory_stats_data = {"Total": [], "Used": []}
iterations = duration * 60
cmd_1 = "top -bn1 -d 1 -n " + str(iterations) + " | grep '%Cpu(s)' "
cmd_2 = "top -bn1 -d 1 -n " + str(iterations) + " | grep 'MiB Mem'"
t1 = threading.Thread(target=cpu_percent, args=(cmd_1,))
t2 = threading.Thread(target=memory_percent, args=(cmd_2,))
t1.start()
t2.start()
t1.join()
t2.join()
time.sleep(10)
output = fh.read() + fh.readline()
output_1 = fh_1.read() + fh_1.readline()
data = output.split('\n')
data_1 = output_1.split('\n')
for i in data:
# print(i.split(','))
if len(i) > 3:
cpu_stats_data["system"].append(float(i.split(',')[0].split()[1]))
cpu_stats_data["kernel"].append(float(i.split(',')[1].split()[0]))
# print(cpu_stats_data)
for i in data_1:
if len(i) > 3:
memory_stats_data["Total"].append(float(i.split(',')[0].split()[3]))
memory_stats_data["Used"].append(float(i.split(',')[2].split()[0]))
# print(memory_stats_data)
sample_times = [starttime + i * delta for i in range(len(cpu_stats_data["system"]))]
label_locations = [d for d in sample_times if d.minute % 1 == 0]
labels = [d.strftime('%Y-%m-%d %H:%M:%S') for d in label_locations]
# print(labels)
#print(sample_times)
# thread creation
# graphs
#plot1
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(sample_times, cpu_stats_data['system'], '-', lw=1, color='r', label="system cpu%")
ax.plot(sample_times, cpu_stats_data['kernel'], '-', lw=1, color='b', label="kernel cpu%")
ax.set_ylabel('CPU (%)', color='r')
ax.set_xlabel('time (s)')
plt.tight_layout()
ax.set_ylim(0., max(cpu_stats_data['system']) + 20)
plt.xticks(rotation='vertical')
fig.legend(["System CPU Utilization", "Kernel CPU Utilization"], loc='upper center')
ax.grid()
fig.savefig("cpu.png")
#plot2
fig_1 = plt.figure()
ax_1 = fig_1.add_subplot(1, 1, 1)
ax_1.plot(sample_times, memory_stats_data["Total"], '-', lw=1, color='r', label="Total MEMORY AVAILABLE")
ax_1.plot(sample_times, memory_stats_data["Used"], '-', lw=1, color='b', label="Total MEMORY USED")
ax_1.set_ylabel('Total available', color='r')
ax_1.set_xlabel('time (s)')
plt.tight_layout()
ax_1.set_ylim(0., max(memory_stats_data["Total"]) + 2000)
plt.xticks(rotation='vertical')
fig_1.legend(["TOTAL MEMORY AVAILABLE", "TOTAL MEMORY USED"], loc='upper center')
ax_1.grid()
fig_1.savefig("MEMORY.png")
cmd_1 = "timeout 2s journalctl -p err --since '24 hour ago' > syslog.txt"
fh_2 = os.system(cmd_1)
fi_open = open("syslog.txt", "r+")
out = fi_open.read()
data_3 = out.split(" ")
data_uri = base64.b64encode(open('cpu.png', 'rb').read()).decode('utf-8')
data_uri_1 = base64.b64encode(open('MEMORY.png', 'rb').read()).decode('utf-8')
data_a = '<img title="CPU utilization" src="data:image/png;base64,{0}">'.format(
data_uri) + " " + '<img title="CPU utilization" src="data:image/png;base64,{0}">'.format(data_uri_1)
data_4 = "<!DOCTYPE html><html><head> <meta name='viewport' content='width=device-width, initial-scale=1''><style>.accordion {background-color: #eee;color: #444;cursor: pointer;padding: 18px;width: 50%; border: none;text-align: left;outline: none;font-size: 15px;transition: 0.4s;}.active, .accordion:hover {background-color: #ccc; }.panel {padding: 0 18px;display: none;background-color: white;overflow: hidden;}</style></head><body> <button class='accordion''>CPU UTILIZATION</button> <div class='panel'> <p>" + data_a + "</p></div><script>acc = document.getElementsByClassName('accordion');var i;for (i = 0; i < acc.length; i++) {acc[i].addEventListener('click', function() {this.classList.toggle('active');var panel = this.nextElementSibling;if (panel.style.display === 'ock') {panel.style.display = 'none;} else {panel.style.display = 'block';}});}</script></body></html>"
logs = " "
for i in data_3:
logs = logs + i
data = "<head> <meta name='viewport' content='width=device-width, initial-scale=1'> <style>.accordion { background-color: #eee; color: #444; cursor: pointer;padding: 18px; width: 50%; border: none;text-align: left;outline: none;font-size: 10px;transition: 0.4s;} .active, .accordion:hover { background-color: #ccc;} .panel { padding: 0 18px; display: none; background-color: white; overflow: hidden;} </style> </head> <button class='accordion'>SYSTEM LOGS</button> <div class='panel'> <font face = 'Courier New' size = '2' color='#ff0000'>" + logs + "</font><br /> </div> <script> var acc = document.getElementsByClassName('accordion'); var i; for (i = 0; i < acc.length; i++) {acc[i].addEventListener('click', function() { this.classList.toggle('active');var panel = this.nextElementSibling;if (panel.style.display === 'block') {panel.style.display = 'none';} else {panel.style.display = 'block';}});} </script> "
htmlimage(data_4, data)
if __name__ == '__main__':
main()