指标类监控数据查询的接口
云监控提供以下2类接口用于指标类监控数据的查询:
● 实时监控数据查询:查询对应产品实时监控数据,详情请参见实时监控数据查询-云监控服务-API参考-API-监控服务 - 天翼云。
● 历史监控数据查询:查询对应产品历史监控数据,详情请参见历史监控数据查询-云监控服务-API参考-API-监控服务 - 天翼云。
注意事项:
● 实时监控数据查询与历史监控数据查询接口支持的最大QPS是30。
● 历史监控数据,查询起始时间最大支持当前时间之前180天。
实战案例
通过Demo演示,为您介绍如何使用“实时监控数据:云主机“接口查询云主机设备的实时监控数据,使用“历史监控数据:云主机“接口查询指定时间段内的历史监控数据。
#!/usr/bin/env python
# -*- coding: utf8 -*-
import requests
import json
import hashlib
import base64
import hmac
import datetime
import uuid
METHOD_GET = 'GET'
METHOD_POST = 'POST'
AK = "登录云网门户,在“控制台”->“个人中心”->“第三方账号绑定”,通过创建或者查看获取ak,sk。"
SK = "登录云网门户,在“控制台”->“个人中心”->“第三方账号绑定”,通过创建或者查看获取ak,sk。"
DOMAIN = 'https://monitor-global.ctapi.ctyun.cn'
def hmac_sha256(secret, data):
if isinstance(secret, str):
secret = bytearray(secret.encode(encoding="utf-8"))
elif isinstance(secret, bytes):
secret = bytearray(secret)
if isinstance(data, str):
data = bytearray(data.encode(encoding="utf-8"))
elif isinstance(data, bytes):
data = bytearray(data)
return hmac.new(secret, data, digestmod=hashlib.sha256).digest()
def base64_of_hmac(data):
return base64.b64encode(data)
def get_request_uuid():
return str(uuid.uuid1())
def get_sorted_str(data):
"""
鉴权用的参数整理
:param data: dict 需要整理的参数
:return: str
"""
#print("data.items(), %s", str(data.items()))
sorted_data = sorted(data.items(), key=lambda item: item[0])
#print("sorted_data, %s", str(sorted_data))
str_list = list(map(lambda x_y: '%s=%s' % (x_y[0], x_y[1]), sorted_data))
#print("str_list, %s", str(str_list))
return '&'.join(str_list)
def build_sign(query_params, body_params, eop_date, request_uuid):
"""
计算鉴权字段
:param query_params: dict get请求中的参数
:param body_params: dict post请求中的参数
:param eop_date: str 请求时间,格式为:'%Y%m%dT%H%M%SZ'
:return: str
"""
body_str = json.dumps(body_params) if body_params else ''
body_digest = hashlib.sha256(body_str.encode('utf-8')).hexdigest()
# 请求头中必要的两个参数
header_str = 'ctyun-eop-request-id:%s\neop-date:%s\n' % (request_uuid, eop_date)
# url中的参数,或get参数
query_str = get_sorted_str(query_params)
signature_str = '%s\n%s\n%s' % (header_str, query_str, body_digest)
# print_log(repr('signature_str is: %s' % signature_str))
sign_date = eop_date.split('T')[0]
# 计算鉴权密钥
k_time = hmac_sha256(SK, eop_date)
k_ak = hmac_sha256(k_time, AK)
k_date = hmac_sha256(k_ak, sign_date)
signature_base64 = base64_of_hmac(hmac_sha256(k_date, signature_str))
# 构建请求头的鉴权字段值
print("signature_base64 %s" % (str(signature_base64, encoding="utf-8")))
sign_header = '%s Headers=ctyun-eop-request-id;eop-date Signature=%s' % (
AK, str(signature_base64, encoding="utf-8"))
return sign_header
def get_sign_headers(query_params, body):
"""
获取鉴权用的请求头参数
:param query_params: dict get请求中的参数
:param body: dict post请求中的参数
:return:
"""
now = datetime.datetime.now()
eop_date = datetime.datetime.strftime(now, '%Y%m%dT%H%M%SZ')
request_uuid = get_request_uuid()
headers = { # 三个鉴权用的参数
'eop-date': eop_date,
'ctyun-eop-request-id': request_uuid,
'Eop-Authorization': build_sign(query_params=query_params, body_params=body, eop_date=eop_date,
request_uuid=request_uuid),
}
return headers
def get(url, params=None, header_params=None):
return execute(url, method=METHOD_GET, params=params, header_params=header_params)
def post(url, params=None, header_params=None):
return execute(url, method=METHOD_POST, params=params, header_params=header_params)
def execute(url, method, params=None, header_params=None):
params = params or {}
header_params = header_params or {}
query_params, body = (params, {}) if method == METHOD_GET else ({}, params)
headers = get_sign_headers(query_params, body)
headers.update(header_params)
print_log(u'url: %s' % url)
print_log(u'请求方式: %s' % method)
print_log(u'请求头: %s' % headers)
print_log(u'请求参数: %s' % params)
if method == METHOD_GET:
res = requests.get(url, params=params, headers=headers, verify=False)
else:
if params:
res = requests.post(url, json=params, headers=headers, verify=False)
else:
res = requests.post(url, data=params, headers=headers, verify=False)
print_log(u'返回状态码: %s' % res.status_code)
print_log(u'返回: %s' % res.text)
return res
def print_log(log_info):
now = datetime.datetime.now()
log_info = u'[%s]: %s' % (str(now), log_info)
print(log_info)
### BaseGet
def doBaseGet(uri, params={}, header_params=None):
url = DOMAIN + uri
get(url, params=params, header_params=header_params)
def doBasePost(uri, params={}, header_params=None):
url = DOMAIN + uri
post(url, params=params, header_params=header_params)
# 查询实时监控数据
def QueryMonitorLatestData():
# 不同监控设备类型,所对应的地址不同,请参见:https://www.ctyun.cn/document/10032263/10039856
post(url=DOMAIN + "/v4/monitor/query-vm-latestmetricdata",
params={
"regionID": "请修改此处为对应资源池ID",
"deviceUUIDList": [
"此处请填写具体的设备UUID" # 参见:https://www.ctyun.cn/document/10032263/10039850 系列接口返回字段 deviceUUID
],
"page": 1,
"pageSize": 10
})
# 查询历史监控数据
def QueryMonitorHistoryData():
# 不同监控设备类型,所对应的地址不同,请参见:https://www.ctyun.cn/document/10032263/10039858
post(url=DOMAIN + "/v4/monitor/query-vm-historymetricdata",
params={
"regionID": "请修改此处为对应资源池ID",
"itemNameList": [
"此处请填写要查询的监控项" # 具体监控项,参见:https://www.ctyun.cn/document/10032263/10039882
],
"startTime": "1665305264", # 查询起始时间戳
"endTime": "1665305264", # 查询结束时间戳
"page": 1,
"pageSize": 10,
"deviceUUIDList": [
"此处请填写具体的设备UUID" # 参见:https://www.ctyun.cn/document/10032263/10039850 系列接口返回字段 deviceUUID
],
})
QueryMonitorLatestData() # 实时监控数据查询示例
QueryMonitorHistoryData() # 历史监控数据查询示例