使用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数据库中
下节介绍如何将这些数据展示在一个页面上
- .NET 4 上的REST 框架
- 结合游戏开发与人工智能研究,游戏大厂 Ubisoft 成立AI研发部门
- Quartz.NET的管理工具
- Python-执行系统命令
- css3 UI 修饰——回顾
- Windows Phone 7实战 第一天 设计启动页面和应用程序图标
- css3响应式布局设计——回顾
- Windows Phone 7 实战第二天 二维码QRcode
- Python-面向对象编程
- SQL Server 2012将与Hadoop无缝集成
- 系统性能优化一例
- Android中include标签的使用
- css3弹性盒子模型——回顾。
- confluence与jira账号对接、查看到期时间及问题总结
- 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 数组属性和方法
- 最基础的动态数据结构:链表
- Python 微信机器人-如何查看别人撤回的消息,实战演示!
- Python 技术篇-全局变量引用,local variable referenced before assignment.解决办法
- 线性结构之栈和队列
- pyHook 转码问题-MouseSwitch() missing 8 required positional arguments...,原因及解决办法
- 将Java中的数组进行二次封装成属于我们自己的数组
- Windows 卡进程问题-请等待当前程序完成卸载或更改,轻松解决
- Netty入门之WebSocket初体验
- 如何修复无法启动的docker容器
- Kafka安装(极简版)
- parallelStream的坑,不踩不知道,一踩吓一跳
- leetcode链表之删除链表的节点
- Windows 技术篇-通过注册表查找vc运行库所在位置实战演示,通过ProductCode查看vc++运行库安装位置
- Python 库安装问题-whl is not a supported wheel on this platform.原因及解决办法
- 安装Go运行环境