Python采集linux服务器数据在Django Web界面展示

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Python采集linux服务器数据在Django Web界面展示

Django显示服务器性能监控

监控系统CPU、内存和进程信息

一、运行环境与项目目录

  1. Django 2.0.7
  2. python 3.7
  3. pymysql 0.9.3

二、配置文档:Setting

1.mysql 数据库

# Author: Allan
# Datetime: 2019-05-21
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        # 注释sqlite3
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        # mysql
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database',
        'USER': 'username',
        'PASSWORD': 'password',
        'HOST': 'ip',
        'PORT': 3306,
    }
}

2.Application definition

INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'web'  #添加App,下面python3 mkmigrations web使用
]
MIDDLEWARE = [
   'django.middleware.security.SecurityMiddleware',
   'django.contrib.sessions.middleware.SessionMiddleware',
   'django.middleware.common.CommonMiddleware',
   # 'django.middleware.csrf.CsrfViewMiddleware', 注释这一行,防止403错误
   'django.contrib.auth.middleware.AuthenticationMiddleware',
   'django.contrib.messages.middleware.MessageMiddleware',
   'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'monitor.urls'
TEMPLATES = [
   {
       'BACKEND': 'django.template.backends.django.DjangoTemplates',
       'DIRS': [os.path.join(BASE_DIR, 'templates')],  #修改模版目录
       'APP_DIRS': True,
       'OPTIONS': {
           'context_processors': [
               'django.template.context_processors.debug',
               'django.template.context_processors.request',
               'django.contrib.auth.context_processors.auth',
               'django.contrib.messages.context_processors.messages',
           ],
       },
   },
]

3.Security

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['*']

4.Internationalization

LANGUAGE_CODE = 'en-us'
# 修改时区
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
# 修改时区
USE_TZ = False

二、创建 Models,操作数据

from django.db import models
# Create your models here.
class CpuInfo(models.Model):
    # CPU信息
    time = models.DateTimeField()
    host = models.CharField(max_length=40)
    usage_system = models.FloatField(null=True)
    usage_user = models.FloatField(null=True)
    usage_softirq = models.FloatField(null=True)
    usage_iowait = models.FloatField(null=True)
class MemoryInfo(models.Model):
    #内存信息
    time = models.DateTimeField()
    host = models.CharField(max_length=40)
    used_percent = models.FloatField(null=True)
class ProcstatInfo(models.Model):
    # 进程信息
    time = models.DateTimeField()
    host = models.CharField(max_length=100)
    exe = models.CharField(max_length=40)
    pid = models.FloatField()
    cpu_usage = models.FloatField(null=True)
    memory_rss = models.FloatField(null=True)

三、创建数据库

1.Terminal 下运行manager.py

# python3 manager.py mkmigrations web
# python3 manager.py migrate

2.查询mysql

mysql> show tables;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    449745
Current database: perf_monitor
+----------------------------+
| Tables_in_perf_monitor     |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| web_cpuinfo                |
| web_memoryinfo             |
| web_procstatinfo           |
+----------------------------+
13 rows in set (0.51 sec)
mysql> 

四、 views.py


创建两个views,一个显示CPU和内存信息;另一个现实进程信息

# Author: Allan
# Datetime: 2019-05-21
import time
import json
from django.shortcuts import render
from web import models
# Create your views here.
def show_procstat(request):
    servers = ['rotestZone01', 'rotestZone02']
    procstat_ret = {}
    for server in servers:
        procstat_info = models.ProcstatInfo.objects.filter(host=server)
        procstat_exe = {}
        for row in procstat_info:
            temp_time = int(time.mktime(row.time.timetuple())) * 1000
            key = str(row.exe) + '_' + str(int(row.pid))
            if key not in procstat_exe:
                procstat_exe[key] = {}
                procstat_exe[key]['cpu_usage'] = []
                procstat_exe[key]['memory_rss'] = []
            procstat_exe[key]['cpu_usage'].append([temp_time, row.cpu_usage])
            procstat_exe[key]['memory_rss'].append([temp_time, row.memory_rss])
        procstat_ret[server] = procstat_exe
    return render(request, 'show_procstat.html', {"procstat_ret": json.dumps(procstat_ret)})
def show_servers(request):
    servers = ['rotestZone01', 'rotestZone02']
    server_res = {}
    cpu_res = {}
    mem_res = {}
    for server in servers:
        cpu_info = models.CpuInfo.objects.filter(host=server)
        cpu_ret = {}
        usage_system = []
        usage_user = []
        usage_softirq = []
        usage_iowait = []
        for row in cpu_info:
            temp_time = int(time.mktime(row.time.timetuple())) * 1000
            usage_system.append([temp_time, row.usage_system])
            usage_user.append([temp_time, row.usage_user])
            usage_softirq.append([temp_time, row.usage_softirq])
            usage_iowait.append([temp_time, row.usage_iowait])
        cpu_ret['usage_system'] = usage_system
        cpu_ret['usage_user'] = usage_user
        cpu_ret['usage_softirq'] = usage_softirq
        cpu_ret['usage_iowait'] = usage_iowait
        cpu_res[server] = cpu_ret
        mem_info = models.MemoryInfo.objects.filter(host=server)
        mem_ret = []
        for row in mem_info:
            temp_time = int(time.mktime(row.time.timetuple()))*1000
            mem_ret.append([temp_time, row.used_percent])
        mem_res[server] = mem_ret
    server_res['cpu_res'] = cpu_res
    server_res['mem_res'] = mem_res
    return render(request, 'show_servers.html', {"server_res": json.dumps(server_res)})

五、创建html模版


创建两个html模版,一个显示CPU和内存信息;另一个现实进程信息

<html xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8" />
<title>服务器监控信息</title>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<script src="https://code.highcharts.com/modules/export-data.js"></script>
<script language="JavaScript">
$(document).ready(function() {
    $("#servers").change(function (){
        var selected = $(this).children('option:selected').val();
        var server_res = jQuery.parseJSON('{{ server_res|safe }}');
        var cpu_res = server_res['cpu_res']
        var cpu_info = cpu_res[selected]
        Highcharts.setOptions({
            global:{
                useUTC: false
                }
            });
        Highcharts.chart('cpu', {
            chart: {
                zoomType: 'x'
            },
            title: {
                text: selected + ': CPU 信息'
            },
            subtitle: {
                text: document.ontouchstart === undefined ?
                    'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'
            },
            xAxis: {
                type: 'datetime'
            },
            yAxis: {
                title: {
                    text: '使用率 (%)'
                }
            },
            legend: {
                enabled: false
            },
            plotOptions: {
                area: {
                    fillColor: {
                        linearGradient: {
                            x1: 0,
                            y1: 0,
                            x2: 0,
                            y2: 1
                        },
                        stops: [
                            [0, Highcharts.getOptions().colors[0]],
                            [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
                        ]
                    },
                    marker: {
                        radius: 2
                    },
                    lineWidth: 1,
                    states: {
                        hover: {
                            lineWidth: 1
                        }
                    },
                    threshold: null
                }
            },
            series: [
                {
                   type: 'area',
                   name: 'usage_system',
                   data: cpu_info['usage_system']
                },
                {
                   type: 'area',
                   name: 'usage_user',
                   data: cpu_info['usage_user']
                },
                {
                   type: 'area',
                   name: 'usage_softirq',
                   data: cpu_info['usage_softirq']
                },
                {
                   type: 'area',
                   name: 'usage_iowait',
                   data: cpu_info['usage_iowait']
                }]
        });
        var mem_res = server_res['mem_res']
        var mem_info = mem_res[selected]
        Highcharts.chart('mem', {
            chart: {
                zoomType: 'x'
            },
            title: {
                text: selected + ': 内存信息'
            },
            subtitle: {
                text: document.ontouchstart === undefined ?
                    'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'
            },
            xAxis: {
                type: 'datetime'
            },
            yAxis: {
                title: {
                    text: '使用率 (%)'
                }
            },
            legend: {
                enabled: false
            },
            plotOptions: {
                area: {
                    fillColor: {
                        linearGradient: {
                            x1: 0,
                            y1: 0,
                            x2: 0,
                            y2: 1
                        },
                        stops: [
                            [0, Highcharts.getOptions().colors[0]],
                            [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
                        ]
                    },
                    marker: {
                        radius: 2
                    },
                    lineWidth: 1,
                    states: {
                        hover: {
                            lineWidth: 1
                        }
                    },
                    threshold: null
                }
            },
            series: [{
                type: 'area',
                name: 'used_percent',
                data: mem_info
            }]
        });
    });
});
</script>
</head>
<body>
<div><H2>服务器监控信息</H2></div>
<select id="servers">
    <option value="servers">请选择要监控的服务器</option>
    <option value="rotestZone01">rotestZone01</option>
    <option value="rotestZone02">rotestZone02</option>
</select>
<div id="cpu" style="width: 1560px; height: 400px; margin: 0 auto"></div>
<div id="mem" style="width: 1560px; height: 400px; margin: 0 auto"></div>
</body>
</html>
<html xmlns="http://www.w3.org/1999/html" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8" />
<title>服务器监控信息</title>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://code.highcharts.com/highcharts.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>
<script src="https://code.highcharts.com/modules/export-data.js"></script>
<script language="JavaScript">
$(document).ready(function() {
    $("#servers").change(function (){
        var selected = $(this).children('option:selected').val();
        var server_res = jQuery.parseJSON('{{ procstat_ret|safe }}');
        var xServers = server_res[selected]
        var obj=document.getElementById('processes');
        if (obj.options.length != 1){
            obj.options.length=1;
        }
        for(var key in xServers)
        {
            obj.options.add(new Option(key,key));
        }
        $("#processes").change(function (){
            var procSelected = $(this).children('option:selected').val();
            var dataMem = new Array();
            var dataCpu = new Array();
            for(var key in xServers)
                {
                    if (key == procSelected){
                        dataCpu = xServers[key]['cpu_usage']
                        dataMem = xServers[key]['memory_rss'];
                        break;
                    }
                }
            Highcharts.chart('cpu', {
            chart: {
                zoomType: 'x'
            },
            title: {
                text: selected + ': CPU 信息'
            },
            subtitle: {
                text: document.ontouchstart === undefined ?
                    'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'
            },
            xAxis: {
                type: 'datetime'
            },
            yAxis: {
                title: {
                    text: '使用率 (%)'
                }
            },
            legend: {
                enabled: false
            },
            plotOptions: {
                area: {
                    fillColor: {
                        linearGradient: {
                            x1: 0,
                            y1: 0,
                            x2: 0,
                            y2: 1
                        },
                        stops: [
                            [0, Highcharts.getOptions().colors[0]],
                            [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
                        ]
                    },
                    marker: {
                        radius: 2
                    },
                    lineWidth: 1,
                    states: {
                        hover: {
                            lineWidth: 1
                        }
                    },
                    threshold: null
                }
            },
            series: [
                {
                   type: 'area',
                   name: 'cpu_usage',
                   data: dataCpu
                }]
            });
            Highcharts.chart('mem', {
                chart: {
                    zoomType: 'x'
                },
                title: {
                    text: selected + ': 内存信息'
                },
                subtitle: {
                    text: document.ontouchstart === undefined ?
                        'Click and drag in the plot area to zoom in' : 'Pinch the chart to zoom in'
                },
                xAxis: {
                    type: 'datetime'
                },
                yAxis: {
                    title: {
                        text: '使用率 (%)'
                    }
                },
                legend: {
                    enabled: false
                },
                plotOptions: {
                    area: {
                        fillColor: {
                            linearGradient: {
                                x1: 0,
                                y1: 0,
                                x2: 0,
                                y2: 1
                            },
                            stops: [
                                [0, Highcharts.getOptions().colors[0]],
                                [1, Highcharts.Color(Highcharts.getOptions().colors[0]).setOpacity(0).get('rgba')]
                            ]
                        },
                        marker: {
                            radius: 2
                        },
                        lineWidth: 1,
                        states: {
                            hover: {
                                lineWidth: 1
                            }
                        },
                        threshold: null
                    }
                },
                series: [{
                    type: 'area',
                    name: 'memory_rss',
                    data: dataMem
                }]
            });
        });
    });
});
</script>
</head>
<body>
<div><H2>服务器监控信息</H2></div>
<div id="monitor">
    <select id="servers">
        <option value="server">请选择要监控的服务器</option>
        <option value="rotestZone01">rotestZone01</option>
        <option value="rotestZone02">rotestZone02</option>
    </select>
    <select id="processes">
        <option value="process">请选择要监控的进程</option>
    </select>
</div>
<div id="cpu" style="width: 1560px; height: 400px; margin: 0 auto"></div>
<div id="mem" style="width: 1560px; height: 400px; margin: 0 auto"></div>
</body>
</html>

六、urls.py添加路由

# Author: Allan
# Datetime: 2019-05-21
from django.contrib import admin
from django.urls import path
from web import views
urlpatterns = [
    # path('admin/', admin.site.urls),
    path('show_servers', views.show_servers),
    path('show_procstat', views.show_procstat),
]

七、运行程序,显示结果

# python3 manager.py runserver

CPU和内存信息

进程信息



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
W9
|
25天前
|
运维 关系型数据库 MySQL
轻松管理Linux服务器的5个优秀管理面板
Websoft9 应用管理平台,github 2k star 开源软件,既有200+的优秀开源软件商店,一键安装。又有可视化的Linux管理面板,文件、数据库、ssl证书方便快捷管理。
W9
76 1
|
28天前
|
缓存 Ubuntu Linux
Linux环境下测试服务器的DDR5内存性能
通过使用 `memtester`和 `sysbench`等工具,可以有效地测试Linux环境下服务器的DDR5内存性能。这些工具不仅可以评估内存的读写速度,还可以检测内存中的潜在问题,帮助确保系统的稳定性和性能。通过合理配置和使用这些工具,系统管理员可以深入了解服务器内存的性能状况,为系统优化提供数据支持。
34 4
|
16天前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
|
23天前
|
存储 运维 算法
服务器数据恢复—raid6阵列硬盘重组raid5阵列如何恢复raid6阵列数据?
服务器存储数据恢复环境: 存储中有一组由12块硬盘组建的RAID6阵列,上层linux操作系统+EXT3文件系统,该存储划分3个LUN。 服务器存储故障&分析: 存储中RAID6阵列不可用。为了抢救数据,运维人员使用原始RAID中的部分硬盘重新组建RAID并进行了初始化。 初始化开始一段时间后,运维人员察觉到情况有异后强制终止初始化,这个时候初始化已经完成一半以上。数据部分已被不可逆的破坏。
|
28天前
|
安全 Linux API
Linux服务器安全
人们常误认为服务器因存于数据中心且数据持续使用而无需加密。然而,当驱动器需维修或处理时,加密显得尤为重要,以防止数据泄露。Linux虽有dm-crypt和LUKS等内置加密技术,但在集中管理、根卷加密及合规性等方面仍存不足。企业应选择具备强大验证、简单加密擦除及集中管理等功能的解决方案,以弥补这些缺口。
24 0
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
160 3
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
173 45
|
17天前
|
前端开发 安全 JavaScript
2025年,Web3开发学习路线全指南
本文提供了一条针对Dapp应用开发的学习路线,涵盖了Web3领域的重要技术栈,如区块链基础、以太坊技术、Solidity编程、智能合约开发及安全、web3.js和ethers.js库的使用、Truffle框架等。文章首先分析了国内区块链企业的技术需求,随后详细介绍了每个技术点的学习资源和方法,旨在帮助初学者系统地掌握Dapp开发所需的知识和技能。
2025年,Web3开发学习路线全指南
|
24天前
|
存储 前端开发 JavaScript
如何在项目中高效地进行 Web 组件化开发
高效地进行 Web 组件化开发需要从多个方面入手,通过明确目标、合理规划、规范开发、加强测试等一系列措施,实现组件的高效管理和利用,从而提高项目的整体开发效率和质量,为用户提供更好的体验。
27 7
|
28天前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
下一篇
DataWorks