根据前篇《Linux守护进程设计规范及Python实现》,我们给出了一个基于Python的守护进程框架,想要使用此框架构建自己的守护进程,只需要继承Daemon类并实现run方法即可。在本文中,我们将按照此思路设计一个linux系统状况监控程序。
目前,社区中有很多开源的系统监控软件,例如Ganglia、Zabbix等,这些软件以其优异的性能以及丰富的功能赢得了很多运维工程师的青睐,但是很多时候我们其实并不会利用到这些软件的大部分功能,并且安装配置这些软件还需要安装许多依赖软件。我们需要的或许只是一个能够可靠运行,简单易用,轻量级的系统状态定时收集器,通过这种收集器与其他更复杂的模块配合完成分布式系统的整体监控。例如笔者目前的工作是希望能够统一监控OpenStack的物理资源及虚拟资源,而OpenStack自带的监控模块Ceilometer虽然有一个合理的功能框架模型,但细化到对具体监控数据的获取这一层次完成得并不是很好,于是我们希望能够在这一层次对Ceilometer做一些改进和补充。
我们希望我们做的这个监控程序有如下特点:
1. 易用性:没有复杂的依赖关系,不需要复杂的安装配置
2. 扩展性:监控功能能够方便扩展
3. 稳定性:运行稳定,不需要过多干预,不能占用太多系统资源
4. 可控性:可对服务进行控制(启动、停止、重启、设置监控参数)
实现思路:
根据监控的基本功能要求,必须解决监控数据获取以及守护进程化两个问题。
1. 监控数据获取
首先根据《用Python脚本实现对Linux服务器的监控》一文所述,我们可以利用python脚本读取/proc虚拟文件系统获取当前系统中绝大多数的运行状态信息,一些开源的监控系统也是通过读取/proc的方式获取到监控数据的,并且Python下有一些工具包,诸如psutils 封装了这种方式能够方便的获取系统状态数据,但在这个demo中我们不希望安装其他的外部依赖,并且希望能够自定义数据获取后封装的格式,所以我们自己简单封装了一下相关的功能。
首先是监控功能的基类PollsterClass.py,具体的监控类可以继承此类并实现getSample方法实现具体的监控逻辑,新的监控功能的扩展也是通过这种方式完成。本例给出关于获取CPU信息的例子:
#PollsterClass.py
'''
The base class of pollster
'''
class Pollster(object):
def __init__(self, name):
self.name = name
'''
Implement this method.
'''
def getSample(self):
pass
#cpu.py
from collections import OrderedDict
import util
import time
from PollsterClass import Pollster
‘’’
Read cpu info from /proc/cpuinfo
‘’’
class CPUInfoPollster(Pollster):
def __init__(self, name='cpu_info'):
super(CPUInfoPollster, self).__init__(name=name)
def getSample(self):
cpu_info = OrderedDict()
proc_