[python] 系统监控

每分钟 采集一次linux信息,采集到的数据暂存到本地sqlite

10分钟通过http上报一次

sqlite库中保存7天的过期数据

monitor4a.out是所有输出,monitor4a.log是INFO级别以上的日志(100MB的5个日志文件循环)

python v2.6.6-2.7.8通过

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
__author__ = ‘shanl‘
import socket

store_root_dir= "."
configure={
    "domain_name":      "BeiJing",
    "auth_address":     "127.0.0.1",
    "local_ip":         socket.gethostbyname(socket.gethostname()), 
    "db_path":          "%s/monitor4a.db3" % store_root_dir,
    "encoding":         "UTF-8",

    "interval_collection":  60,         #60 采集一次信息
    "interval_upload":      60*10,      #60*10 上报间隔
    "interval_overdue":     60*60*24*7, #60*60*24*7 删除过期日志间隔

    "logger_out":           "%s/monitor4a.out" % store_root_dir,
    "logger_log":           "%s/monitor4a.log" % store_root_dir,
    "logger_format":        "[%(levelname)s] %(asctime)s [line:%(lineno)d] %(message)s",
    "logger_maxBytes":      100*1024*1024,
    "logger_backupCount":   5,

    "debug":                True,
}

try:
    from os import popen
except:
    from subprocess import popen
import os
import sys
import httplib
import multiprocessing
import time
import sqlite3
from datetime import datetime as dt
from uuid import uuid4 as uuid
from zlib import crc32
import urllib
import logging
from logging.handlers import RotatingFileHandler

#logger config
logging.basicConfig(
    #filename=configure["logger_out"],
    filename=configure["logger_out"],
    level=logging.DEBUG,
    format=configure["logger_format"],
    filemode=‘w‘
)
Rthandler = RotatingFileHandler(
    configure["logger_log"],
    maxBytes=configure["logger_maxBytes"],
    backupCount=configure["logger_backupCount"])
Rthandler.setLevel(logging.INFO)
formatter = logging.Formatter(configure["logger_format"])
Rthandler.setFormatter(formatter)
logging.getLogger(‘‘).addHandler(Rthandler)

#monitor main function
def pymain():
    logging.info("waitting...")
    with MonitorDB() as db:
        db.initTables()
        time.sleep(3)

    logging.info("monitor start...")
    p = MonitorTask()
    p.start()

def getUUID():
    return crc32("%s%s" % (uuid(),uuid())) #uuid4,基于随机数的uuid4,有一定机率重复。产生两次后crc32

class MonitorDB():
    __db = None
    __init_sqls = {
        "t_monitor":‘‘‘
            create table t_monitor(
                uuid long,
                time varchar(32),
                key varchar(32),
                value varchar(64),
                overdue int
            )
        ‘‘‘,
    }

    def __init__(self, dbPath=None):
        if not dbPath is None: self.connect(dbPath)
        else: self.connect(configure["db_path"])

    def connect(self, dbPath):
        logging.debug("initialize sqlite3:‘%s‘ done." % dbPath)
        self.__db = sqlite3.connect(dbPath,5)

    def initTables(self):
        notExist = False
        for tn,sql in self.__init_sqls.items():
            cur=self.__db.cursor()
            for i in cur.execute("SELECT COUNT(*) FROM sqlite_master where type=‘table‘ and name=‘%s‘" % tn):
                notExist = True if i[0]==0 else False
                break
            cur.close()

            if notExist:
                cur=self.__db.cursor()
                cur.execute(sql)
                cur.close()
            self.__db.commit()
        logging.debug("initialize sqlite3 tables done.")

    def close(self):
        self.__db.close()
        logging.debug("close sqlite3.")

    def save(self,rows):
        try:
            cur = self.__db.cursor()
            cur.executemany("insert into t_monitor (uuid,time,key,value,overdue)values(?,?,?,?,0)", rows)
            cur.close()
            self.__db.commit()
            logging.debug(‘save success,rows:%s‘ % rows)
        except Exception as e:
            logging.error(‘save error:%s,rows:%s.‘ % (e,rows))

    def getTop(self,n=10):
        ret = []
        try:
            cur = self.__db.cursor()
            for i in cur.execute(‘select uuid,time,key,value from t_monitor where overdue=0 order by time limit 0,?‘, (n,)):
                ret.append({
                    "uuid":i[0], "time":i[1],
                    "key":i[2], "value":i[3]
                })
            cur.close()
            self.__db.commit()
            logging.debug(‘getTop success,n:%d‘ % n)
        except Exception as e:
            logging.error("getTop error:%s,n:%d." % (e,n))
        return ret

    def setToOverdue(self,ids):
        try:
            cur = self.__db.cursor()
            cur.executemany("update t_monitor set overdue=1 where uuid=?", ids)
            cur.close()
            self.__db.commit()
            logging.debug("setToOverdue success,ids:%s" % ids)
        except Exception as e:
            logging.debug("setToOverdue error:%s,ids:%s" % e,ids)

    def deleOverdue(self):
        try:
            cur = self.__db.cursor()
            cur.execute("delete from t_monitor where overdue=1")
            cur.close()
            self.__db.commit()
            logging.debug("setToOverdue success")
        except Exception as e:
            logging.debug("setToOverdue error:%s" % e)

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()

