Python批量导出阿里云ECS和Redis实例的监控数据到Excel

news2025/6/19 17:42:12

背景

某公司使用阿里云的 ECS 和 Redis 服务作为其业务支撑,为了及时了解机器的使用情况,领导要求业务部门对所有阿里云机器的平均资源使用率进行统计,并汇总在一个 Excel 表格中,以便领导查看和分析。

需求

为了满足领导的需求,我们需要实现以下基本需求:

  1. 使用阿里云 Python SDK 获取所有 ECS 和 Redis 实例的 ID 和名称,以及机器的规格和资源使用情况等信息。

  2. 使用阿里云监控服务 ECS、Redis API 获取实例的监控数据,并将其保存为 Python 字典类型。

  3. 根据用户定义的时间范围,计算所有实例的平均资源使用率,并将其汇总到一个 Python 字典中。

  4. 使用 Excel 处理库(例如 openpyxl),创建一个新的 Excel 文件,并在其中创建一个新的 sheet。

  5. 将计算得到的数据写入到 Excel 文件中。在写入时,需要提取出每个实例的 ID、名称、规格、平均 CPU 使用率、平均内存使用率和平均网络带宽使用率等信息,并按照一定的格式写入到 Excel 文件的合适位置。

  6. 最后,保存 Excel 文件并退出程序。用户应当能够方便地查看和使用导出的 Excel 表格,并根据需要进行数据分析和处理。

通过实现上述需求,业务部门可以较为方便和及时地了解到各个机器的使用情况,快速发现并解决资源使用过度或者资源浪费的问题,提高云计算资源的利用率和企业运营效率。同时,我们也能够充分发挥 Python 和阿里云 API 的强大能力,实现一个业务部门的全新 Python 项目,提升自己的编程能力和阿里云 API 使用经验。

环境

Python 3.8
pip install alibabacloud_cms20190101==2.0.5

pip install alibabacloud_r_kvstore20150101==2.20.7

获取所有ECS和Redis 机器的资源使用率

使用到的api接口

产品排列表 https://cms.console.aliyun.com/metric-meta/acs_ecs_dashboard/ecs
获取所有机器 https://next.api.aliyun.com/api/Cms/2019-01-01/DescribeMonitoringAgentHosts
获取所有redis https://next.api.aliyun.com/api/R-kvstore/2015-01-01/DescribeInstancesOverview

资源使用率获取 https://next.api.aliyun.com/api/Cms/2019-01-01/DescribeMetricLast
在这里插入图片描述

实例数据获取(ECS和Redis)

可以参考下方的Api接口,我已经封装成函数

获取所有机器 https://next.api.aliyun.com/api/Cms/2019-01-01/DescribeMonitoringAgentHosts
获取所有redsi https://next.api.aliyun.com/api/R-kvstore/2015-01-01/DescribeInstancesOverview

如果要使用下方函数,请添加自己的密钥对

# -*- coding: utf-8 -*-
# @Time    : 2023/4/12 9:55
# @Author  : 南宫乘风
# @Email   : 1794748404@qq.com
# @File    : ecs_all.py
# @Software: PyCharm
import json
from typing import List

from alibabacloud_cms20190101.client import Client as Cms20190101Client
from alibabacloud_cms20190101 import models as cms_20190101_models
from alibabacloud_r_kvstore20150101.client import Client as R_kvstore20150101Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_r_kvstore20150101 import models as r_kvstore_20150101_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient


def create_client_redis(
        access_key_id: str,
        access_key_secret: str,
) -> R_kvstore20150101Client:
    """
    使用AK&SK初始化账号Client
    @param access_key_id:
    @param access_key_secret:
    @return: Client
    @throws Exception
    """
    config = open_api_models.Config(
        # 必填,您的 AccessKey ID,
        access_key_id=access_key_id,
        # 必填,您的 AccessKey Secret,
        access_key_secret=access_key_secret
    )
    # 访问的域名
    config.endpoint = f'r-kvstore.aliyuncs.com'
    return R_kvstore20150101Client(config)


def create_client_ecs(
        access_key_id: str,
        access_key_secret: str,
) -> Cms20190101Client:
    """
    使用AK&SK初始化账号Client
    @param access_key_id:
    @param access_key_secret:
    @return: Client
    @throws Exception
    """
    config = open_api_models.Config(
        # 必填,您的 AccessKey ID,
        access_key_id=access_key_id,
        # 必填,您的 AccessKey Secret,
        access_key_secret=access_key_secret
    )
    # 访问的域名
    config.endpoint = f'metrics.ap-southeast-1.aliyuncs.com'
    return Cms20190101Client(config)


