开发笔记:Python对prometheus抓取30d内存与cpu使用率

生成csv和json文件作为结果;可以用来发现利用率低的主机以提升性能。

import requests
import json
import csv
def getTargetsStatus(serverip):
    url = 'http://' + serverip + ':9090' + '/api/v1/targets'
    #print("获取节点IP地址:%s" % url)
    response = requests.request('GET', url)
    aliveNum, totalNum = 0, 0
    #存活主机列表
    uplist = []
    #宕机主机列表
    downList = []
    joblist=[]
    hostlist=[]
    if response.status_code == 200:
        targets = response.json()['data']['activeTargets']
        # print(type(targets))
        # print(targets)
        for target in targets:
            totalNum += 1
            if target['health'] == 'up':
                aliveNum += 1
                uplist.append(target['discoveredLabels']['__address__'])
                joblist.append(target['discoveredLabels']['job'])
                hostlist.append(target.get('discoveredLabels', {}).get('hostname'))

            else:
                downList.append(target['labels']['instance'])

    #去掉localhost
    #todo 需要将去掉localhost改成IP
    # print(uplist.index('localhost:9090'))
    #if uplist.index('localhost:9100') != None:
        #uplist.remove('localhost:9100')
    #print(uplist)
    return uplist,downList,joblist,hostlist
def getCpu(serverip,nodeip,interval):
    heard = 'http://'+serverip+':9090'+'/api/v1/query?query='
    expr = '(1-(avg(irate(node_cpu_seconds_total{instance="'+ nodeip+ '",mode="idle"}[30d])))) * 100'
    expr2 ='100 - ((avg_over_time(node_memory_MemAvailable_bytes{instance="'+ nodeip+ '"}[30d]) * 100) / node_memory_MemTotal_bytes{instance="'+ nodeip+ '"})'
    url = heard+expr
    url2 = heard+expr2
    response = requests.request('GET', url)
    if response.status_code == 200:
        # todo 有没有别的方法
        if len(response.json()['data']['result']) != 0:
            value = response.json()['data']['result'][0]['value'][1]
        else:
            value = 0
            #logger.error("获取结果为空")
            #print("获取结果为空")
    else:
        value = 0
        #logger.error("请求失败")
        print("请求失败")
    response = requests.request('GET', url2)
    if response.status_code == 200:
        if len(response.json()['data']['result']) != 0:
            value2 = response.json()['data']['result'][0]['value'][1]
        else:
            value2 = 0
            # logger.error("获取结果为空")
            #print("获取结果为空")
    else:
        value2 = 0
        # logger.error("请求失败")
        print("请求失败")
    return value,value2


def main():
    serverip="10.30.17.170"
    uplist,downlist,joblist,hostlist=getTargetsStatus(serverip)
    #print(uplist)
    #print(downlist)

    all_data={}
    all_data_list=[]
    for i in range(len(uplist)):
        every_data = {}
        value,value2=getCpu(serverip, uplist[i], 30)
        #print(joblist[i],hostlist[i],value,value2)
        every_data['IPaddress']=uplist[i]
        every_data['jobmane']=joblist[i]
        every_data['hostname']=hostlist[i]
        every_data['cpu_usage']=float(value)
        every_data['memory_usage']=float(value2)
        all_data_list.append(every_data)
        #all_data[uplist[i]]=every_data
    all_data_list=sorted(all_data_list, key=lambda i: i['cpu_usage'])
    for i in all_data_list:
        a=i['IPaddress']
        all_data[a]=i
    json_str = json.dumps(all_data)
    #print(json_str)
    json.dump(all_data, open('text1.json', 'w'), indent=4)
    header_list = ['IPaddress','jobmane', 'hostname', 'cpu_usage','memory_usage']
    with open("30d资源占用排名.csv", mode="w", encoding="utf-8-sig", newline="") as f:
        writer = csv.DictWriter(f, header_list)
        writer.writeheader()
        writer.writerows(all_data_list)

    return json_str

if __name__ == "__main__":
    main()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值