Python搭建一个系统信息实时监控数据可视化大屏

本文分享使用python搭建服务器应用的监控系统面板,主要流程如下:

本文分享使用python搭建服务器应用的监控系统面板,主要流程如下:

1、数据库中创建数据表

2、建立数据库连接

实时数据插入数据表,实时查询更新面板数据准备

3、监控中心大屏制作

具体步骤:

1、创建监测指标数据表字段

这里为了方便将系统信息监控的CPU信息、内存信息、磁盘信息放在一张表中。

实际上可以将CPU和磁盘信息监控指标分表设置,两者对时间粒度要求是不一样的,减少不需要的资源消耗。后期专门写一篇来聊聊如何搭建数据指标体系。

import pymysql
db = pymysql.connect(user="root", passwd="root", db="mydb", host="127.0.0.1")
cur = db.cursor()

# from sqlalchemy import create_engine
# engine = create_engine(
# "mysql+pymysql://root:root@127.0.0.1:3306/mydb?charset=utf8")
# print(engine)

# 创建数据表--系统信息监控
sql="""CREATE TABLE IF NOT EXISTS system_info(
ID int(8) not null auto_increment COMMENT '序号',
TIME datetime not null COMMENT '记录时间',
mem_free VARCHAR (100) NOT NULL COMMENT '可用内存',
mem_total VARCHAR (100) NOT NULL COMMENT '总内存',
mem_percent VARCHAR (100) NOT NULL COMMENT '内存百分比',
mem_used VARCHAR (100) NOT NULL COMMENT '占用内存',
cpu VARCHAR (100) COMMENT 'CPU占比',
disk1 VARCHAR (100) COMMENT 'C盘使用占比',
disk2 VARCHAR (100) COMMENT 'D盘使用占比',
disk3 VARCHAR (100) COMMENT 'E盘使用占比',
disk4 VARCHAR (100) COMMENT 'F盘使用占比',
disk5 VARCHAR (100) COMMENT 'G盘使用占比',
primary key(ID)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '系统信息监控';
"""
cur.execute(sql)
cur.close()

Python搭建一个系统信息实时监控数据可视化大屏

2、建立数据库连接

定时获取主机的一些内存、CPU、磁盘的信息,将获取的信息存储到数据库;这里利用轻量级定时模块schedule。

import psutil
import time
import pymysql
from datetime import datetime
import schedule

db = pymysql.connect(user="root", passwd="root", db="mydb", host="127.0.0.1")
db.autocommit(True)
cur = db.cursor()
def Get_sys_info():
# cpu信息
cpu = str(psutil.cpu_percent(interval=1)) + '%'
# cpu = psutil.cpu_percent(interval=1, percpu=True)

# 内存信息
mem = psutil.virtual_memory()
mem_total = round(mem.total / 1024 / 1024 / 1024, 0)
mem_free = round(mem.free / 1024 / 1024 / 1024)
mem_percent = str(mem.percent) + '%'
mem_used = round(mem.used / 1024 / 1024 / 1024)

# 磁盘信息(磁盘空间使用占比)
disk1 = str(psutil.disk_usage('C:/').percent) + '%'
disk2 = str(psutil.disk_usage('D:/').percent) + '%'
disk3 = str(psutil.disk_usage('E:/').percent) + '%'
disk4 = str(psutil.disk_usage('F:/').percent) + '%'
disk5 = str(psutil.disk_usage('G:/').percent) + '%'

return mem_free,mem_total,mem_percent,mem_used,cpu,disk1,disk2,disk3,disk4,disk5

if __name__ == "__main__":

def job():
mem_free, mem_total, mem_percent, mem_used, cpu, disk1, disk2, disk3, disk4, disk5 = Get_sys_info()
now_time = datetime.now()
list1 = [now_time, mem_free, mem_total, mem_percent, mem_used, cpu, disk1, disk2, disk3, disk4, disk5]
tuple_list = tuple([str(i) for i in list1])
print(tuple_list)

