問題描述
使用Python SDK來獲取Azure上的各種資源的Metrics的名稱以及Metrics Data的示例
問題解答
通過 azure-monitor-query ,可以建立一個 metrics client,呼叫 client.list_metric_definitions 來獲取Metrics 定義,然後通過 client.query_resource 獲取Metrics data。
關鍵函式為:
#第一步:定義 client client = MetricsQueryClient(credential=credential, endpoint='https://management.chinacloudapi.cn', audience='https://management.chinacloudapi.cn') #第二步:獲取metrics name response = client.list_metric_definitions(metric_uri) #第三步:獲取 metrcis data response = client.query_resource( resource_uri=url, metric_names=[name], timespan=timedelta(hours=2), granularity=timedelta(minutes=5), aggregations=[MetricAggregationType.AVERAGE], )
需要注意:
- endpoint 和 audience 需要根據程式碼的使用Azure環境不同而改變,以上為中國區Azure的Endpoint。與Global Azure 終結點對比文件見:https://docs.microsoft.com/en-us/azure/china/resources-developer-guide#check-endpoints-in-azuredevelop
- metrics_url 可以在Azure 門戶中的“屬性”頁面獲取,當然也可以通過Python對於資源的SDK進行獲取。示例程式碼見附錄一.
全部示例程式碼:
# import required package from ast import Try from warnings import catch_warnings from datetime import timedelta from azure.monitor.query import MetricsQueryClient, MetricAggregationType from azure.identity import AzureCliCredential ## pip install azure-identity # prepare credential credential = AzureCliCredential() #init metric query client, endpoint need to target China Azure client = MetricsQueryClient(credential=credential, endpoint='https://management.chinacloudapi.cn', audience='https://management.chinacloudapi.cn') def printMetricsDataByName(url, name): ##metrics_uri =metric_uri; ### os.environ.get('METRICS_RESOURCE_URI') response = client.query_resource( resource_uri=url, metric_names=[name], timespan=timedelta(hours=2), granularity=timedelta(minutes=5), aggregations=[MetricAggregationType.AVERAGE], ) for metric in response.metrics: print(metric.name + ' -- ' + metric.display_description) for time_series_element in metric.timeseries: for metric_value in time_series_element.data: print('\tThe {} at {} is {}'.format( name, metric_value.timestamp, metric_value.average )) print("### ..Special Reource URL.. ....") # specific resource uri metric_uri = '/subscriptions/<your-subscriptions-id>/resourceGroups/<your-resource-group>/providers/Microsoft.Cache/Redis/<your-resource-name>' # do query... response = client.list_metric_definitions(metric_uri) for item in response: print(item.name + " ...... Metrics Data ......") try: printMetricsDataByName(metric_uri,item.name) except Exception as e: print(e)
測試效果圖:
附錄一:例如在程式碼中獲取Redis資源的Resource ID
from azure.mgmt.redis import RedisManagementClient ## pip install azure-mgmt-redis from azure.identity import AzureCliCredential ## pip install azure-identity # prepare credential credential = AzureCliCredential() redisClient = RedisManagementClient(credential, '<YOUR SUB>', base_url='https://management.chinacloudapi.cn', credential_scopes=[https://management.chinacloudapi.cn/.default]) for item in redisClient.redis.list_by_subscription(): print(item.id)
以上程式碼執行結果:
附錄二:credential = AzureCliCredential() 為訪問Azure資源時提供認證授權的方法,如果出現許可權不夠,或者是無法訪問的情況,會出現類似如下的提示,需要根據訊息提示來解決許可權問題。
Code: AuthorizationFailed Message: The client 'xxxxxxxxxxxxxxxxxxx@xxxxx.partner.onmschina.cn' with object id 'xxxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxxxx'
does not have authorization to perform action 'Microsoft.Insights/metricDefinitions/read'
over scope '/subscriptions/xxxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxxxx/resourceGroups/xxxx-resource-group/providers/Microsoft.Cache/Redis/redis-xxxxxx/providers/Microsoft.Insights'
or the scope is invalid. If access was recently granted, please refresh your credentials.
參考資料
Azure Monitor Query client library Python samples: https://github.com/Azure/azure-sdk-for-python/tree/main/sdk/monitor/azure-monitor-query/samples
Azure China developer guide: https://docs.microsoft.com/en-us/azure/china/resources-developer-guide#check-endpoints-in-azuredevelop