class HostinfoCollection():
    def __nowTime(self):
        return dt.today().__str__()[:-7]

    def cpu(self):
        if configure["debug"]: return (‘2.13‘)
        logging.debug(‘collection cpu.‘)
        ls = popen("export LC_ALL=en_US && mpstat|grep ‘all‘").readline().strip().split()
        cpuUse = "%.2f" % (float(ls[3])+float(ls[5]) )
        #return {"cpuUse":usePer}
        return (cpuUse,)

    def memory(self):
        if configure["debug"]: return (‘11112‘,‘21212‘)

        logging.debug(‘collection memory.‘)
        ls = popen("export LC_ALL=en_US && free -m|grep ‘Mem‘").readline().strip().split()
        memMax = "%s" % ls[1]
        memPer = "%s" % ls[2]
        #return {"memMax":memMax,"memPer":memPer}
        return (memMax,memPer)

    def disk(self):
        if configure["debug"]: return (‘1.1‘,‘23232‘)

        logging.debug(‘collection disk.‘)
        ls = popen("export LC_ALL=en_US && df -l|grep ‘/edass4a_ssg‘").readline().strip().split()
        if ls==[]: ls = popen("export LC_ALL=en_US && df -l|grep ‘/dev/sda1‘").readline().strip().split()
        if ls==[]: ls = popen("export LC_ALL=en_US && df -l|grep ‘% /‘").readline().strip().split()
        HDUse = ls[2]
        HDMax = str(int(ls[2])+int(ls[3]))
        #return {"HDUse":HDUse,"HDMax":HDMax}
        return (HDUse,HDMax)

    def ip(self):
        logging.debug(‘collection ip.‘)
        #return {"domainid":configure["domain_name"],"ip":configure["local_ip"]}
        return (configure["domain_name"],configure["local_ip"])

class MonitorTask(multiprocessing.Process):
    __interval={
        "collection":   configure["interval_collection"],
        "upload":       configure["interval_upload"],
        "overdue":      configure["interval_overdue"],
    }

    def __init__(self, interval=None):
        if not interval is None: self.__interval = interval
        multiprocessing.Process.__init__(self)

    def __collection(self,db):
        tnow=dt.today().__str__()[:-7]

        rows=[]
        hostinfo = HostinfoCollection()

        cpu = hostinfo.cpu()
        rows.append((getUUID(),tnow,‘cpuUse‘,cpu[0]))

        mem = hostinfo.memory()
        rows.append((getUUID(),tnow,‘memMax‘,mem[0]))
        rows.append((getUUID(),tnow,‘memPer‘,mem[1]))

        disk = hostinfo.disk()
        rows.append((getUUID(),tnow,‘HDUse‘,disk[0]))
        rows.append((getUUID(),tnow,‘HDMax‘,disk[1]))

        db.save(rows)

    def __upload(self,db):
        ret = db.getTop()
        if len(ret)==0: return

        upload_success_list = []
        ip = HostinfoCollection().ip()

        headers = {
            #"Content-type": "application/x-www-form-urlencoded" ,
            "Accept": "text/plain;charset=%s" % configure["encoding"]
        }
        try:
            for i in ret:
                params = urllib.urlencode({
                    ‘mkey‘:         i[‘key‘],
                    ‘mvalue‘:       i[‘value‘],
                    ‘uptime‘:       i[‘time‘],
                    ‘domainid‘:     ip[0],
                    ‘ip‘:           ip[1],
                    ‘encoding‘:     configure["encoding"],
                })

                logging.debug(‘http connect to:%s,params:%s‘ % (configure["auth_address"],params) )
                httpClient = httplib.HTTPConnection(configure["auth_address"],timeout=3)
                httpClient.connect()
                httpClient.request("GET", "/?%s" % params)
                #httpClient.request("GET", "?%s" % params, headers=headers)
                resp_status = httpClient.getresponse().status
                logging.debug(‘http response status:%s‘ % resp_status)
                if 200==resp_status: upload_success_list.append((i[‘uuid‘],) )
                httpClient.close()
        except Exception as e:
            logging.error("upload error:%s" % e)
        db.setToOverdue(upload_success_list)
        logging.info("upload rows: %d" % len(upload_success_list))

    def __overdue(self,db):
        db.deleOverdue()

    def run(self):
        ltime = int(time.mktime(time.localtime()))
        lastExecTime = {
            "collection":   ltime,
            "upload":       ltime,
            "overdue":      ltime
        }
        try:
            while True:
                lnow = int(time.mktime(time.localtime()))

                if lnow-lastExecTime[‘collection‘]>=self.__interval[‘collection‘]:
                    logging.info("run.collection()")
                    with MonitorDB() as db: self.__collection(db)
                    lastExecTime[‘collection‘] = lnow

                if lnow-lastExecTime[‘upload‘]>=self.__interval[‘upload‘]:
                    logging.info("run.upload()")
                    with MonitorDB() as db: self.__upload(db)
                    lastExecTime[‘upload‘] = lnow

                if lnow-lastExecTime[‘overdue‘]>=self.__interval[‘overdue‘]:
                    logging.info("run.overdue()")
                    with MonitorDB() as db: self.__overdue(db)
                    lastExecTime[‘overdue‘] = lnow

                time.sleep(1)
        except Exception as e:
            logging.error("run error:%s" % e)

