使用OpenAPI批量获取阿里云实例监控数据

发布于 2020-04-09  925 次阅读


想要观察阿里云上所有实例每周的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(insId, '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格式存储。

使用OpenAPI批量获取阿里云实例监控数据
使用OpenAPI批量获取阿里云实例监控数据

接下来使用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一周平均负载降序:

使用OpenAPI批量获取阿里云实例监控数据

需要观察其他指标可自行处理监控数据项。