monitoring.py 4.4 KB
from os import cpu_count, read
from app.models import *
from app.util.component.ApiTemplate import ApiTemplate
import paramiko
import re
import time


class Api(ApiTemplate):
    api_name = "远程监控"

    def process(self):

        # 返回结果
        res = {}
        res["data"] = {}
        try:
            # 业务逻辑
            client = paramiko.SSHClient()
            client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
            client.connect(hostname='172.26.60.100',
                           username='root', password='DMap@123')
            # cpu
            order = "top -b -n1 | sed -n '3p' | awk '{print $2}'"
            stdin, stdout, stderr = client.exec_command(order)
            cpu_usage = stdout.read().decode().split("\n")[0]  # cpu使用率

            # 内存
            order = "free -h | sed -n '2p' | awk '{print $2}'"
            stdin, stdout, stderr = client.exec_command(order)
            totalMem = stdout.read().decode().split("\n")[0]  # 总内存

            order = "free -h | sed -n '3p' | awk '{print $3}'"
            stdin, stdout, stderr = client.exec_command(order)
            freeMem = stdout.read().decode().split("\n")[0]  # 空余内存

            # disk
            order = "df -m | grep -v 'overlay\|Filesystem' | awk '{print $1,$2,$3}' | grep /dev | awk '{print $2}' | awk -v total=0 '{total+=$1}END{print total}'"
            stdin, stdout, stderr = client.exec_command(order)
            totalDisk = int(stdout.read().decode().split("\n")
                            [0])  # 总磁盘空间,单位Mb

            order = "df -m | grep -v 'overlay\|Filesystem' | awk '{print $1,$2,$3}' | grep /dev | awk '{print $3}' | awk -v total=0 '{total+=$1}END{print total}'"
            stdin, stdout, stderr = client.exec_command(order)
            usedDisk = int(stdout.read().decode().split("\n")
                           [0])  # 已使用磁盘空间,单位Mb

            # network
            # 接收的字节数
            rx_time = []
            rx_bytes = []
            tx_time = []
            tx_bytes = []

            # 接收的字节数
            order = "ifconfig | grep RX | grep -v 'errors'| awk -v total=0 '{total+=$5}END{print total}'"
            i = 0
            while i < 2:
                i = i+1
                stdin, stdout, stderr = client.exec_command(order)
                rx_time.append(time.time())
                rx_bytes.append(int(stdout.read().decode().split("\n")[0]))

            # 发送的字节数
            order = "ifconfig | grep TX | grep -v 'errors'| awk -v total=0 '{total+=$5}END{print total}'"
            i = 0
            while i < 2:
                i = i+1
                stdin, stdout, stderr = client.exec_command(order)
                tx_time.append(time.time())
                tx_bytes.append(int(stdout.read().decode().split("\n")[0]))

            res["data"] = {
                "cpuUsage": "{}%".format(cpu_usage),
                "totalMemory": "{}".format(totalMem),
                "freeMemory": "{}".format(freeMem),
                "totalDisk": "{}".format(self.format_value(totalDisk*1024**2)),
                "usedDisk": "{}".format(self.format_value(usedDisk*1024**2)),
                "networkRecv": "{}".format(self.format_value((rx_bytes[1] - rx_bytes[0])/(rx_time[1]-rx_time[0]))),
                "networkSend": "{}".format(self.format_value((tx_bytes[1] - tx_bytes[0])/(tx_time[1]-tx_time[0])))
            }

            res["result"] = True
        except Exception as e:
            raise e
        finally:
            client.close()
        return res

    api_doc = {

        "tags": ["监控接口"],
        "parameters": [
        ],
        "responses": {
            200: {
                "schema": {
                    "properties": {
                    }
                }
            }
        }
    }

    def format_value(self, value):
        if value > 1024**3:
            value = "{}GB".format(format(value/1024.0**3, '.1f'))
        elif value > 1024**2:
            value = "{}MB".format(format(value / 1024.0 ** 2, '.1f'))
        elif value > 1024:
            value = "{}KB".format(format(value / 1024.0, '.1f'))
        else:
            value = "{}B".format(format(value, '.1f'))
        return value


if __name__ == '__main__':
    api = Api()
    api.process()