Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 81d363b

Browse files
committed
no message
1 parent b0a771f commit 81d363b

15 files changed

+942
-0
lines changed

‎moumoubaimifan/psutil-flask/app.py‎

Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,276 @@
1+
import os, signal
2+
from random import randrange
3+
4+
from flask import Flask, render_template, jsonify, request
5+
6+
from pyecharts import options as opts
7+
from pyecharts.charts import Bar, Line, Liquid, Gauge, Grid
8+
import pyecharts.options as opts
9+
import time
10+
import psutil
11+
12+
13+
app = Flask(__name__, static_folder="templates")
14+
15+
16+
cpu_percent_dict = {}
17+
net_io_dict = {'net_io_time':[], 'net_io_sent': [], 'net_io_recv': [], 'pre_sent': 0, 'pre_recv': 0, 'len': -1}
18+
disk_dict = {'disk_time':[], 'write_bytes': [], 'read_bytes': [], 'pre_write_bytes': 0, 'pre_read_bytes': 0, 'len': -1}
19+
20+
def cpu():
21+
now = time.strftime('%H:%M:%S', time.localtime(time.time()))
22+
cpu_percent = psutil.cpu_percent()
23+
cpu_percent_dict[now] = cpu_percent
24+
# 保持在图表中 10 个数据
25+
if len(cpu_percent_dict.keys()) == 11:
26+
cpu_percent_dict.pop(list(cpu_percent_dict.keys())[0])
27+
28+
29+
def cpu_line() -> Line:
30+
now = time.strftime('%Y年%m月%d日的', time.localtime(time.time()))
31+
cpu()
32+
c = (
33+
Line()
34+
.add_xaxis(list(cpu_percent_dict.keys()))
35+
.add_yaxis('', list(cpu_percent_dict.values()), areastyle_opts=opts.AreaStyleOpts(opacity=0.5))
36+
.set_global_opts(title_opts=opts.TitleOpts(title = now + "CPU负载",pos_left = "center"),
37+
yaxis_opts=opts.AxisOpts(min_=0,max_=100,split_number=10,type_="value", name='%'))
38+
)
39+
return c
40+
41+
def memory():
42+
memory = psutil.virtual_memory()
43+
swap = psutil.swap_memory()
44+
return memory.total, memory.total - (memory.free + memory.inactive), memory.free + memory.inactive, swap.total, swap.used, swap.free, memory.percent
45+
46+
47+
def memory_liquid() -> Gauge:
48+
mtotal, mused, mfree, stotal, sused, sfree, mpercent = memory()
49+
c = (
50+
Gauge()
51+
.add("", [("", mpercent)])
52+
.set_global_opts(title_opts=opts.TitleOpts(title="内存负载", pos_left = "center"))
53+
)
54+
return mtotal, mused, mfree, stotal, sused, sfree, c
55+
56+
57+
58+
def net_io():
59+
now = time.strftime('%H:%M:%S', time.localtime(time.time()))
60+
# 获取网络信息
61+
count = psutil.net_io_counters()
62+
g_sent = count.bytes_sent
63+
g_recv = count.bytes_recv
64+
65+
# 第一次请求
66+
if net_io_dict['len'] == -1:
67+
net_io_dict['pre_sent'] = g_sent
68+
net_io_dict['pre_recv'] = g_recv
69+
net_io_dict['len'] = 0
70+
return
71+
72+
# 当前网络发送/接收的字节速率 = 现在网络发送/接收的总字节 - 前一次请求网络发送/接收的总字节
73+
net_io_dict['net_io_sent'].append(g_sent - net_io_dict['pre_sent'])
74+
net_io_dict['net_io_recv'].append(g_recv - net_io_dict['pre_recv'])
75+
net_io_dict['net_io_time'].append(now)
76+
net_io_dict['len'] = net_io_dict['len'] + 1
77+
78+
net_io_dict['pre_sent'] = g_sent
79+
net_io_dict['pre_recv'] = g_recv
80+
81+
# 保持在图表中 10 个数据
82+
if net_io_dict['len'] == 11:
83+
net_io_dict['net_io_sent'].pop(0)
84+
net_io_dict['net_io_recv'].pop(0)
85+
net_io_dict['net_io_time'].pop(0)
86+
net_io_dict['len'] = net_io_dict['len'] - 1
87+
88+
89+
def net_io_line() -> Line:
90+
net_io()
91+
92+
c = (
93+
Line()
94+
.add_xaxis(net_io_dict['net_io_time'])
95+
.add_yaxis("发送字节数", net_io_dict['net_io_sent'], is_smooth=True)
96+
.add_yaxis("接收字节数", net_io_dict['net_io_recv'], is_smooth=True)
97+
.set_series_opts(
98+
areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
99+
label_opts=opts.LabelOpts(is_show=False),
100+
)
101+
.set_global_opts(
102+
title_opts=opts.TitleOpts(title="网卡IO", pos_left = "center"),
103+
xaxis_opts=opts.AxisOpts(
104+
axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
105+
is_scale=False,
106+
boundary_gap=False,
107+
),
108+
yaxis_opts=opts.AxisOpts(type_="value", name='B/2S'),
109+
legend_opts=opts.LegendOpts(pos_left="left"),
110+
))
111+
return c
112+
113+
114+
def process():
115+
result = []
116+
process_list = []
117+
pid = psutil.pids()
118+
for k, i in enumerate(pid):
119+
try:
120+
proc = psutil.Process(i)
121+
ctime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(proc.create_time()))
122+
process_list.append((str(i), proc.name(), proc.cpu_percent(), proc.memory_percent(), ctime))
123+
except psutil.AccessDenied:
124+
pass
125+
except psutil.NoSuchProcess:
126+
pass
127+
except SystemError:
128+
pass
129+
130+
process_list.sort(key=process_sort, reverse=True)
131+
for i in process_list:
132+
result.append({'PID': i[0], 'name': i[1], 'cpu': i[2], 'mem': "%.2f%%"%i[3], 'ctime': i[4]})
133+
134+
135+
return jsonify({'list': result})
136+
137+
def process_sort(elem):
138+
return elem[3]
139+
140+
141+
def disk():
142+
disk_usage = psutil.disk_usage('/')
143+
disk_used = 0
144+
# 磁盘已使用大小 = 每个分区的总和
145+
partitions = psutil.disk_partitions()
146+
for partition in partitions:
147+
partition_disk_usage = psutil.disk_usage(partition[1])
148+
disk_used = partition_disk_usage.used + disk_used
149+
150+
now = time.strftime('%H:%M:%S', time.localtime(time.time()))
151+
count = psutil.disk_io_counters()
152+
read_bytes = count.read_bytes
153+
write_bytes = count.write_bytes
154+
155+
# 第一次请求
156+
if disk_dict['len'] == -1:
157+
disk_dict['pre_write_bytes'] = write_bytes
158+
disk_dict['pre_read_bytes'] = read_bytes
159+
disk_dict['len'] = 0
160+
return disk_usage.total, disk_used, disk_usage.free
161+
162+
# 当前速率=现在写入/读取的总字节-前一次请求写入/读取的总字节
163+
disk_dict['write_bytes'].append((write_bytes - disk_dict['pre_write_bytes'])/1024)
164+
disk_dict['read_bytes'].append((read_bytes - disk_dict['pre_read_bytes'])/ 1024)
165+
disk_dict['disk_time'].append(now)
166+
disk_dict['len'] = disk_dict['len'] + 1
167+
168+
# 把现在写入/读取的总字节放入前一个请求的变量中
169+
disk_dict['pre_write_bytes'] = write_bytes
170+
disk_dict['pre_read_bytes'] = read_bytes
171+
172+
# 保持在图表中 50 个数据
173+
if disk_dict['len'] == 51:
174+
disk_dict['write_bytes'].pop(0)
175+
disk_dict['read_bytes'].pop(0)
176+
disk_dict['disk_time'].pop(0)
177+
disk_dict['len'] = disk_dict['len'] - 1
178+
179+
return disk_usage.total, disk_used, disk_usage.free
180+
181+
182+
def disk_line() -> Line:
183+
total, used, free = disk()
184+
185+
c = (
186+
Line(init_opts=opts.InitOpts(width="1680px", height="800px"))
187+
.add_xaxis(xaxis_data=disk_dict['disk_time'])
188+
.add_yaxis(
189+
series_name="写入数据",
190+
y_axis=disk_dict['write_bytes'],
191+
areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
192+
linestyle_opts=opts.LineStyleOpts(),
193+
label_opts=opts.LabelOpts(is_show=False),
194+
)
195+
.add_yaxis(
196+
series_name="读取数据",
197+
y_axis=disk_dict['read_bytes'],
198+
yaxis_index=1,
199+
areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
200+
linestyle_opts=opts.LineStyleOpts(),
201+
label_opts=opts.LabelOpts(is_show=False),
202+
)
203+
.extend_axis(
204+
yaxis=opts.AxisOpts(
205+
name_location="start",
206+
type_="value",
207+
is_inverse=True,
208+
axistick_opts=opts.AxisTickOpts(is_show=True),
209+
splitline_opts=opts.SplitLineOpts(is_show=True),
210+
name='KB/2S'
211+
)
212+
)
213+
.set_global_opts(
214+
title_opts=opts.TitleOpts(
215+
title="磁盘IO",
216+
pos_left="center",
217+
pos_top="top",
218+
),
219+
tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"),
220+
legend_opts=opts.LegendOpts(pos_left="left"),
221+
xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
222+
yaxis_opts=opts.AxisOpts(type_="value", name='KB/2S'),
223+
)
224+
.set_series_opts(
225+
axisline_opts=opts.AxisLineOpts(),
226+
)
227+
)
228+
229+
return total, used, free, c
230+
231+
@app.route("/")
232+
def index():
233+
return render_template("index.html")
234+
235+
236+
@app.route("/cpu")
237+
def get_cpu_chart():
238+
c = cpu_line()
239+
return c.dump_options_with_quotes()
240+
241+
@app.route("/memory")
242+
def get_memory_chart():
243+
mtotal, mused, mfree, stotal, sused, sfree, c = memory_liquid()
244+
return jsonify({'mtotal': mtotal, 'mused': mused, 'mfree': mfree, 'stotal': stotal, 'sused': sused, 'sfree': sfree, 'liquid': c.dump_options_with_quotes()})
245+
246+
247+
@app.route("/netio")
248+
def get_net_io_chart():
249+
c = net_io_line()
250+
return c.dump_options_with_quotes()
251+
252+
@app.route("/process")
253+
def get_process_tab():
254+
c = process()
255+
return c
256+
257+
@app.route("/delprocess")
258+
def del_process():
259+
pid = request.args.get("pid")
260+
os.kill(int(pid), signal.SIGKILL)
261+
return jsonify({'status': 'OK'})
262+
263+
@app.route("/disk")
264+
def get_disk_chart():
265+
total, used, free, c = disk_line()
266+
return jsonify({'total': total, 'used': used, 'free': free, 'line': c.dump_options_with_quotes()})
267+
268+
if __name__ == "__main__":
269+
app.run()
270+
# print(psutil.disk_partitions())
271+
# print(psutil.disk_usage('/'))
272+
# while 1:
273+
# print(psutil.disk_io_counters())
274+
# time.sleep(1)
275+
276+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{% import 'macro' as macro %}
2+
<!DOCTYPE html>
3+
<html>
4+
<head>
5+
<meta charset="UTF-8">
6+
<title>{{ chart.page_title }}</title>
7+
</head>
8+
<body>
9+
10+
{{ macro.gen_components_content(chart) }}
11+
12+
</body>
13+
</html>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /