一、缘由
公司阿里云主机很多业务模块,经常受磁盘告警烦恼,尤其是在周末或者假期,运维不敢随意清理,就得找开发确认乐之后才能清理。
为了减少假期的磁盘告警,保证业务的正常运行,可在周五或者假期前一天统计所有主机的磁盘使用率,对于大于65%的,一一进行核对和清理。
二、环境
Python3.7 + 阿里云云监控SDK。
三、代码实现
调用阿里云云监控的接口,来查询磁盘使用率,并最终输出文档,按磁盘使用率倒序排列。
# -*- coding: utf-8 -*-
import sys
import json
import time
from typing import List
from operator import itemgetter
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
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='xxxxxxxxx',
# 您的AccessKey Secret,
access_key_secret='xxxxxxxx'
)
# 访问的域名
config.endpoint = 'metrics.cn-hangzhou.aliyuncs.com'
return Cms20190101Client(config)
@staticmethod
def main(
args: List[str],
) -> None:
client = Sample.create_client('accessKeyId', 'accessKeySecret')
describe_metric_list_request = cms_20190101_models.DescribeMetricListRequest(
metric_name='diskusage_utilization',
namespace='acs_ecs_dashboard',
period='60',
start_time=args[1],
end_time=args[2],
length='100',
next_token=args[0]
)
# 复制代码运行请自行打印 API 的返回值
res = client.describe_metric_list(describe_metric_list_request)
return res.body
def get_disk_usage(api_res):
disk_list = []
# print(dir(api_res))
res_list = json.loads(api_res.datapoints)
for i in range(0, len(res_list)):
disk_list_tmp = [res_list[i]['instanceId'], res_list[i]['diskname'], res_list[i]['Average']]
disk_list.append(disk_list_tmp)
return disk_list
if __name__ == '__main__':
token = 'init_data'
disk_info = []
# 不能取当前时间,当前时间太近了,没有最新的监控数据。
day = time.strftime('%Y-%m-%d', time.localtime())
start_time = str(round((time.time()-300)*1000))
end_time = str(round((time.time()-240)*1000))
while token:
result = Sample.main([token, start_time, end_time])
token = result.next_token
disk_res = get_disk_usage(result)
disk_info.extend(disk_res)
order_disk_info = sorted(disk_info, key=itemgetter(2), reverse=True)
with open('statistics_disk_{}.txt'.format(day), 'w') as f:
f.write('ECS实例ID \t\t盘符 \t\t磁盘使用率\n')
for i in range(0, len(order_disk_info)):
f.write(str(order_disk_info[i])+'\n')
注意:输出文档只有实例ID,如果显示实例名称,可以参考另一篇文章的接口调用。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com