• Python + Flask 实现接口接收 CPU 信息


    今天的内容是基于 Python + Flask 实现接口接收内存信息 来进一步分享如何使用 Python + Flask 接收 CPU 的信息。

    原理:

    通过 Python 调用 Shell 脚本去执行 CPU 的相关信息,然后进行处理再请求 Requests 库来向后端定义好的接口来推送数据。

    Part1:收集端

     1 import os
     2 import requests
     3 import json
     4 import time
     5  
     6 url="http://10.8.31.61:5555/GetCpuResource"
     7 cpu_data={}
     8 cpu_cmd = [
     9 "cat /proc/cpuinfo |grep 'processor' |wc -l",
    10 "cat /proc/cpuinfo |grep 'physical id'|sort |uniq |wc -l",
    11 "cat /proc/cpuinfo |grep 'cpu cores'|awk -F' ' '{print $4}' |sort |wc -l",
    12 "uptime |awk -F':' '{print $5}'"
    13 ]
    14 def exec_cmd():
    15     for cmd in cpu_cmd:
    16         print(cmd)
    17         response = os.popen(cmd)
    18         if("processor" in cmd):
    19             cpu_data['logic_cpu']=str(response.read()).replace("\n","")
    20         elif("physical" in cmd):
    21             cpu_data['physical_cpu']=str(response.read()).replace("\n","")
    22         elif("cores" in cmd):
    23             cpu_data['cpu_cores']=str(response.read()).replace("\n","")
    24         elif("uptime" in cmd):
    25             cpu_data['cpu_load'] = str(response.read()).replace("\n", "")
    26             if (len(cpu_data['cpu_load']) < 3):
    27                 response = os.popen("uptime |awk -F':' '{print $4}'")
    28                 cpu_data['cpu_load'] = str(response.read()).replace("\n", "")
    29  
    30     else:
    31         cpu_data['hostname']=str(os.popen("hostname |awk -F'.' '{print $1}' |awk -F'-' '{print $2}'").read()).replace("\n","")
    32     response.close()
    33  
    34 def httpPost(datas):
    35     header = {"Content-Type":"application/json"}
    36     resp_content = requests.post(url=url,data=json.dumps(datas),headers=header)
    37     print(resp_content.text)
    38  
    39 if __name__ == '__main__':
    40     while True:
    41         exec_cmd()
    42         httpPost(cpu_data)
    43         time.sleep(3600)

    Part2:接收端

     1 #CPU路由处理
     2 @resource.route('/GetCpuResource',methods=['POST'])
     3 def GetCpuResource():
     4     '''接收来自linux上传的数据'''
     5     query = request.get_json()
     6     hostname = query["hostname"]
     7     logic_cpu = query["logic_cpu"]
     8     physical_cpu = query["physical_cpu"]
     9     cpu_cores = query["cpu_cores"]
    10     cpu_load = query["cpu_load"]
    11     createtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    12     sql = "insert into cpu_info (hostname,logic_cpu,physical_cpu,cpu_cores,cpu_load,create_time) VALUES "
    13     data = "('" + hostname + "','" + logic_cpu + "','" + physical_cpu + "','" + cpu_cores + "','" + cpu_load + "','" + str(createtime) + "'"
    14     end = data + ")"
    15     sql = sql + end
    16     print(sql)
    17     db = conndb()
    18     db.execute_sql(sql)
    19     data = {'code': 200, 'message': 'success', 'status': '10000'}
    20     return json.dumps(data)

    Part3:展示端

    这部分主要分为以下两块内容:

    第一块是页面请求

    <template>
        <div>
            <div class="crumbs">
                <el-breadcrumb separator="/">
                    <el-breadcrumb-item>
                        <i class="el-icon-lx-cascades"></i> CPU信息
                    </el-breadcrumb-item>
                </el-breadcrumb>
            </div>
            <div class="container">
                <div class="handle-box">
                    <el-input v-model="query.hostname" placeholder="环境" class="handle-input mr10" clearable @clear="clear_name"></el-input>
                    <el-button type="primary" icon="el-icon-search" @click="handleSearch">搜索</el-button>
                </div>
                <el-table
                    :data="tableData"
                    border
                    class="table"
                    ref="multipleTable"
                    header-cell-class-name="table-header">
                    <el-table-column prop="id" label="ID" width="55" align="center"></el-table-column>
                    <el-table-column prop="hostname" label="环境"></el-table-column>
                    <el-table-column prop="logic_cpu" label="逻辑CPU"></el-table-column>
                    <el-table-column prop="physical_cpu" label="物理CPU"></el-table-column>
                    <el-table-column prop="cpu_cores" label="CPU核数"></el-table-column>
                    <el-table-column prop="cpu_load" width="255" label="CPU负载Avg[1min,5min,15min]"></el-table-column>
                    <!--<el-table-column prop="available" label="可用">-->
                      <!--<template #default="scope">-->
                            <!--<el-tag :type="availableplus(scope.row.available) === 'success' ? 'success': 'danger'">{{ scope.row.available }}</el-tag>-->
                      <!--</template>-->
                    <!--</el-table-column>-->
                    <el-table-column prop="create_time" width="160" label="创建时间"></el-table-column>
                </el-table>
              <el-pagination
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
                :current-page="query.pageIndex"
                :page-sizes="[5, 10, 20, 30]"
                :page-size="query.pageSize"
                layout="total, sizes, prev, pager, next, jumper"
                :total="parseInt(pageTotal)">
              </el-pagination>
            </div>
        </div>
    </template>
     
    <script>
    import server from '../api/request.js'
    export default {
      name: 'InterfaceCpu',
      data () {
        return {
          query: {
            hostname: '',
            pageIndex: 1,
            pageSize: 10
          },
          tableData: [],
          pageTotal: 0
        }
      },
      created () {
        this.getMemData()
      },
      methods: {
        // 获取后端返回的真实数据
        getMemData () {
          server({url: '/getCpuList', data: this.query, method: 'post'})
            .then(response => {
              console.log('**********')
              console.log(response)
              this.tableData = response.listdata
              console.log(this.tableData)
              this.pageTotal = response.pageTotal || 5
            })
        },
        // 触发搜索按钮
        handleSearch () {
          server({url: '/getCpuList', data: this.query, method: 'post'})
            .then(response => {
              console.log(response)
              this.tableData = response.listdata
              console.log(this.tableData)
              this.pageTotal = response.pageTotal || 5
            })
        },
        // 分页导航
        handleSizeChange (val) {
          // console.log(val)
          this.$set(this.query, 'pageSize', val)
          // console.log(this.query)
          this.getMemData()
        },
        // 翻页改变页码触发
        handleCurrentChange (val) {
          this.$set(this.query, 'pageIndex', val)
          this.getMemData()
        },
        clear_name () {
          this.query.hostname = ''
          this.getMemData()
        },
        freeplus(rows){
          const free =rows.replace("M","")
          // console.log(free)
          // console.log(typeof free)
          return Number(free) <100 ? 'danger' : 'success'
        },
        availableplus(rows){
          const availabl =rows.replace("M","")
          // console.log(free)
          // console.log(typeof free)
          return Number(availabl) <1000 ? 'danger' : 'success'
        }
      }
    }
    </script>
     
    <style scoped>
    .handle-box {
        margin-bottom: 20px;
    }
     
    .handle-select {
        width: 120px;
    }
     
    .handle-input {
        width: 300px;
        display: inline-block;
    }
    .table {
        width: 100%;
        font-size: 14px;
    }
    .red {
        color: #ff0000;
    }
    .mr10 {
        margin-right: 10px;
    }
    .table-td-thumb {
        display: block;
        margin: auto;
        width: 40px;
        height: 40px;
    }
    </style>

    第二块是后端请求处理

     1 @resource.route('/getCpuList',methods=['POST'])
     2 def getCpuList():
     3     '''fe的页面列表数据获取'''
     4     query = request.get_json()
     5     print(query)
     6     if (query["hostname"] == ""):
     7         sql1 = "select id,hostname,logic_cpu,physical_cpu,cpu_cores,cpu_load,create_time from cpu_info  order by id DESC limit " + str(
     8             (query['pageIndex'] - 1) * query["pageSize"]) + "," + str(query["pageSize"])
     9         count_sql = "select count(*) from mem_info"
    10         colume_sql = "select id from mem_info"
    11  
    12     else:
    13         sql1 = "select id,hostname,logic_cpu,physical_cpu,cpu_cores,cpu_load,create_time from cpu_info where hostname like '%" + str(query["hostname"]) + "%' order by id DESC" + " limit " + str(
    14             (query['pageIndex'] - 1) * query["pageSize"]) + "," + str(query["pageSize"])
    15         count_sql = "select count(*) from cpu_info where hostname like '%" + str(
    16             query["hostname"]) + "%' order by id DESC"
    17         colume_sql = "select id from cpu_info"
    18  
    19     sql2 = "select id,hostname,logic_cpu,physical_cpu,cpu_cores,cpu_load,create_time from cpu_info"
    20     db = conndb()
    21     listdata = db.get_data(sql1, sql2)
    22     db = conndb()
    23     result = db.get_data(count_sql, colume_sql)
    24     print(result)
    25     pageTotal = result[0]['id']
    26     print(listdata)
    27     print(pageTotal)
    28     data = {'listdata': listdata, "pageTotal": pageTotal, "code": 200}
    29     return json.dumps(data)

    Part4:页面展示

    欢迎关注【无量测试之道】公众号,回复【领取资源】

    Python+Unittest框架API自动化、

    Python+Unittest框架API自动化、

    Python+Pytest框架API自动化、

    Python+Pandas+Pyecharts大数据分析、

    Python+Selenium框架Web的UI自动化、

    Python+Appium框架APP的UI自动化、

    Python编程学习资源干货、

    资源和代码 免费送啦~
    文章下方有公众号二维码,可直接微信扫一扫关注即可。

    备注:我的个人公众号已正式开通,致力于IT互联网技术的分享。

    包含:数据分析、大数据、机器学习、测试开发、API接口自动化、测试运维、UI自动化、性能测试、代码检测、编程技术等。

    微信搜索公众号:“无量测试之道”,或扫描下方二维码:

    添加关注,让我们一起共同成长!

  • 相关阅读:
    python解析本地HTML文件
    爬取潇湘书院首页侧边栏
    Python文件的读取写入操作
    Python错误和异常
    Python字典
    python列表
    电文加密小程序
    课后练习题随笔(一)
    Redis基础操作
    Django学习_BBS开发
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/15775150.html
Copyright © 2020-2023  润新知