def get_ecs_instances():
    """
    获取阿里云 ECS 实例列表
    """
    client = create_client_ecs('xxxx', 'xxxx')
    describe_monitoring_agent_hosts_request = cms_20190101_models.DescribeMonitoringAgentHostsRequest()
    runtime = util_models.RuntimeOptions()
    try:
        # 复制代码运行请自行打印 API 的返回值
        data = client.describe_monitoring_agent_hosts_with_options(describe_monitoring_agent_hosts_request, runtime)
        return data
    except Exception as error:
        # 如有需要,请打印 error
        UtilClient.assert_as_string(error.message)


def get_redis_instances():
    # 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.html
    client = create_client_redis('xxxx', 'xxxx')
    describe_instances_overview_request = r_kvstore_20150101_models.DescribeInstancesOverviewRequest(
        region_id='cn-shenzhen'
    )
    runtime = util_models.RuntimeOptions()
    try:
        # 复制代码运行请自行打印 API 的返回值
        data = client.describe_instances_overview_with_options(describe_instances_overview_request, runtime)
        return data
    except Exception as error:
        # 如有需要,请打印 error
        UtilClient.assert_as_string(error.message)


if __name__ == '__main__':
    ecs_data = get_ecs_instances().to_map()
    redis_data = get_redis_instances().to_map()


    # 将 ECS 数据写入 JSON 文件中
    with open('ecs.json', 'w', encoding='utf-8') as f:
        f.write(json.dumps(ecs_data, indent=4,ensure_ascii=False))

    # 将 Redis 数据写入 JSON 文件中
    with open('redis.json', 'w', encoding='utf-8') as f:
        f.write(json.dumps(redis_data, indent=4,ensure_ascii=False))
    print("数据已经写入本地文件")

在这里插入图片描述
在这里插入图片描述

ECS实例资源

# -*- coding: utf-8 -*-
# @Time    : 2023/4/11 17:17
# @Author  : 南宫乘风
# @Email   : 1794748404@qq.com
# @File    : ecs_monitor.py
# @Software: PyCharm
import json
import sys

from typing import List

from alibabacloud_cms20190101.client import Client as Cms20190101Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_cms20190101 import models as cms_20190101_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
from openpyxl import Workbook
from openpyxl.utils import get_column_letter


class Sample:
    def __init__(self):
        pass

    @staticmethod
    def create_client(
            access_key_id: str,
            access_key_secret: str,
    ) -> Cms20190101Client:
        """
        使用AK&SK初始化账号Client
        @param access_key_id:
        @param access_key_secret:
        @return: Client
        @throws Exception
        """
        config = open_api_models.Config(
            # 必填,您的 AccessKey ID,
            access_key_id=access_key_id,
            # 必填,您的 AccessKey Secret,
            access_key_secret=access_key_secret
        )
        # 访问的域名
        config.endpoint = f'metrics.ap-southeast-1.aliyuncs.com'
        return Cms20190101Client(config)

    @staticmethod
    def main(parameter):
        # 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.html
        client = Sample.create_client('xxxx', 'xxxx')
        describe_metric_top_request = cms_20190101_models.DescribeMetricTopRequest(
            period='2592000',
            namespace='acs_ecs_dashboard',
            metric_name=parameter,
            orderby='Average',
            start_time='2023-03-12 00:00:00',
            end_time='2023-04-11 00:00:00',
            length='100',
        )
        runtime = util_models.RuntimeOptions()
        try:
            # 复制代码运行请自行打印 API 的返回值
            data = client.describe_metric_top_with_options(describe_metric_top_request, runtime)
            return data
        except Exception as error:
            # 如有需要,请打印 error
            UtilClient.assert_as_string(error.message)


def get_host():
    global host_list
    # 打开 host.json 文件
    with open('ecs.json', 'r') as f:
        # 读取文件中的 JSON 数据
        data = json.load(f)
    # 输出读取到的数据

    host_list = data['body']["Hosts"]["Host"]
    host_list = [{k: v for k, v in d.items() if
                  k not in (
                      'isAliyunHost', 'NetworkType', 'InstanceTypeFamily', 'Region', 'AliUid', 'SerialNumber', 'EipId','EipAddress')}
                 for d in
                 host_list]
    print(host_list)
    return host_list


def ecs_dashboard(parameter):
    data_ecs = Sample.main(parameter)
    response_dict = data_ecs.body.to_map()
    data_Datapoints = json.loads(response_dict["Datapoints"])
    # for data in data_Datapoints:
    #     print(data)
    # print(type(data_Datapoints), data_Datapoints)
    return data_Datapoints


def set_workbook(ece_data_list):
    data = {
        'AgentVersion': '2.1.56',
        'HostName': 'xxx',
        'InstanceId': 'i-xxxxxxx',
        'IpGroup': 'xxxxxxxxxx',
        'OperatingSystem': 'Linux',
        'CPU_Average': 4.475,
        'Memory_Average': 20.499
    }

    # 新建一个 Workbook 对象
    wb = Workbook()

    # 获取第一个 sheet
    ws = wb.active

    # 获取最大行数
    max_row = ws.max_row
    # 设置表头
    headers = list(data.keys())
    for i, header in enumerate(headers, start=1):
        ws.cell(row=1, column=i).value = header

    # 写入数据
    for row_data in ece_data_list:
        # 写入数据
        max_row += 1
        for i, header in enumerate(row_data.keys(), start=1):
            column_letter = get_column_letter(i)
            cell_address = '{}{}'.format(column_letter, max_row)
            ws[cell_address] = row_data[header]

    # 保存文件
    wb.save('ECS_服务器资源.xlsx')


if __name__ == '__main__':
    host_list_data = get_host()

    es_monitor_list_cpu = ecs_dashboard("CPUUtilization")
    es_monitor_list_memory = ecs_dashboard("memory_usedutilization")

    # 匹配CPU
    # 遍历 list2,匹配 instanceId 并添加 Average 值到 list1 的对应字典中
    for d2 in es_monitor_list_cpu:
        for d1 in host_list_data:
            if d1['InstanceId'] == d2['instanceId']:
                d1['CPU_Average'] = d2['Average']
    # 匹配内存
    for d3 in es_monitor_list_memory:
        for d1 in host_list_data:
            if d1['InstanceId'] == d3['instanceId']:
                d1['Memory_Average'] = d3['Average']
    # 输出更新后的 list1
    # lst_sorted = sorted(host_list_data, key=lambda x: x['Memory_Average'], reverse=True)
    print(host_list_data)
    set_workbook(host_list_data)

在这里插入图片描述

Redis实例资源

# -*- coding: utf-8 -*-
# @Time    : 2023/4/11 17:17
# @Author  : 南宫乘风
# @Email   : 1794748404@qq.com
# @File    : ecs_monitor.py
# @Software: PyCharm

# 产品排列表 https://cms.console.aliyun.com/metric-meta/acs_ecs_dashboard/ecs?spm=a2c4g.163515.0.0.27c776abvQGocz
# 获取所有机器 https://next.api.aliyun.com/api/Cms/2019-01-01/DescribeMonitoringAgentHosts?params={}&tab=DEBUG
# 获取所有redsi  https://next.api.aliyun.com/api/R-kvstore/2015-01-01/DescribeInstancesOverview?spm=a2c4g.473769.0.i0&lang=PYTHON&params={%22RegionId%22:%22cn-shenzhen%22}&tab=DEBUG
import json
import sys

from typing import List

from alibabacloud_cms20190101.client import Client as Cms20190101Client
from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_cms20190101 import models as cms_20190101_models
from alibabacloud_tea_util import models as util_models
from alibabacloud_tea_util.client import Client as UtilClient
from openpyxl import Workbook
from openpyxl.utils import get_column_letter


class Sample:
    def __init__(self):
        pass

    @staticmethod
    def create_client(
            access_key_id: str,
            access_key_secret: str,
    ) -> Cms20190101Client:
        """
        使用AK&SK初始化账号Client
        @param access_key_id:
        @param access_key_secret:
        @return: Client
        @throws Exception
        """
        config = open_api_models.Config(
            # 必填,您的 AccessKey ID,
            access_key_id=access_key_id,
            # 必填,您的 AccessKey Secret,
            access_key_secret=access_key_secret
        )
        # 访问的域名
        config.endpoint = f'metrics.ap-southeast-1.aliyuncs.com'
        return Cms20190101Client(config)

    @staticmethod
    def main(parameter):
        # 工程代码泄露可能会导致AccessKey泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378659.html
        client = Sample.create_client('xxxx', 'xxx')
        describe_metric_top_request = cms_20190101_models.DescribeMetricTopRequest(
            period='2592000',
            namespace='acs_kvstore',
            metric_name=parameter,
            orderby='Average',
            start_time='2023-03-12 00:00:00',
            end_time='2023-04-11 00:00:00',
            length='100',
        )
        runtime = util_models.RuntimeOptions()
        try:
            # 复制代码运行请自行打印 API 的返回值
            data = client.describe_metric_top_with_options(describe_metric_top_request, runtime)
            return data
        except Exception as error:
            # 如有需要,请打印 error
            UtilClient.assert_as_string(error.message)


