[周末往期回顾]使用Django获取Linux性能数据并存放在redis中
1. 开发环境
操作系统:CentOS 7.4
Python版本 :3.6
Django版本: 1.10.5
操作系统用户:oms
前面介绍了如何使用Python获取Linux/unix系统的CPU 内存数据
并将需要的系统信息放在了Django中
这里我们使用Djangp批量获取Linux性能数据
2. 获取原理
我们通过paramiko模块来获取相关信息
关于redis存储,我们选择的value的数据类型为列表
1. 新建redis表存放监控数据
我们无需事先建立redis的key值
2. 编写自定义命令获取性能数据并存入redis中
如何创建自定义命令请参考
http://www.zhaibibei.cn/oms/3.1/
3. 程序解析
3.1 主体程序
这里我们用linuxperformance_redis.py程序来获取CPU 内存信息
改程序在每小时的0,15,30,45分别执行
vim monitor/management/commands/linuxperformance_redis.py
#coding=utf-8
from django.core.management.base import BaseCommand
from monitor.models import linuxlist
import os
import redis
import time
from time import ctime,sleep
import threading
from monitor.command.getlinuxinfo import *
class Command(BaseCommand):
def handle(self, *args, **options):
def getperformance(i):
if i.monitor_type==1 and i.performance_type==1:
ipaddress=i.ipaddress
username=i.username
password=i.password
hostname1=i.hostname
try:
if i.os=='linux':
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=ipaddress,port=22,username=username,password=password)
linuxcpu=getlinuxcpu(ssh)
linuxmem=getlinuxmem(ssh)
ssh.close()
dskey='CPU='+ipaddress+'='+hostname1
value=nowtime+':'+ str(linuxcpu)
if flag==1:
value1=nnowtime+':'+ str(linuxcpu)
r.lpush(dskey,value1)
r.lpush(dskey,value)
dskey='MEMORY='+ipaddress+'='+hostname1
value=nowtime+':'+ str(linuxmem)
if flag==1:
value1=nnowtime+':'+ str(linuxmem)
r.lpush(dskey,value1)
r.lpush(dskey,value)
# print ipaddress+hostname1
else:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=ipaddress,port=22,username=username,password=password)
unixcpu=getunixcpu(ssh)
unixmem=getunixmem(ssh)
ssh.close()
dskey='CPU='+ipaddress+'='+hostname1
value=nowtime+':'+ str(unixcpu)
if flag==1:
value1=nnowtime+':'+ str(unixcpu)
r.lpush(dskey,value1)
r.lpush(dskey,value)
dskey='MEMORY='+ipaddress+'='+hostname1
value=nowtime+':'+ str(unixmem)
if flag==1:
value1=nnowtime+':'+ str(unixmem)
r.lpush(dskey,value1)
r.lpush(dskey,value)
except Exception as e:
result1=str(e)+ipaddress
mailcontent.append(result1)
print (mailcontent)
time.sleep(10)
#print 'get linux performance'
mailcontent=[]
r=redis.StrictRedis()
check_time=time.strftime('%Y%m%d%H %M', time.localtime())
if check_time.split()[1]=='00':
flag=1 #flag used to determin when should push two times
nowtime=str(time.mktime(time.strptime(check_time,'%Y%m%d%H %M'))).split('.')[0]
nnowtime=str(int(str(time.mktime(time.strptime(check_time,'%Y%m%d%H %M'))).split('.')[0])-1)
else:
flag=0
nowtime=str(time.mktime(time.strptime(check_time,'%Y%m%d%H %M'))).split('.')[0]
ip=linuxlist.objects.all().order_by('ipaddress')
threads=[]
for i in ip:
t1 = threading.Thread(target=getperformance,args=(i,))
threads.append(t1)
for t in threads:
# t.setDaemon(True)
t.start()
t.join()
#r.save()
#print (mailcontent)
3.2 调用的函数
上面主体程序调用了一些函数用于获取信息
文件路径为monitor/command/getlinuxinfo.py
这里选取几个,具体的参见我的github主页,可根据实际情况进行调整
获取Linux系统CPU信息
def getlinuxcpu(ssh):
result=[]
stdin,stdout,stderr=ssh.exec_command('sar 2 3 |awk 'END {print 100-$NF}'')
err=stderr.readlines()
if len(err) != 0:
print (err)
return False
else:
stdout_content=stdout.readlines()
result= stdout_content
if len(result) !=0:
return round(float(result[0].strip()),2)
else:
print ('can not find linux sar command')
获取Linux系统内存信息
def getlinuxmem(ssh):
result=[]
stdin,stdout,stderr=ssh.exec_command('free -m |awk ' NR==2 {print (($3 - $6 - $7)/$2)*100}'')
err=stderr.readlines()
if len(err) != 0:
print (err)
return False
else:
stdout_content=stdout.readlines()
result= stdout_content
if len(result) !=0:
return round(float(result[0].strip()),2)
else:
print ('can not find linux free command')
获取Unix系统CPU信息
def getunixcpu(ssh):
result=[]
stdin,stdout,stderr=ssh.exec_command('sar 1 3 |awk 'END {print 100-$NF }'')
err=stderr.readlines()
if len(err) != 0:
print (err)
return False
else:
stdout_content=stdout.readlines()
result= stdout_content
if len(result) !=0:
return round(float(result[0].strip()),2)
else:
print ('can not find unix sar command')
这个程序讲解如下:
- 首先从linuxlist表中获取信息
- 遍历每个数据库,当monitor_type为1和performance_type为1时继续
- 利用取出来的信息连接Linux/Unix,当连接成功后根据系统类型选择相应的函数来获取CPU内存信息
- 接下来使用redis的push功能保存数据
为方便后面处理数据,如果时间点为整点时,则保留2条信息,如当前时间为2017-12-12-0:00则会在2017-12-11-23:59保存一条相同数据
3.3 一些注意事项
- 采用Python的多线程同时获取多个系统的信息
- 关于保存的时间采用绝对时间,并且整点会保存2次
- flag用来决定该时间段是否为整点
- 这里调用了send_mail函数用于程序运行异常时通知我
4. 最终结果
使用如下命令运行
/usr/bin/python /home/oms/mysite/manage.py linuxperformance_redis
可以看出数据库的信息已经保存在redis数据库中了
5. 设置自动运行
这里我们设置每十五分钟运行一次,并重定向所有日志至一个文件
这样我们可以通过检查该日志文件判断脚本是否正常运行
0,15,30,45 * * * * /usr/bin/python /home/oms/mysite/manage.py linuxperformance_redis >>/home/oms/mysite/crontab.log 2>&1
5.源代码位置
欢迎访问我的github主页查看源码
https://github.com/bsbforever/oms_django
好了,这节介绍了如何利用自定义命令获取LInux/Unix服务器的信息并保存在redis数据库中
下节介绍如何将这些数据展示在一个页面上
- asp.net mvc中的路径选择
- MVC中实现加载更多
- 在ASP.NET MVC 中获取当前URL、controller、action
- [转自Scott]ASP.NET MVC框架(第四部分): 处理表单编辑和提交场景
- MVC前台Post/Get异步获得数据时参数的取值问题
- IQueryable与foreach的困惑?
- ModalPopupExtender用法示例
- MVC中局部视图的使用
- MVC发布后项目存在于根目录中的子目录中时的css与js、图片路径问题
- ORM中的继承关系映射全解——单表继承体系、一实体一具体表、一实体一扩展表、接口映射
- View与Control间的数据交互
- C#中Dispose和Close的区别!
- C#调用SQL中的存储过程中有output参数,存储过程执行过程中返回信息
- 你真的会玩SQL吗?查询指定节点及其所有父节点的方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux下安装ffmpeg的详细教程
- 如何利用Gitlab-ci持续部署到远程机器(详细教程)
- Linux常用命令之grep命令用法详解
- 详解Linux动态库生成与使用指南
- Vue 3 入门基础知识
- 在Linux系统中使用Vim读写远程文件的命令详解
- Vue.js实现咸鱼底部Tab凸起|vue自定义导航条组件
- 在Linux中查看所有正在运行的进程的方法
- Apache跨域资源访问报错问题解决方案
- Windows Telemetry服务特权提升
- 滥用DComposition在外部窗口上渲染
- 通过LUMP_PAKFILE的源引擎内存损坏
- MongoDB Change Stream之一——上手及初体验
- MongoDB 慢日志字段解析
- leetcode哈希表之第一个只出现一次的字符