自动化统计工具

来源:互联网 发布:弗洛伊德算法 编辑:程序博客网 时间:2024/06/05 09:00

【背景】

为更好的提升机器利用率,并保证机器预算不被削减,开发机器利用率监控工具。后续对机器利用率进行分析,找出更好的机器利用率提升方法,避免机器资源浪费。

API查询历史监控数据

sURL:/getHistoryItemData

参数:

namespaces string名字列表(splited by ',')

ttype string转换类型,选填,可选值host|instance

items string监控项列表(splitedby ',')

start string开始时间,格式eg. 20140610150405

end string结束时间,格式eg. 20140610150405

interval int抽样间隔,单位秒,选填,默认值0

sampleFunc string抽样函数隔,选填,可选值min|max|avg|sum,默认avg

返回:

{"data":[{"NameSpace":"namespace","Items":{"item_name":[{"Timestamp":"time","Value":value}...]...}}...],"message":"OK","success":true}

示例:

curl "http://api.mt.noah.baidu.com:8557/monquery/getHistoryitemdata?namespaces=yf-noah-lamp32.yf01,yf-noah-lamp31.yf01&items=MEM_USED,CPU_IDLE&start=20140611150000&end=20140611150500&interval=20"

【使用方法】

cr地址:http://cooder.baidu.com/1742897/    geturll.py

  1. 用户确定要查询的机器名称;
  2. 用户查询的类型为:CPU_IDLE,MEM_USED
  3. 用户确定要查询的时间段(比如:20150610150000-20150611150500
  4. 用户确定要查询的时间间隔(比如 20

备注:查询是可以循环查询的,但是每次只能查询一个机器(这是败笔)

如果想停止查询的话,直接按Ctrl+C,这时会终止查询,并打印出:查询结束,谢谢!

操作截图:


最终的结果将以邮件的形式,自动发送到相关owner

 

【工具的缺陷】

1.每次只能输入一个机器名称

优化点):由文件导入机器名称,依次查询各个机器的使用情况

 

2.邮件模板不能汇总各机器的信息,只能每次给出单个机器的使用情况

#!/usr/bin/env python2.7# -*- coding: GB18030 -*-"""@author: qixuan02<qixuan02@baidu.com>@date: 2015/09/22@summary: 获取机器的使用率"""import osimport sysimport reimport signalimport commands#查询的机器名称global name#查询的类型global item#查询的开始时间global starttime#查询的结束时间global endtime#查询的时间间隔global intervaltime#查询的均值global Numglobal subjectsubject = "check result"#owner邮件列表OWNER_LIST = "qixuan02@baidu.com"########邮件模板############STATUS_NOTIFY_TEMPALTE = '''<pre><font size="5"><b>Hi,all:</b><br></font>详细信息:<br><table border="1" align="left">    <tr>        <th>机器名称</th>        <th>查询类型</th>        <th>开始时间</th>        <th>结束时间</th>        <th>间隔时间段</th>        <th>类型均值</th>    </tr>    <tr align="center">        <td>%s</td>        <td align="left">%s</td>        <td>%s</td>        <td>%s</td>        <td align="left">%s</td>        <td align="left" ><font color="red">%s</font></td>    </tr></table></pre>'''def check_process(name,item,starttime,endtime,intervaltime):        '''        (1)爬取数据        (2)导入到文件中        (3)处理文件数据        (4)得出结果        '''        if (os.path.exists('data.txt')):                os.remove('data.txt')                os.system('curl "http://api.mt.noah.baidu.com:8557/monquery/getHistoryitemdata?namespaces=%s&items=%s&start=%s&end=%s&interval=%s" >> data.txt' % (name,item,starttime,endtime,intervaltime))        else:                os.system('curl "http://api.mt.noah.baidu.com:8557/monquery/getHistoryitemdata?namespaces=%s&items=%s&start=%s&end=%s&interval=%s" >> data.txt' % (name,item,starttime,endtime,intervaltime))        p = re.compile(r'(?<=\"Value\":)\s*\d*\d.\d*')        f = open ("data.txt","r").readline()        sample_list = list(map(float,p.findall(f)))        list_length = len(sample_list)        Num = sum(sample_list)/list_length        print Num        global messageinfo        messageinfo = STATUS_NOTIFY_TEMPALTE % (name,item,starttime,endtime,intervaltime,Num)def emailSendMSG(subject,messageinfo):        '''        按照模板 自动发送邮件        '''        from_str = "From:check_result_app@baidu.com"        to_str = "To:%s" % (OWNER_LIST)            subject_str="Subject:%s"%(subject)          body_msg=messageinfo        emai_header="Content-type:text/html"        send_cmd ="echo -e '%s' | /usr/lib/sendmail -t" % (to_str + "\n" + from_str + "\n" + subject_str + "\n" +emai_header + "\n" + body_msg)        commands.getstatusoutput(send_cmd)def sigint_handler(signum, frame):        '''        处理中断信号        '''        global is_sigint_up        is_sigint_up = True        print 'catched interrupt signal!'        exit()def main():        '''        主函数:输入数据,处理数据,发邮件        '''        while True:                try:                        name = input("please input your namespace(yf-noah-lamp32.yf01): ")                        item  = input("please input your items (MEM_USED,CPU_IDLE): ")                        starttime  = input("please input your starttime (20150610150000): ")                        endtime  = input("please input your endtime (20150611150500): ")                        intervaltime  = input("please input your intervaltime (20): ")                        if len(name):                                check_process(name,item,starttime,endtime,intervaltime)                                             emailSendMSG(subject,messageinfo)                        if is_sigint_up:                                print "Exit"                                break                except Exception, e:                        print Exception , e                        breakif __name__=="__main__":        signal.signal(signal.SIGINT, sigint_handler)        signal.signal(signal.SIGHUP, sigint_handler)        signal.signal(signal.SIGTERM, sigint_handler)        is_sigint_up = False        main()


0 0