def get_host():
    global host_list
    # 打开 host.json 文件
    with open('redis.json', 'r', encoding='utf-8') as f:
        # 读取文件中的 JSON 数据
        data = json.load(f)
    # 输出读取到的数据
    print(data)
    host_list = data['body']["Instances"]

    host_list = [{k: v for k, v in d.items() if
                  k not in ('ArchitectureType', 'EngineVersion', 'EndTime', 'ResourceGroupId', 'ZoneId', 'CreateTime',
                            'VSwitchId', 'InstanceClass', 'ConnectionDomain', 'VpcId', 'ChargeType', 'NetworkType',
                            'InstanceStatus', 'RegionId', 'InstanceType', 'SecondaryZoneId')}
                 for d in
                 host_list]
    return host_list


def ecs_dashboard(parameter):
    data_ecs = Sample.main(parameter)
    response_dict = data_ecs.body.to_map()
    data_Datapoints = json.loads(response_dict["Datapoints"])
    return data_Datapoints


def set_workbook(host_list_data):
    data = {
        'Capacity': 256,
        'InstanceId': 'r-xxxxx',
        'InstanceName': '大数据',
        'PrivateIp': 'xxxxxxxx',
        'Memory_Average': 15.719
    }

    # 新建一个 Workbook 对象
    wb = Workbook()

    # 获取第一个 sheet
    ws = wb.active

    # 获取最大行数
    max_row = ws.max_row

    # 设置表头
    headers = list(data.keys())
    for i, header in enumerate(headers, start=1):
        ws.cell(row=1, column=i).value = header

    # 写入数据
    for row_data in host_list_data:
        # 写入数据
        max_row += 1
        for i, header in enumerate(row_data.keys(), start=1):
            column_letter = get_column_letter(i)
            cell_address = '{}{}'.format(column_letter, max_row)
            ws[cell_address] = row_data[header]

    # 保存文件
    wb.save('Redis_服务器资源.xlsx')


if __name__ == '__main__':
    host_list_data = get_host()

    redis_monitor_list_Memory = ecs_dashboard("StandardMemoryUsage")

    # 匹配CPU
    # 遍历 list2,匹配 instanceId 并添加 Average 值到 list1 的对应字典中
    for d2 in redis_monitor_list_Memory:
        for d1 in host_list_data:
            if d1['InstanceId'] == d2['instanceId']:
                d1['Memory_Average'] = d2['Average']

    # # 输出更新后的 list1
    lst_sorted = sorted(host_list_data, key=lambda x: x['Memory_Average'], reverse=True)
    print(host_list_data)
    set_workbook(lst_sorted)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/411617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ const的作用