if __name__=="__main__":
    pymain()

服务器端,随便写个jsp或其他什么的

比如这个node.js

var LISTEN_PORT = 80;
var HOST=‘‘;

var TEST_HTML="<html><body>node.js httpServer.</body></html>\n";

function httpserver0(){
	var server = require(‘http‘).createServer();
	server.listen(LISTEN_PORT,HOST);	

	server.on(‘request‘,function(req, resp){
		console.log(req.url);

		resp.writeHead(200, {
			‘Content-Type‘: ‘text/html‘
		});

		resp.end(TEST_HTML);
	});

	server.on(‘connection‘,function(socket){
		//console.log(‘new conntion.‘);
	});
	console.log(‘server running at ‘+HOST+‘:‘+LISTEN_PORT);
}

httpserver0();
E:\a\node1>node httpserver1.js
server running at :80
/?uptime=2014-08-04+15%3A17%3A58&domainid=%E5%8C%97%E4%BA%AC&encoding=UTF-8&ip=1
92.168.2.183&mvalue=0.090000&mkey=cpuUse
/?uptime=2014-08-04+15%3A17%3A58&domainid=%E5%8C%97%E4%BA%AC&encoding=UTF-8&ip=1
92.168.2.183&mvalue=3951&mkey=memMax
/?uptime=2014-08-04+15%3A17%3A58&domainid=%E5%8C%97%E4%BA%AC&encoding=UTF-8&ip=1
92.168.2.183&mvalue=3792&mkey=memPer
/?uptime=2014-08-04+15%3A17%3A58&domainid=%E5%8C%97%E4%BA%AC&encoding=UTF-8&ip=1
92.168.2.183&mvalue=37869&mkey=HDUse
/?uptime=2014-08-04+15%3A17%3A58&domainid=%E5%8C%97%E4%BA%AC&encoding=UTF-8&ip=1
92.168.2.183&mvalue=470244&mkey=HDMax
/?uptime=2014-08-04+15%3A18%3A04&domainid=%E5%8C%97%E4%BA%AC&encoding=UTF-8&ip=1
92.168.2.183&mvalue=0.090000&mkey=cpuUse
/?uptime=2014-08-04+15%3A18%3A04&domainid=%E5%8C%97%E4%BA%AC&encoding=UTF-8&ip=1
92.168.2.183&mvalue=3951&mkey=memMax
/?uptime=2014-08-04+15%3A18%3A04&domainid=%E5%8C%97%E4%BA%AC&encoding=UTF-8&ip=1
92.168.2.183&mvalue=3791&mkey=memPer
/?uptime=2014-08-04+15%3A18%3A04&domainid=%E5%8C%97%E4%BA%AC&encoding=UTF-8&ip=1
92.168.2.183&mvalue=37869&mkey=HDUse
/?uptime=2014-08-04+15%3A18%3A04&domainid=%E5%8C%97%E4%BA%AC&encoding=UTF-8&ip=1
92.168.2.183&mvalue=470244&mkey=HDMax

[python] 系统监控

时间: 2024-10-11 23:05:25

[python] 系统监控的相关文章

Nagios 系统监控

