#!/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)