使用Flask结合python实现多台服务的内存监控

使用Flask结合python实现多台服务的内存监控

 

简介:使用flask结合python可以很好的实现服务资源的监控,而且Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。

接下来我们实现多台服务器的内存监控,并出图。

环境:centos1-6.5  ip:172.25.0.31   ##做flask python数据获取

Centos2-6.5  ip:172.25.0.32   ##做本地内存消耗数据的获取

实现过程:

一、内存数据的获取,并写入到数据库

1、我们先查看一下内存的信息

[[email protected] mem]# cat /proc/meminfo
MemTotal:        1528700 kB
MemFree:          221028 kB
Buffers:          130764 kB
Cached:           604596 kB
SwapCached:         8440 kB

说明:

buffers是指用来给块设备做的缓冲大小

cached是用来给文件做缓冲。

MemFree 是空闲内存

已使用内存算法:

已使用内存 = MemTotal - MemFree - Buffers - Cached

2、安装数据库,并创建数据库和表。

为了减少资源的开销,所以我们两台机器都装上mysql,centos1-6.5,Centos2-6.5同时执行以下命令。

[[email protected] ~]#yum  install  -y  mysql-server  mysql-devel

#启动mysql

[[email protected] ~]#/etc/init.d/mysqld  start

#快速配置,设置root密码:

[[email protected] ~]#mysql_secure_installation

创建数据库:

[[email protected] ~]# mysql  -uroot  -p123456
mysql> create database  memory;
mysql> use memory;
mysql> create table memory (memory int, time int);

注意1:用time字段表示时间戳,使用int类型为简单化,这里的数据库名和表名,还有字段名,都使用memory,含义不同

注意2:我们在centos需要在centos2上获取到写入的数据,所以我们要添加权限,让别的主机登录连接到centos2的数据库;

过程如下:

直接授权

  从任何主机上使用root用户,密码:123456(你的root密码)连接到mysql服务器:

[[email protected] ~]# mysql -u root –p123456   ##给予其它用户以root远程登录到本地mysql 
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES

3、安装MySQL模块,编写脚本。

[[email protected] ~]# yum  install  MySQL-python   -y
[[email protected] ~]# yum  install  MySQL-python   -y

编写脚本监控内存脚本:

Centos

[[email protected]~]# cat mem/mysql.py    ##同时把脚本复制到centos2就可以了
# -*- coding:utf-8 -*-
 
import time
import os
import MySQLdb as mysql
 
db = mysql.connect(user="root", passwd="123456", db="memory", host="localhost")
db.autocommit(True)
cur=db.cursor()
 
def saveMem():
     a="awk 'NR==1{print $2}' /proc/meminfo"
     file = os.popen(a)
     total=int(file.read())
 
     b="awk 'NR==2{print $2}' /proc/meminfo"
     file =os.popen(b)
     free =int(file.read())
 
     c="awk 'NR==3{print $2}' /proc/meminfo"
     file = os.popen(c)
     buffer =int(file.read())
 
     d="awk 'NR==4{print $2}' /proc/meminfo"
     file =os.popen(d)
     cache =int(file.read())
 
     mem_used=total-free-buffer-cache
     print mem_used/1024
     #mem = mem_used/1024 
     cur_time = int(time.time())
     sql = 'insert into memory (memory, time) value (%s,%s)'%(mem_used,cur_time)
     cur.execute(sql)
while True:
         saveMem()
         time.sleep(1)   # sleep 1 second

二、展现信息

1、构建web服务:

安装flask

在centos1上执行

使用flask框架构建web服务

#安装pip

[[email protected] ~]# mkdir /root/tools
[[email protected] ~]# cd   /root/tools
[[email protected] ~]#wget  --no-check-certificate  https://bootstrap.pypa.io/get-pip.py
[[email protected] ~]#python  get-pip.py

#使用pip安装python的flask模块:

[[email protected] ~]#pip  install  flask

2、编辑后台页面

[[email protected] ~]# cat /mem/flask_web.py
# -*- coding:utf-8 -*-
from flask import Flask,render_template   
import MySQLdb as mysql
import  json
con1 = mysql.connect(user="mysql", passwd="123456", db="memory", host="172.25.0.32")
con1.autocommit(True)
cur1 = con1.cursor()
 
con2 = mysql.connect(user="root", passwd="123456", db="memory", host="localhost")
con2.autocommit(True)
cur2 = con2.cursor()
 
app = Flask(__name__) 
last_time1 = 0
last_time2 = 0
@app.route('/')  
def index():
         return render_template('index.html')
