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)

相关推荐

  • 36氪数字时氪 X Google DevFest「数字低碳进行时」,11月28日上海见!|To B下午茶第2期报名开启

    伴随云计算、大数据、AI、物联网等企业级数字技术逐渐成熟,数字经济成为中国乃至全球的主要经济形态,与此同时,碳中和、碳达峰也成为中国国家战略目标,对行业及企业而言,实现低碳减排势在必行。

    科技 2021年11月21日
  • 个人养老金制度,养老金个人账户和统筹帐户

    今天,国家社会保障有关部们对我国养老保险制度进行了宣讲,指出今后养老保险将逐步推行个人账户制。我国实行的城乡分治的二元体制,在这种制度下,农村农民是“新农合”,农民可以根据自己的经济情况购买一定年限的保险,到法定年龄可以领取少量的养老金;城镇居民有正式工作的,是“职工养老保险制度”,养老金由个人和工作单位分别承担;而城镇没有正式工作的是城镇居民养老保险制度,个人可以根据自己的经济情况购买不同限额、不同年份的保险金,等到了国家法定退休年限后领取相应的养老保险金。2016年,国家统一了城乡居民养老保险金制度,也就是农村居民和城镇没有正式工作单位的个人同等对待。这对于促进城乡一体化发展有重要作用。而个人账户制度有两个方面的变化,一是鼓励大家早购买、多购买,而购买的养老金将通过国家承认的第三方机构通过理财投资的方式实现个人账户的增值保值;二是国家补贴也随之进入个人账户。当然个人账户的资金属于个人财产,依法受到国家保护,可以依法继承。这样,大家担心的保险金不够用的问题就从制度安排上有了保障。

    生活 2021年10月22日
  • 十年磨一剑,跨过百亿营收这个坎,骆驼股份有望迎来高速发展期

    骆驼股份,一家老牌的蓄电池企业,兢兢业业十几年,有望在今年首次迎来百亿的销售额,这不仅是对公司产品专业度的一种认可,也是对市场投资者最好的一种预期回报。公司能否砥砺前行,在新能源、储能电池上更进一步,是未来能否更进一步的关键所在!

    科技 2021年11月7日
  • 钢价跌超预期抄底一触即发(钢价还没跌到位不要急于抄底)

    从上半年的“手无寸铁”到下半年的“无人问津”,钢价在整个2021年走出了一个过山车般的行情,在全球大宗商品皆现“暴涨”和“暴跌”的背景下,钢市也进入到了一个“瑟瑟发抖”的凛冬之地,迷失了曾经那片繁荣的需求。

    生活 2021年12月13日
  • 中科创星米磊:未来的核心在大航天

    在科研创新成为社会发展核心推动力的今天,如何成就民族企业,抢占未来科技核心力量?在沙丘黄埔 8 期课堂上,米磊导师分享了他基于科技发展底层规律的投资逻辑。

    科技 2021年12月1日