【背景】
为更好的提升机器利用率,并保证机器预算不被削减,开发机器利用率监控工具。后续对机器利用率进行分析,找出更好的机器利用率提升方法,避免机器资源浪费。
【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
备注:查询是可以循环查询的,但是每次只能查询一个机器(这是败笔)
如果想停止查询的话,直接按Ctrl+C,这时会终止查询,并打印出:查询结束,谢谢!
操作截图:
最终的结果将以邮件的形式,自动发送到相关owner
【工具的缺陷】
1.每次只能输入一个机器名称
(可优化点):由文件导入机器名称,依次查询各个机器的使用情况
2.邮件模板不能汇总各机器的信息,只能每次给出单个机器的使用情况
#!/usr/bin/env python2.7 # -*- coding: GB18030 -*- """ @author: qixuan02<[email protected]> @date: 2015/09/22 @summary: 获取机器的使用率 """ import os import sys import re import signal import commands #查询的机器名称 global name #查询的类型 global item #查询的开始时间 global starttime #查询的结束时间 global endtime #查询的时间间隔 global intervaltime #查询的均值 global Num global subject subject = "check result" #owner邮件列表 OWNER_LIST = "[email protected]" ########邮件模板############ 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:[email protected]" 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 break if __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()