【背景】
为更好的提升机器利用率,并保证机器预算不被削减,开发机器利用率监控工具。后续对机器利用率进行分析,找出更好的机器利用率提升方法,避免机器资源浪费。
【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}
示例:
【使用方法】
cr地址:http://cooder.baidu.com/1742897/ geturll.py
- 用户确定要查询的机器名称;
- 用户查询的类型为:CPU_IDLE,MEM_USED
- 用户确定要查询的时间段(比如:20150610150000-20150611150500)
- 用户确定要查询的时间间隔(比如 20)
备注:查询是可以循环查询的,但是每次只能查询一个机器(这是败笔)
如果想停止查询的话,直接按Ctrl+C,这时会终止查询,并打印出:查询结束,谢谢!
操作截图:
最终的结果将以邮件的形式,自动发送到相关owner
【工具的缺陷】
1.每次只能输入一个机器名称
(可优化点):由文件导入机器名称,依次查询各个机器的使用情况
2.邮件模板不能汇总各机器的信息,只能每次给出单个机器的使用情况
#!/usr/bin/env python2.7
# -*- coding: GB18030 -*-
"""
@author: qixuan02<qixuan02@baidu.com>
@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 = "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
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()