这篇博文是一个获取linux系统运行时数据的脚本框架,属于ops_agent中工具集中一个小工具,用于排错之前对机器有一个整体的把握,不过暂时还没有完全完工。
功能规划:
- 系统版本、内核版本
- 当前时间(会和标准时间进行对比)
- 磁盘使用情况(包括文件inode数)、内存使用情况、cpu使用率
- 运行中的应用
- 执行应用的用户:进程数、文件描述符数
- 如果是java应用,jdk的版本;如果是php应用,php的版本
- 当前io使用情况
- 当前网络状况、网络连接状态统计、网卡bond模式
- 当前物理内存消耗进程排序
- 当前io消耗进程排序
- 当前cpu消耗进程排序
有待完善的地方:
- 各个收集函数执行命令、收集数据
- 定义一个全局字典,收集各个get开头的函数的结果
- 最后在get_all函数中将结果发给运维平台。
#!/usr/bin/env python
#coding:utf-8
import sys,os
# 获取软件base目录
cur_path = os.path.dirname(os.path.abspath(__file__))
base_path = "/".join(cur_path.split("/")[:-2])
# 将软件的lib目录放入sys.path中
sys.path.append(os.path.join(base_path,"lib"))
# 检查是否已经安装psutil和inspect模块
try:
import psutil
except Exception as e:
print("Please install psutil")
sys.exit(1)
try:
import inspect
except Exception as e:
print("Please install inspect")
sys.exit(1)
from salt_agent import ops_agent_base # 运维平台agent的基类
class runtime_collect(ops_agent_base):
def __init__(self):
if sys.version_info[0] == 2:
ops_agent_base.__init__(self)
else:
super().__init__(self)
# 检查依赖命令是否存在
cmds = {"iotop":0,"netstat":0} # 命令名称
packages = {"iotop":"iotop","netstat":"net-tools"} # 命令名对应的rpm包名
for cmd in cmds.keys():
for path in [os.path.join(path,cmd) for path in os.environ["PATH"].split(":")]:
if os.path.isfile(path):
cmds[cmd] += 1
break
else:
continue
for cmd in cmds.keys():
if cmds[cmd] == 0:
self.__salt__["pkg.install"](packages[cmd])
def get_overview(self):
print("overview")
def get_process(self):
print("process")
def get_network(self):
print("network")
def get_io(self):
print("io")
def get_cpu(self):
print("cpu")
def get_all(self):
for fun in inspect.getmembers(self, predicate=inspect.ismethod):
if fun[0][:3] == "get" and fun[0] != "get_all":
fun[1]()
if __name__ == "__main__":
r = runtime_collect()
r.get_all()