前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python搭建一个系统信息实时监控数据可视化大屏

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

作者头像
用户8949263
发布2022-04-08 13:01:54
2.3K0
发布2022-04-08 13:01:54
举报
文章被收录于专栏:Python数据分析实例

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

1、数据库中创建数据表

2、建立数据库连接

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

3、监控中心大屏制作

具体步骤:

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

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

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

代码语言:javascript
复制
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()

2、建立数据库连接

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

代码语言:javascript
复制
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开始,后面再优化这个细节。

3、监控中心大屏

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

代码语言:javascript
复制
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)

数据可视化面板预览

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

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

代码语言:javascript
复制
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%;"即是我们对宽度、高度、位置、上边距、左边距的定义,这里我们用百分比以达到屏幕自适应的效果。

效果图如下:

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据分析实例 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档