Aliyun-ECS监控项数据获取

  • 阿里云ECS监控项数据获取
#!/usr/bin/env python
#coding=utf-8
import json
import os
import xlwt
import logging
from datetime import datetime, timedelta
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcms.request.v20190101.DescribeMonitoringAgentHostsRequest import DescribeMonitoringAgentHostsRequest
from aliyunsdkcms.request.v20190101.DescribeMetricDataRequest import DescribeMetricDataRequest

# 获取24H的平均性能数据 可用监控项:cpu_total diskusage_utilization  memory_usedutilization process.number  process.expend
def data_write(filepath, datas):
    f = xlwt.Workbook()
    print(datas)
    sheet1 = f.add_sheet(u'监控数据(24H)', cell_overwrite_ok=True)
    line_01 = ['InstanceID', 'Name', 'IP', 'IsAliyunHost', 'OperatingSystem', 'Region', 'Cpu_idle_Maximum(%)', 'Cpu_idle_Minimum(%)', 'Cpu_idle_Average(%)', 
        'Load_5m_Maximum', 'Load_5m_Minimum', 'Load_5m_Average', 'Memory_used_Maximum(%)', 'Memory_used_Minimum(%)', 'Memory_used_Average(%)']
    for x in range(len(line_01)):
        sheet1.write(0, x, line_01[x], setStyle("宋体"))
    i = 1  # i 值为excel从第几行开始写
    for data in datas:
        for j in range(len(data)):
            sheet1.write(i, j, data[j])
        i = i + 1
    f.save(filepath)


def setStyle(name):
    style = xlwt.XFStyle()
    font = xlwt.Font()
    pattern = xlwt.Pattern()
    alignment = xlwt.Alignment()
    font.colour_index = 1  # 字体颜色
    font.name = name  # 字体
    font.bold = True    # 加粗
    alignment.horz = 2   # 对齐方式,居中
    pattern.pattern = xlwt.Pattern.SOLID_PATTERN
    pattern.pattern_fore_colour = 23  # 背景颜色
    style.alignment = alignment
    style.pattern = pattern
    style.font = font
    return style

def get_start_timestamp(time):
    start_datetime = datetime.now() - timedelta(days=time)
    start_timestamp = int(start_datetime.timestamp()*1000)
    return  start_timestamp



def getMonitorAgent(regionid):
    # client = get_connect_with_aliy(regionid)
    client = AcsClient('xxx', 'xxx', regionid)

    request = DescribeMonitoringAgentHostsRequest()
    request.set_accept_format('json')
    request.set_PageSize(500)
    # request.set_PageNumber(2)
    response = client.do_action_with_exception(request)
    return response


def GetMonitorValueFromAgent(AgentHost, regionid):
    ecs_cloudmonitors = []
    client = AcsClient('xxx', 'xxx', regionid)

    request = DescribeMetricDataRequest()
    request.set_accept_format('json')
    # 数据查询间隔时间 24H
    request.set_Period("86400")
    # 阿里云产品类型 *
    request.set_Namespace("acs_ecs_dashboard")
    monitor_project = ["cpu_idle", "load_5m", "memory_usedutilization"]

    start_time = get_start_timestamp(2)
    request.set_StartTime(start_time)
    request.set_EndTime(int(datetime.now().timestamp()*1000))
    for host in AgentHost:
        instanceId = {}
        instanceId['instanceId'] = host.get('instanceId')
        request.set_Dimensions(instanceId)
        # print(str(response, encoding='utf-8'))
        ecs_tmp = []
        ecs_tmp.append(host.get('instanceId'))
        ecs_tmp.append(host.get('HostName'))
        ecs_tmp.append(host.get('IpGroup'))
        ecs_tmp.append(host.get('isAliyunHost'))
        ecs_tmp.append(host.get('OperatingSystem'))
        ecs_tmp.append(host.get('Region'))
        for monitor_obj in monitor_project:
            request.set_MetricName(monitor_obj)
            response = client.do_action_with_exception(request)
            response_decode = (str(response, encoding='utf-8'))
            data = json.loads(response_decode)
            Datapoints = json.loads(data.get('Datapoints'))

            if Datapoints:
                ecs_tmp.append(Datapoints[0].get('Maximum'))
                ecs_tmp.append(Datapoints[0].get('Minimum'))
                ecs_tmp.append(round(Datapoints[0].get('Average'), 2))
            else:
                pass
        # print(ecs_tmp)                
        ecs_cloudmonitors.append(ecs_tmp)
    return ecs_cloudmonitors                   



def DataCleanForAgentHost(response):
    AgentHost = []
    response_decode = (str(response, encoding='utf-8'))
    data = json.loads(response_decode)
    count = data.get('Total')  # 已监控数
    # print(count)
    instances = data.get('Hosts').get('Host')
    for ecs in instances:
        InstanceId = {}
        if ecs.get('InstanceId') is not None:
            InstanceId['instanceId'] = ecs.get('InstanceId')
            InstanceId['OperatingSystem'] = ecs.get('OperatingSystem')
            InstanceId['IpGroup'] = ecs.get('IpGroup')
            InstanceId['Region'] = ecs.get('Region')
            InstanceId['isAliyunHost'] = ecs.get('isAliyunHost')
            InstanceId['HostName'] = ecs.get('HostName')
            AgentHost.append(InstanceId)
            # print(ecs.get('InstanceId'))
    return AgentHost  # return dict



if __name__ == '__main__':
    try:
        base_dir = os.path.dirname(os.path.abspath(__file__))
        finall_file = os.path.join(base_dir, "%s.xlsx" % (datetime.now().strftime("%Y-%m-%d")))
        regionid = "cn-shenzhen"
        response = getMonitorAgent(regionid)
        AgentHost =  DataCleanForAgentHost(response)
        list = []
        list = GetMonitorValueFromAgent(AgentHost, regionid)
        data_write(finall_file, list)
    except ServerException as e:
        print(e)

    except ClientException as e:
        print(e)

posted @ 2021-03-24 11:44  独孤云翔  阅读(257)  评论(0)    收藏  举报