想要观察阿里云上所有实例每周的cpu 平均使用率情况,根据阿里OpenAPI 提供的 " DescribeInstanceMonitorData " api来获取实例所有监控数据,之后再处理数据得到自己想要的指标。
OpenAPI 网址: https://api.aliyun.com
- 使用 python3
- 需要安装阿里OpenAPI SDK: python3 -m pip install aliyun-python-sdk-ecs
官方提供的 DescribeInstanceMonitorData python 版代码:
#!/usr/bin/env python
#coding=utf-8
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526.DescribeInstanceMonitorDataRequest import DescribeInstanceMonitorDataRequest
client = AcsClient('<accessKeyId>', '<accessSecret>', 'cn-hangzhou')
request = DescribeInstanceMonitorDataRequest()
request.set_accept_format('json')
request.set_InstanceId("InstanceId")
request.set_StartTime("2020-04-09T00:00:00Z")
request.set_EndTime("2020-04-09T12:00:00Z")
request.set_Period(600)
response = client.do_action_with_exception(request)
# python2: print(response)
print(str(response, encoding='utf-8'))
修改成适合自己使用的:
#!/usr/bin/env python
# coding=utf-8
import os
import json
from datetime import datetime, date
from datetime import timedelta
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526.DescribeInstanceMonitorDataRequest import DescribeInstanceMonitorDataRequest
access_key_id = "" # 填入 accessKeyId, 没有的话去控制台新建
access_secret = "" # 填入 accessSecret
region_id = "" # 填入 RegionId 如:cn-hangzhou
client = AcsClient( access_key_id, access_secret, region_id)
instance_id = [] # 在此填入所有阿里实例ID,如:instance_id = ["i-bp1db2tn3cvfxxxxxxxx", "i-bp1auiw4jkbbxxxxxxxx"] 所有实例ID可由另一个api "DescribeInstances" 获得
request = DescribeInstanceMonitorDataRequest()
request.set_accept_format('json')
# 获取 n 天前时间,并格式化为api指定格式时间戳
def get_date(days=0):
return (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%dT%H:%M:00Z")
# 设置获取起始时间点(阿里api限制,故每次获取一天数据)并获取数据
def do_request(days=0, ins_id=""):
start_time = get_date(days) # 起始时间
end_time = get_date(days - 1) # 截止时间
request.set_InstanceId(ins_id)
request.set_StartTime(start_time)
request.set_EndTime(end_time)
request.set_Period(600) # 获取监控数据的间隔时间,设置为10分钟,阿里每次最多返回400条监控数据
res = client.do_action_with_exception(request)
return res
# 格式化json输出
def get_pretty_print(res):
dat = json.loads(res)
js = json.dumps(dat, sort_keys=True, indent=4, separators=(',', ': '), ensure_ascii=False)
return js
def main():
# 指定并新建存储目录
dir_name = str(input('please input the dir name to save monitor data. eg: 2020-04-09: ')) # 要新建的目录名
new_path = '/data/monitor_data/' + dir_name # 指定存储位置,windows 下如:'d:/monitor_data/' + dir_name
os.mkdir(new_path)
for insId in instance_id: # 获取所有实例数据
path = new_path + '/' + insId
for day in range(7, 0, -1): # 获取一周数据
response = do_request(day, insId)
output = get_pretty_print(response)
with open(path, 'a+') as f:
f.write(output) # 以实例id为文件名写入数据
print('%s done' % insId)
print()
print()
print('all info saved to %s' % new_path)
if __name__ == '__main__':
main()
使用以上脚本可获取所有实例1周的监控数据,以json格式存储。


接下来使用shell 脚本处理文本获取cpu 数据并统计。
#!/bin/bash
#
#批量获取实例cpu平均负载
path="/data/monitor_data/xxxx" # 填入上面设置的数据存储目录路径
for InstanceId in `ls -l $path |grep -v total|awk '{print$9}'` # 获取目录下所有文件名,即实例ID,并循环处理计算cpu平均负载
do
cat $path/$InstanceId |grep CPU|sed "s/\"//g"|sed "s/,//g"|awk '{print$2}' > /tmp/cpu # 分离出所有cpu占用率值
count=`wc -l /tmp/cpu |awk '{print $1}'`
sum=0
for cpuUse in `cat /tmp/cpu`
do
let sum+=cpuUse
done
cpuAvg=$((sum/count))
echo "InstanceId: $InstanceId cpu_average: $cpuAvg" | tee -a /tmp/cpuAvg
done
echo ""
echo ""
echo "all done and saved the result to /tmp/cpuAvg"
再排序一下即可获得cpu一周平均负载降序:

需要观察其他指标可自行处理监控数据项。
Comments | 15 条评论
wow! Python!
@我不太懂
咬你
@mocuishle
猪肉可贵了
@我不太懂
不吃不吃
if [-e new post]; then comment;

fi
@我不太懂
悄悄告诉你 ‘[‘ 右侧和 ‘]’ 左侧要加个空格
: ) 不错不错
@mocuishle
)
好了好了,知道了(
dalao
@LOGI
哈哈不是不是
能拉Memory吗研究了半天
@repo
mem的api我也没找到,翻遍了
@mocuishle
我拉了CPU存到了数据库里,内存的一直没找到在哪,但是我我看到运维界面有内存的数据,不知道从而来
@repo
是啊没开放出来吧,所以我每天云监控看一眼所有机子数据
这就很Nice了
@我烧开后就爆炸
哈,就自己稍微改下用用