@app.route('/data/a')
def data_a():
        global last_time1
         if (last_time1 > 0):
                   sql = 'select * from memory where time>%s' %(last_time1/1000)
         else:
                 sql = 'select * from memory'
         cur1.execute(sql)
         arr = []
         for i in cur1.fetchall():
                #print i    #在启动flask web服务的终端打印
                arr.append([i[1]*1000, i[0]/1024])   #再除以1024,以MB为单位
         #return 'ok'
        if (len(arr) > 0):
                   last_time1 = arr[-1][0]
 
         return json.dumps(arr)
@app.route('/data/b')
def data_b():
        global last_time2
        if (last_time2 > 0):
                sql = 'select * from memory where time>%s' %(last_time2/1000)
        else:
                sql = 'select * from memory'
        cur2.execute(sql)
        arr = []
        for i in cur2.fetchall():
               #print i    #在启动flask web服务的终端打印
                arr.append([i[1]*1000, i[0]/1024])   #再除以1024,以MB为单位
        #return 'ok'
        if (len(arr) > 0):
                last_time2 = arr[-1][0]
 
        return json.dumps(arr)
 
 
if __name__=='__main__':
        app.run(host='172.25.0.31', port=9092, debug=True)

3、使用图表展现

1)         准备用于显示图片的基础js文件

jquery.js 和 highstock.js   ##这个网上很多有下载

并把这两个文件保存到网站根目录下的static子目录下,导入以上两个基础js文件,用来渲染页面。

2)         我们可以看看结构:

[[email protected] mem]# tree
.
├── flask_web.py
├── mysql.py
├── static
│   ├── highstock.js
│   └── jquery.js
└── templates
    └── index.html

3)         接下来,使用highchats图标,选择图表模板,选择一个基本的图,然后把js代码复制带index.html文件中。

https://www.hcharts.cn/demo/highstock/basic-line

4)         修改前端页面中,配置网页index.html:

[[email protected] ~]# cat /mem/templates/index.html
<html>
<head>
        <title> my memory monitor </title>
</head>
 
<body>
<div id="container" style="min-width:400px;height:400px"></div>
 
<script src='/static/jquery.js'></script>
<script src='/static/highstock.js'></script>
<script type="text/javascript"> 
     Highcharts.setOptions({ global: { useUTC: false } });  
</script>              
<script>
$(function () {
    var seriesOptions = [],
        seriesCounter = 0,
        names = ['a','b'],
        // create the chart when all data is loaded
        createChart = function () {
            $('#container').highcharts('StockChart', {
                rangeSelector: {
                    selected: 4
                },
                yAxis: {
                    labels: {
                        formatter: function () {
                            return (this.value > 0 ? ' + ' : '') + this.value + '%';
                        }
                    },
                    plotLines: [{
                        value: 0,
                        width: 2,
                        color: 'silver'
                    }]
                },
                plotOptions: {
                    series: {
                        compare: 'percent'
                    }
                },
                tooltip: {
                    pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b> ({point.change}%)<br/>',
                    valueDecimals: 2
                },
                series: seriesOptions
            });
        };
    $.each(names, function (i, name) {
        $.getJSON('/data/' + name.toLowerCase(),    function (data) {
            seriesOptions[i] = {
                name: name,
                data: data
            };
            // As we're loading the data asynchronously, we don't know what order it will arrive. So
            // we keep a counter and create the chart when all the data is loaded.
            seriesCounter += 1;
            if (seriesCounter === names.length) {
                createChart();
            }
        });
    });
});
 
</script>
</body>
</html>

四、执行脚本使用调试模式(google浏览器),查看网页的数据

[[email protected] mem]# python mysql.py
[[email protected] mem]# python mysql.py
[[email protected] mem]# python flask_web.py
 * Running on http://172.25.0.31:9092/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 171-534-904
172.25.0.2 - - [28/Nov/2017 21:35:57] "GET / HTTP/1.1" 200 -
172.25.0.2 - - [28/Nov/2017 21:35:57] "GET /data/a HTTP/1.1" 200 -
172.25.0.2 - - [28/Nov/2017 21:35:57] "GET /data/b HTTP/1.1" 200 -
172.25.0.2 - - [28/Nov/2017 21:35:59] "GET / HTTP/1.1" 200 -
172.25.0.2 - - [28/Nov/2017 21:35:59] "GET /data/a HTTP/1.1" 200 -
172.25.0.2 - - [28/Nov/2017 21:35:59] "GET /data/b HTTP/1.1" 200 –