1.const在C中是只读变量,在C中表示常量 以下代码,在C中是错误的,但是在C中是正确的。 void main() {const int n 10;int arr [n]; }2.const不仅可以定义一个常量,也可以定义函数参数 例如: char *strcpy(char *dest…

一次弄懂gzip模块启用和配置指令

接下来所学习的指令都来自ngx_http_gzip_module模块,该模块会在nginx安装的时候内置到nginx的安装环境中,也就是说我们可以直接使用这些指令。 1. gzip指令:该指令用于开启或者关闭gzip功能 注意只有该指令为打开状态,下面的指令才…

联想凌拓 ThinkSystem DE 系列全闪存阵列

ThinkSystem DE 系列全闪存阵列 超高的性能,极具竞争力的价格 通过消除过量配置最大限度地提高效率,同时通过降低空间、电源和冷却要求来降低成本。 利用高级数据保护,在本地或从远距离上防止数据丢失和停机事件。 在模块化 2U 构建模块中…

ModStartBlog v7.1.0 ChatGPT支持,界面全新优化

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场,后台一键快速安装 …

【ChatGPT】ChatGPT-5 强到什么地步?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员,2024届电子信息研究生 目录 ChatGPT-5 强到什么地步? 技术 深度学习模型的升级 更好的预测能力 自适应学习能力 特点 语言理解能力更强 自我修正和优化 更广泛的应用领域 应用 对话系统 智能写作…

2.含电热联合系统的微电网运行优化(文章复现)

说明书 相关代码资源:基于多目标粒子群算法冷热电联供综合能源系统运行优化 基于拉丁超立方法的风光场景生成与削减 粒子群综合能源系统优化的matlab实现 智能微电网PSO优化算法 MATLAB代码:含电热联合系统的微电网运行优化 关键词:微网…

基于PINN的极少监督数据二维非定常圆柱绕流模拟

2022年10月16日-19日,亚洲计算流体力学会议在韩国九州举办。会议涌现了不少结合人工智能技术进行流体力学模拟的论文成果,这说明人工智能技术逐渐渗透流体力学模拟领域。百度与西安交通大学的研究人员一起,利用飞桨框架和科学计算工具组件Pad…

生成式人工智能所面临的问题有哪些?

在生成式人工智能中工作需要混合技术、创造性和协作技能。通过发展这些技能,您将能够在这个令人兴奋且快速发展的领域应对具有挑战性的问题。 生成式人工智能是指一类机器学习技术,旨在生成与训练数据相似但不完全相同的新数据。 换句话说,…

WPS C++ 二次开发 Demo运行

1.官网二次开发地址:https://open.wps.cn/docs/client/wpsLoad 2.Demo源码下载: 经过测试上述链接找不到demo源码,可通过git命令下载: git clone https://code.aliyun.com/zouyingfeng/wps.git -b dev 图中cpp文件夹即为cdemo源码…

<Linux>进程概念

文章目录一、什么是进程1.进程概念2.进程描述 – PCB3.task_struct内容分类二、进程的基本操作1.查看进程2.结束进程3.通过系统调用获取进程标示符4.通过系统调用创建子进程(fork)三、进程状态1.普遍的操作系统状态2.Linux操作系统状态四、两种特殊的进程1.僵尸进程2.孤儿进程五…

sql语法:事务的”那些事“

Mysql版本:8.0.26 可视化客户端:sql yog 目录前言一、事务是什么?二、事务的特点三、如何提交事务和回滚事务?3.1 手动提交3.2 自动提交模式下开启事务3.3 注意事项四、事务的隔离级别4.1 模拟事务安全问题4.1.1 脏读问题模拟如下&#xff1…

11.Java面向对象----多态

Java面向对象—多态 面向对象简称 OO(Object Oriented),20 世纪 80 年代以后,有了面向对象分析(OOA)、 面向对象设计(OOD)、面向对象程序设计(OOP)等新的系统…

Nacos介绍与安装

文章目录一、什么是Nacos(摘抄自官网介绍)二、Nacos安装2.1 下载安装包2.2 解压2.3 配置端口2.4.启动2.5.访问一、什么是Nacos(摘抄自官网介绍) Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发…

【模型复现】densenet,增加残差结构连接,复用特征图的角度降低了计算量还提升了精度,transition_block压缩特征图

相比ResNet,DenseNet[1608.06993] Densely Connected Convolutional Networks (arxiv.org)提出了一个更激进的密集连接机制:即互相连接所有的层,具体来说就是每个层都会接受其前面所有层作为其额外的输入。下图为DenseNet的密集连接机制。可以…

聚观早报|Uber分拆旗下网约车服务; 字节跳动首度超越腾讯和阿里

今日要闻:Uber分拆旗下网约车服务Careem;字节跳动首度超越腾讯和阿里;搜狗追上GPT-4需要3年左右;苹果首款头戴装置将延至6月量产;全面注册制新规今起正式落地Uber分拆旗下网约车服务Careem Uber 旗下网约车服务 Careem…

【CSS】绝对定位元素设置 水平 / 垂直 居中 ( 绝对定位元素居中设置 - 先偏移 50% 再回退子元素一半尺寸 | 绝对定位居中设置 )

文章目录一、问题提出二、绝对定位 居中设置1、设置固定尺寸2、先偏移50%再回退固定值三、绝对定位元素 水平 / 垂直 居中一、问题提出 绝对定位 不能通过 设置 margin: auto; 样式的方式 , 设置盒子模型水平居中 ; 相对定位 的 盒子模型 , 并没有脱离标准流限制 , 仍然可以使…

notion插件:为你的工作流带来新生

在本文中,我们将介绍Notion的几款有助于提高生产力的插件。这些插件将加强Notion的功能,并为你的工作流程带来更多的便利。 我们特地为你准备了这本漫游指南:收录各种工具、信息和资源,携你共同探索浩瀚美丽的互联网海洋。 snackt…

23种设计模式-抽象工厂模式

抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创…

数据结构与算法六 树

一 二叉树入门 之前我们实现的符号表中,不难看出,符号表的增删查操作,随着元素个数N的增多,其耗时也是线性增多的,时间复杂度都是O(n),为了提高运算效率,接下来我们学习树这种数据结构。 1.1 树的基本定义…

流程引擎基础知识

流程引擎基础知识流程部署流程取消部署流程发起流程取回流程作废流程委托流程流转常用流程表介绍备注流程部署 1.后台直接导入bpmn /**流程部署源代码*/public void deploy() {ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine();RepositoryService repo…