sql = """insert into system_info(TIME,mem_free,mem_total,mem_percent,mem_used,cpu,disk1,disk2,disk3,disk4,disk5) value (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""

cur.execute(sql, tuple_list)

try:
schedule.every().minute.at(":00").do(job)

except Exception as e:
print('错误: %s'% e)

while True:
schedule.run_pending()
time.sleep(1)

服务启动后,每分钟向数据库插入一次数据记录。这里有个小问题,插入时间点并没有从设置的:00开始,后面再优化这个细节。

Python搭建一个系统信息实时监控数据可视化大屏

3、监控中心大屏

从数据库获取数据如服务器的内存、CPU信息等,通过Pyecharts可视化制作图表并布局看板。通过以下流程生成一个粗略的大屏布局,由7个部分组成,按顺序排列。

import pymysql
from pyecharts.charts import Line
from pyecharts import options as opts
from pyecharts.charts import Bar, Pie, Page
from pyecharts.globals import ThemeType

db = pymysql.connect(user="root", passwd="root", db="mydb", host="127.0.0.1")
cur1 = db.cursor()
cur2 = db.cursor()
cur3 = db.cursor()

SQL1="""SELECT TIME,cpu,mem_percent FROM system_info WHERE TIME > DATE_SUB(NOW(), INTERVAL 60 MINUTE)""" #查询最近1h内数据展示

SQL2 = 'select disk1,disk2,disk3,disk4,disk5 from system_info order by TIME desc limit 1'

SQL3 = 'select mem_free,mem_total,mem_percent,mem_used from system_info order by TIME desc limit 1'

cur1.execute(SQL1)
cur2.execute(SQL2)
cur3.execute(SQL3)
cpu_data = cur1.fetchall()
disk_data = cur2.fetchall()
mem_data = cur3.fetchall()

all_time = []
all_cpu = []
all_mem_percent = []
for time_cpu in cpu_data:
TIME=time_cpu[0]
cpu0=time_cpu[1].split('%')
cpu_num = eval(cpu0[0])

mem0=time_cpu[2].split('%')
mem_percent = eval(mem0[0])

all_cpu.append(cpu_num)
all_time.append(TIME)
all_mem_percent.append(mem_percent)

disk_list = list(disk_data[0])
disk_percent=[eval(x.split("%")[0]) for x in disk_list]

def tab0(name, color): # 标题
c = (Pie().
set_global_opts(
title_opts=opts.TitleOpts(title=name, pos_left='center', pos_top='center',
title_textstyle_opts=opts.TextStyleOpts(color=color, font_size=20))))
return c

def tab1(name, color): # 标题
c = (Pie().
set_global_opts(
title_opts=opts.TitleOpts(title=name, pos_left='center', pos_top='center',
title_textstyle_opts=opts.TextStyleOpts(color=color, font_size=30))))
return c

def tab2(name, color):
c = (Pie().
set_global_opts(
title_opts=opts.TitleOpts(title=name, pos_left='center', pos_top='center',
title_textstyle_opts=opts.TextStyleOpts(color=color, font_size=25))))
return c

def line(all_time, all_cpu):
line = (
Line()
.add_xaxis(all_time)
.add_yaxis("CPU_info:%", all_cpu)
.set_global_opts(title_opts=opts.TitleOpts(title="CPU_info"))
)
line.render()

return line

def line1(all_time, all_mem_percent):
line = (
Line()
.add_xaxis(all_time)
.add_yaxis("Mem_percent:%",all_mem_percent)
.set_global_opts(title_opts=opts.TitleOpts(title="内存使用占比"))
)
line.render()

return line

def bar(disk_percent):

bar =(Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK)) #在这里输入啊,设置绘图主题为CHALK
.add_xaxis(["C盘","D盘","E盘","F盘","G盘"])
.add_yaxis("磁盘使用占比:%",disk_percent))
bar.render()
return bar

def pie_base():
c = (
Pie()
.add("", [list(z) for z in zip(['mem_free', 'mem_used'],
[mem_data[0][0],mem_data[0][3]])])
.set_global_opts(title_opts=opts.TitleOpts(title="内存使用占比"))
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
return c
#将上面图拼接到网页上
page = Page()
page.add(
tab0("Python数据分析实例", "#2CB34A"),
line(all_time,all_cpu),
tab1("系统信息监控数据可视化大屏", "#2CB34A"),
tab2("可用内存:{mem_free}\n\n总内存:{mem_total}\n\n内存占比:{mem_percent}\n\n占用内存:{mem_used}".format(mem_free=mem_data[0][0],mem_total=mem_data[0][1],mem_percent=mem_data[0][2],mem_used=mem_data[0][3]), "#000000"),
bar(disk_percent),
pie_base(),
line1(all_time,all_mem_percent)
)
page.render("data_center.html")
db.close()

配色码-查看RGB颜色查询对照表|RGB颜色|三原色配色表 (sojson.com)

Python搭建一个系统信息实时监控数据可视化大屏

数据可视化面板预览

最后,进一步对大屏布局并设置一张好看的底图。

其中,lxml是python的一个解析库,支持HTML和XML的解析。

from bs4 import BeautifulSoup
with open("data_center.html", "r+", encoding='utf-8') as html:
html_1 = BeautifulSoup(html, 'lxml')
divs = html_1.select('.chart-container')
divs[0]["style"] = "width:10%;height:10%;position:absolute;top:0;left:2%;"
divs[1]["style"] = "width:40%;height:40%;position:absolute;top:12%;left:2%;"
divs[2]["style"] = "width:35%;height:10%;position:absolute;top:1%;left:30%;"
divs[3]["style"] = "width:40%;height:40%;position:absolute;top:10%;left:25%;"
divs[4]["style"] = "width:40%;height:35%;position:absolute;top:12%;left:55%;"
divs[5]["style"] = "width:30%;height:35%;position:absolute;top:60%;left:5%;"
divs[6]["style"] = "width:60%;height:50%;position:absolute;top:50%;left:35%;"

body = html_1.find("body")
body["style"] = """background-image:url("./img/test.jpg")""" # 背景图片

html_new = str(html_1)
html.seek(0, 0)
html.truncate()
html.write(html_new)
html.close()
#备注:divs[0]["style"] = "width:10%;height:10%;position:absolute;top:0;left:2%;"即是我们对宽度、高度、位置、上边距、左边距的定义,这里我们用百分比以达到屏幕自适应的效果。

效果图如下:

Python搭建一个系统信息实时监控数据可视化大屏

至此,一个实时系统信息监控面板开发完毕。其他功能可自行拓展,本文仅演示创建的具体流程,其他细节可进一步优化,如具体到单个应用的监测与控制。

文中包含所有代码,快动手尝试一下吧。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/92108.html

(0)

相关推荐

  • 风很大的百词斩APP 真的好用吗?

    近期,众测研究团接到不少朋友对英语学习的求助,主要问题集中在校园同学的应试和职场萌新们的口语两方面。但是,面对海量的英语学习APP,众人实在是盲人摸象,无从下手。于是,小编们在精挑...

    科技 2021年11月24日
  • 新京报晶竞科技:华为、比亚迪、BOE的晶振供应商。

    近年来智能家居越来越火,智能化已经成为家居行业的一种新趋势。远在公司,通过手机终端操作就能让家里的电饭煲定时开始煲汤,这操作的背后是多种新技术的融合,就以电饭煲定时这个功能来说,为何能精准控制煲汤一小时。这里面就涉及一个叫做石英晶振的基础元器件,石英晶体具有较高的频率稳定性,它通过稳定的脉冲为电饭煲中的微芯片提供基准频率信号,芯片在接受处理信息后实现对煲汤时间的控制。晶赛科技(NQ:871981)就是一家以生产销售石英晶振为主的企业。

    科技 2021年10月25日
  • 抗衰老中药有哪些,抗衰老的中成药

    我国的中医对抗衰老早有认识,《本草纲目》中列举了大约60 种可以称为“上品”的抗衰老中药,人们不用辛苦,只要能坚持做,很多简单的方法就能有效果。

    生活 2021年11月11日
  • 江西昕薇的海报“昕薇”!父母应该注意这些事情。

    截至目前,江西新冠病毒疫苗累计接种3253万人。近日,江西省启动3-11岁儿童新冠疫苗接种工作。未成年人的新冠疫苗接种工作一直受到广泛关注。接种疫苗有什么作用?是否影响生长发育?儿童接种新冠疫苗需注意哪些事项?家长和孩子们一起来看看。

    生活 2021年10月31日
  • 自从米饭学会这样做,我家3天2头吃,营养非常全面,孩子超喜欢,孩子只吃米饭

    导语:自从米饭学会这样做,我家3天2头吃,营养非常全面,孩子超喜欢!

    生活 2021年11月10日
  • 饮食预防癌症,吃对了才有效!营养学家推荐“三二三一”原则

    我国居民膳食结构正在发生一系列变化,食物变得越来越精细,这是一个社会进步,但是饮食不科学、不合理的问题也越来越突出。 对比居民食物的消费量变化,一个明显的趋势是:粮食吃得越来越少,...

    生活 2021年9月30日