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自动化、性能测试、代码检测、编程技术等。
微信搜索公众号:“无量测试之道”,或扫描下方二维码:
添加关注,让我们一起共同成长!