本文主要介紹批量計算metrics統計項以及獲取方式。批量計算對外的資源主要表現在集群和作業兩個維度,因此metrics統計也從以上2個維度展現。
集群 Metrics
Metrics 項目
集群對外提供的 Metrics 統計項包括如下:
統計項 | 名稱 | 單位 | 聚合統計方法 |
cls_dataVfsFsSizePused | 數據盤利用率 | % | Average,Maximum,Minimum |
cls_systemCpuLoad | CPU負載 | % | Average,Maximum,Minimum |
cls_systemCpuUtilIdle | CPU空閑率 | % | Average,Maximum,Minimum |
cls_systemCpuUtilUsed | CPU使用率 | % | Average,Maximum,Minimum |
cls_vfsFsSizePused | 系統盤利用率 | % | Average,Maximum,Minimum |
cls_vmMemorySizePused | 內存利用率 | % | Average,Maximum,Minimum |
以上統計項目以實例為單位進行上報,也即每個實例都有以上統計項;
每個metrics項目上報的數據以clusterId、GroupId、InstanceId等維度組織;
每條記錄都包括,當前統計項在過去1分鐘內的平均值、最大值以及最小值;
批量計算默認10秒鐘推送一次數據;
獲取 Metrics 時可以設置聚合周期(“Period”),默認為1分鐘。
數據記錄示例
控制臺獲取方法
作業 Metrics
Metrics 項目
作業對外提供的 Metrics 統計項包括如下:
統計項 | 名稱 | 單位 | 聚合統計方法 |
job_dataVfsFsSizePused | 數據盤利用率 | % | Average,Maximum,Minimum |
job_systemCpuLoad | CPU負載 | % | Average,Maximum,Minimum |
job_systemCpuUtilIdle | CPU空閑率 | % | Average,Maximum,Minimum |
job_systemCpuUtilUsed | CPU使用率 | % | Average,Maximum,Minimum |
job_vfsFsSizePused | 系統盤利用率 | % | Average,Maximum,Minimum |
job_vmMemorySizePused | 內存利用率 | % | Average,Maximum,Minimum |
數據記錄示例
控制臺獲取方式
相關 API
批量計算所有的Metrics統計信息都推送到阿里云云監控服務中。所有 Metrics 獲取依賴云監控API。
DescribeMetricMetaList
查詢 Metrics 項,通過該接口可以獲取批量計算對外提供的統計項。
DescribeMetricData
查詢 Metrics 統計數據,通過該接口可以獲取指定的集群或者作業的各個統計項的數據
Demo 示例代碼
#!/usr/bin/env python
#coding=utf-8
# http://m.bestwisewords.com/document_detail/51936.html?spm=a2c4g.11186623.6.692.347048d34VV7RU
import os
import json
import time
import sys
import datetime
from functools import wraps
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkcms.request.v20190101.DescribeMetricListRequest import DescribeMetricListRequest
from aliyunsdkcms.request.v20190101.DescribeMetricMetaListRequest import DescribeMetricMetaListRequest
akId = 'AccessKeyId'
akKey = 'AccessKeySecret'
region = 'cn-hangzhou'
# jobId = "job-000000005D16F74B00006883000303E9"
jobId = "job-000000006124E89100002B3D028E3322"
def retryWrapper(func):
@wraps(func)
def wrapper(*args,**kwargs):
index = 0
while True:
try:
res = func(*args,**kwargs)
break
except Exception as e:
if index > 6:
raise Exception(str(e))
else:
time.sleep(0.5 * pow(2,index))
index += 1
return res
return wrapper
@retryWrapper
def listBatchMetricMeta(client, objId):
metrics = []
request = DescribeMetricMetaListRequest()
request.set_accept_format('json')
request.set_Namespace("acs_batchcomputenew")
response = client.do_action_with_exception(request)
res = json.loads(response)
prefix = objId.strip().split("-")[0]
for metric in res["Resources"]["Resource"]:
if prefix not in metric["MetricName"]:
continue
metrics.append(metric["MetricName"])
return metrics
@retryWrapper
def getSpecJobMetricsInfo(client, objId, metrics, startTime = None):
nextToken = None
request = DescribeMetricListRequest()
request.set_accept_format('json')
request.set_Period("60")
request.set_Length("1000")
request.set_EndTime(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())))
# 默認查詢7天的記錄
if not startTime:
sevenDayAgo = (datetime.datetime.now() - datetime.timedelta(days = 7))
startTime = sevenDayAgo.strftime("%Y-%m-%d %H:%M:%S")
request.set_StartTime(startTime)
prefix = objId.strip().split("-")[0]
if "job" in prefix:
dimensionInfo = [{"jobId":objId}]
else:
dimensionInfo = [{"clusterId":objId}]
request.set_Dimensions(json.dumps(dimensionInfo))
request.set_MetricName(metrics)
request.set_Namespace("acs_batchcomputenew")
metricsInfo = []
while True:
if nextToken:
request.set_NextToken(nextToken)
response = client.do_action_with_exception(request)
res = json.loads(response)
if "Datapoints" in res and len(res["Datapoints"]):
metricsInfo.extend(json.loads(res["Datapoints"]))
else:
print(res)
if "NextToken" in res and res["NextToken"]:
nextToken = res["NextToken"]
continue
else:
break
return metricsInfo
if __name__ == "__main__":
client = AcsClient(akId, akKey, region)
# metricsName = ['job_systemCpuUtilIdle', 'job_systemCpuLoad', 'job_vmMemorySizePused', 'job_vfsFsSizePused', 'job_dataVfsFsSizePused']
metricsName = listBatchMetricMeta(client, jobId)
for metrics in metricsName:
try:
ret = getSpecJobMetricsInfo(client, jobId, metrics)
except Exception as e:
print("get metrics info failed, %s" % str(e))
sys.exit(1)
if not len(ret):
continue
# 可以對返回的數據進行二次聚合
print(ret)
執行示例之前,安裝阿里云 SDK 庫:
pip install aliyun_python_sdk_cms
pip install aliyun_python_sdk_core
設置的 AK 賬號必須要有 ‘AliyunCloudMonitorReadOnlyAccess’ 權限,添加權限的方式參考開通批量計算服務 5.2 章節;
OpenAPI 獲取方式
通過 OpenAPI 可以更快的更簡單的獲取數據信息,只需要輸入基本信息自動生成相關腳本。