自动化统计工具

【背景】

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

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,这时会终止查询,并打印出:查询结束,谢谢!

操作截图:

自动化统计工具_第1张图片

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

 自动化统计工具_第2张图片

【工具的缺陷】

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()


你可能感兴趣的:(自动化统计工具)