1. 程式人生 > >使用Flask結合python實現多臺服務的內存監控

使用Flask結合python實現多臺服務的內存監控

python flask 內存監控

使用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、我們先查看一下內存的信息

[root@centos 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、安裝數據庫,並創建數據庫和表。

為了減少資源的開銷,所以我們兩臺機器都裝上mysqlcentos1-6.5Centos2-6.5同時執行以下命令。

[root@centos ~]#yum  install  -y  mysql-server  mysql-devel

#啟動mysql

[root@centos ~]#/etc/init.d/mysqld  start

#快速配置,設置root密碼:

[root@centos ~]#mysql_secure_installation

創建數據庫:

[root@centos ~]# 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服務器:


[root@centos2 ~]# mysql -u root –p123456   ##給予其它用戶以root遠程登錄到本地mysql 
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES


3安裝MySQL模塊,編寫腳本。

[root@centos ~]# yum  install  MySQL-python   -y
[root@centos2 ~]# yum  install  MySQL-python   -y


編寫腳本監控內存腳本:

Centos

[root@centos~]# 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

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

#使用pip安裝pythonflask模塊:

[root@centos ~]#pip  install  flask

2、編輯後臺頁面

[root@centos ~]# 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) 我們可以看看結構:

[root@centos 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

[root@centos ~]# 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瀏覽器),查看網頁的數據

[root@centos mem]# python mysql.py
[root@centos2 mem]# python mysql.py
[root@centos 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 –

技術分享圖片

我們可以發現,我們已經獲取到兩臺主機的內存得使用情況了。以上是本人的實現監控的搭建過程希望能幫到大家。


使用Flask結合python實現多臺服務的內存監控