使用API查詢云監控數據
更新時間 2025-02-08 18:23:39
最近更新時間: 2025-02-08 18:23:39
分享文章
因規模企業內部可能自建運維監控系統,本文將為您介紹如何通過云監控API接口查詢各類云產品監控數據,便于企業集成管理云監控資源數據。
指標類監控數據查詢的接口
云監控提供以下2類接口用于指標類監控數據的查詢:
● 實時監控數據查詢:查詢對應產品實時監控數據,詳情請參見實時監控數據。
● 歷史監控數據查詢:查詢對應產品歷史監控數據,詳情請參見歷史監控數據。
注意事項:
● 實時監控數據查詢與歷史監控數據查詢接口支持的最大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 = '//monitor-global.ctapi.daliqc.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():
# 不同監控設備類型,所對應的地址不同,請參見://www.daliqc.cn/document/10032263/10039856
post(url=DOMAIN + "/v4/monitor/query-vm-latestmetricdata",
params={
"regionID": "請修改此處為對應資源池ID",
"deviceUUIDList": [
"此處請填寫具體的設備UUID" # 參見://www.daliqc.cn/document/10032263/10039850 系列接口返回字段 deviceUUID
],
"page": 1,
"pageSize": 10
})
# 查詢歷史監控數據
def QueryMonitorHistoryData():
# 不同監控設備類型,所對應的地址不同,請參見://www.daliqc.cn/document/10032263/10039858
post(url=DOMAIN + "/v4/monitor/query-vm-historymetricdata",
params={
"regionID": "請修改此處為對應資源池ID",
"itemNameList": [
"此處請填寫要查詢的監控項" # 具體監控項,參見://www.daliqc.cn/document/10032263/10039882
],
"startTime": "1665305264", # 查詢起始時間戳
"endTime": "1665305264", # 查詢結束時間戳
"page": 1,
"pageSize": 10,
"deviceUUIDList": [
"此處請填寫具體的設備UUID" # 參見://www.daliqc.cn/document/10032263/10039850 系列接口返回字段 deviceUUID
],
})
QueryMonitorLatestData() # 實時監控數據查詢示例
QueryMonitorHistoryData() # 歷史監控數據查詢示例