我们可以发现,我们已经获取到两台主机的内存得使用情况了。以上是本人的实现监控的搭建过程希望能帮到大家。

时间: 2024-08-29 15:03:01

使用Flask结合python实现多台服务的内存监控的相关文章

Flask —— 使用Python和OpenShift进行即时Web开发

最近Packtpub找到了我,让我给他们新出版的关于Flask的书写书评.Flask是一个很流行的Python框架.那本书是Ron DuPlain写的<Flask 即时Web开发>.我决定把“30天学习30种新技术”挑战的第三天花在Flask上.在本文中,我首先将介绍Flask框架的一些基本知识,然后提供一个短篇的书评.同样,我也会把示例应用移植到OpenShift上.对于Flask而言我不是一个完全意义上的新手,我也用它创建过示例应用.对我来说,这是一次很好的温习. 给不了解这一系列文章的读

在Mopaas上部署WSGI类型的(Django, Tornado, Flask)Python应用

第一部分:安装必要工具. 1.因为这是部署Python开发环境,所以安装pip可以简化一些软件的安装过程.(PIP对应Lua的luarocks) sudo apt-get install python-pip 安装三个Python框架 sudo pip install flask sudo pip install django==1.5.1 sudo pip install tornado==3.1.1 2.安装Gunicorn,这是运行Python的WSGI HTTP服务. sudo pip

使用python来建立http服务

python建立http服务 首先我们的windos上要安装python解释器,然后进入我要想要传递的文件的目录下,从当前的目录下进入cmd 然后通过Python解释器输入 python -m http.server 就会通过python解释器在这个目录建立了一个http链接 我们在其他的windos电脑上的浏览器上输入这台机器的ip机上8000端口就可以了 python解释器建立http服务 可以windos之间传递 也可以windos与linux之间传递 windos与linux之间的文件相

python一句话启动http服务

有时候局域网共享个东西不方便,尤其在服务器上的时候,总不能先下载下来,再上传上去吧,于是经常在这台机器用python起个http服务,然后去另一台机器直接访问,一来二去,妥试不爽,特进行一下分离 python3 python -m http.server 80 Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ... python2 python -m SimpleHTTPServer 80 Serving HTTP on 0.0.0.0

利用Python脚本管理Windows服务

Windows服务常用的功能就是启动服务,关闭服务,重启服务和查询服务运行状态,其中查询服务运行状态是其他三种操作的基础. 本文中提到的使用Python脚本管理Windows服务实际上是调用win32serviceutil模块,此模块来自pywin32包,此模块本身有管理服务的功能,有兴趣的可以去阅读它的部分源码. 本脚本存在的目的是为了熟练Python的语法和基本操作,Windows下有更好的命令行工具来管理服务,如sc.Powershell等.通常命令行工具的执行速度要比services.m

用python做linux的服务安装脚本 - vncserver

linux服务器在标准安装后,就集成了万能胶水python,python应用于科学计算.web服务.服务管理等等方面,既然这么方便何不利用python来做linux服务的安装脚本呢? 基本上一个linux操作系统安装好后,会安装基础服务应用,比如ftp.vncserver等等,其他的都是根据实际应用来安装,每次安装这些服务都要上网查查安装步骤,照步骤来走基本上不会走错. 设想一个场景,安装好linux操作系统后,通过网页从邮箱把python脚本下载下来,直接 python 脚本.py 即可.安全

dubbo集群服务下一台服务挂了对服务调用的影响

一.问题描述:项目中2台dubbo服务给移动端提供查询接口,移动端反应说查询时而很快(秒刷),时而很慢(4-5秒). 二.问题分析: 1.问题猜想:网络不稳定原因导致,但是切换公司wifi和手机4G,问题依旧存在.说明问题不是网络原因导致 2.因为服务提供者中有记录服务响应时间日志,打开2台服务提供者的日志,发现有一台不会打印最新日志,而所有的服务调用都在另一台,检查发现一台dubbo服务已经挂了(mark可能是问题原因).   继续分析正常使用的dubbo服务的响应日志发现..响应时间都在20

Linux下设置python脚本文件为服务

(最简单的方式nohup python xxx.py) ------------------------------------------------------------------------------------------------------------------- Python脚本开机自动运行:本帖适用于使用systemd的Linux系统,现在流行的Linux发行版都使用systemd. 后台服务程序是随系统自启动的,我们只要把Python脚本配置为服务就行了.需要注意的一

用 Python 脚本实现对 Linux 服务器的监控

hon 分享到:8 原文出处: 曹江华 目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控. 本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写. Python 版本说明 Python 是由 Guido va