Nagios 系统监控 Nagios 是一款免费的开源 IT 基础设施监控系统,功能强大,灵活性强,能有效监控 Windows.Linux.VMware 和 Unix 主机状态,交换机.路由器等网络设置等.一旦主机或服务状态出现异常时,会发出邮件或短信报警第一时间通知 IT 运营人员,在恢复后发出正常的邮件或短信.Nagios 结构简单,可维护性强,提供一个可选的基于浏览器的 Web 界面,方便管理人员查看系统的运行状态,网络状态.服务状态.日志信息,以及其它异常现象. 一.Nagios 结构简

Linux系统监控实用工具Glances

Linux系统监控实用工具Glances Glances安装 Glances安装要求:python >= 2.6 和 psutil >= 0.4.1 1.第一步,安装了python->2.6 2.第二步,安装了psutil->0.4.1 #tar -zxvf psutil.包. #cd psutil包 #python setup.py install 3.第三步,安装glances #tar -zxvf glances.包 # cd glances # python setup.p

Python系统运维常用库

Python系统运维常用库 1.psutil是一个跨平台库(http://code.google.com/p/psutil/) 能够实现获取系统运行的进程和系统利用率(内存,CPU,磁盘,网络等),主要用于系统监控,分析和系统资源及进程的管理. 2.IPy(http://github.com/haypo/python-ipy),辅助IP规划. 3.dnspython(http://dnspython.org)Python实现的一个DNS工具包. 4.difflib:difflib作为Python

案例|服务化架构系统监控难题解决方案

原文网址链接:http://url.cn/kVjUVO 众所周知,系统监控一直是拥有复杂IT架构的企业所面临的一个重要问题,而这也并不是每家企业都能够轻松解决的技术挑战.OPPO作为一家国际智能终端设备及移动互联网服务供应商,推出过多款外观精细.功能可靠的智能手机产品,其品牌知名度也一直名列前茅.但实际上OPPO公司与其他快速发展的现代企业一样面临着自己的IT挑战,而更加鲜为人知的,则是其品牌背后同样出色的IT团队与信息化支持能力. OPPO后端系统规模近几年快速发展,系统重构以后采用了服务化的

python性能监控初试

标 题: python性能监控初试作 者: itdef链 接: http://www.cnblogs.com/itdef/p/3990765.html 欢迎转帖 请保持文本完整并注明出处 之前性能统计都是使用的C C++  统计windows性能 后来想尝试使用图标显示数据的时候发现了PYTHON 而且python可以跨平台 为以后尝试监控linux系统做准备 这里尝试了用python获取磁盘使用率 并用matplotlib制作饼图 #!/usr/bin/env python # -*- cod

《shell脚本系统监控-------邮件告警》

我与众多同学一样,在没有学习shell编程之前是对shell编程是一头雾水的,然而它能做什么我也不知道,就是觉得能够使用一个与别人不一样的方式去管理系统.现在我慢慢的懂shell的重要性,为小型的机房里面做一个小小的shell监控足够,当然大型的机房不能使用shell来监控系统,因为大型机房监控的机器有很多,而它们的状态是以报表和图形界面的形式来汇报问题的. 接下来我写一篇关于怎么用shell来进行系统监控并在进行发送邮件. 创建一个文件: vim monitor.sh #/bin/bash  

NO.7day系统监控,硬盘分区和文件系统管理

系统监控,硬盘分区和文件系统管理 1.系统监控 top命令:top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.默认每5秒刷新屏幕数据. top pid  进程id  ppid 父进程id free命令:显示内存的使用状态 buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据.这二者是为了提高IO性能的,并由OS管理.实际系统可用内存应该以available数据为准. ps命令:进程

Day 7 Linux之系统监控、硬盘分区等

Linux之系统监控.硬盘分区等 系统监控 系统监视和进程控制工具—top和free 1) 掌握top命令的功能:top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. 2) 了解使用top命令列出系统状态时,系统默认每5秒刷新一下屏幕上的显示结果.  1.第一行是任务队列信息 14:54:36 当前时间 up 3:42 系统运行时间(时:分) 3 users 当前登录用户数 load average:0.03 0.05 0.10

Linux 系统监控、诊断工具-top,vmstat,iostat,iotop

1.问题: 最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端.本机都没问题,但是没想到上了第二份日志之后,问题来了: 集群中的某台机器 top 看到负载巨高,集群中的机器硬件配置一样,部署的软件都一样,却单单这一台负载有问题,初步猜测可能硬件有问题了. 同时,我们还需要把负载有异常的罪魁祸首揪出来,到时候从软件.硬件层面分别寻找解决方案. 2.排查: 从 top 中可以看到 load average 偏高,%wa 很高,%us 偏低: 从上图我们大致可以推断 IO