使用 Azure-Monitoring-libraries-for-python 从 Azure-Monitor 监控 azure-resources 并获取这些指标

Monitoring azure-resources from Azure-Monitor by using Azure-Monitoring-libraries-for-python and getting these metrics

我们将从 Azure Monitor 获取一些指标。
我安装了这些库并编写了一个脚本来执行此操作。
脚本如下。

#! /usr/bin/env python
 
import datetime
from azure.mgmt.monitor import MonitorManagementClient
from azure.identity import ClientSecretCredential

subscription_id = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
resource_group_name = 'xxxx-xxxxx'
vm_name = 'xxxxxxxxxx'
 
resource_id = (
    "subscriptions/{}/"
    "resourceGroups/{}/"
    "providers/Microsoft.Compute/virtualMachines/{}"
).format(subscription_id, resource_group_name, vm_name)
 
TENANT_ID = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
CLIENT = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
KEY = 'xxxxxxxxx'
credentials = ServicePrincipalCredentials(
    client_id = CLIENT,
    secret = KEY,
    tenant = TENANT_ID
)
 
client = MonitorManagementClient(
    credentials,
    subscription_id
)
 
today = datetime.datetime.now()
nexttime = today - datetime.timedelta(minutes=1)
 
metrics_data = client.metrics.list(
    resource_id,
    timespan="{}/{}".format(nexttime, today),
    interval='PT1M',
    metricnames='Percentage CPU',
    aggregation='average'
)
for item in metrics_data.value:
    for timeserie in item.timeseries:
        for data in timeserie.data:
            print("{}".format(data.average))

当我 运行 这个脚本时,结果有时会显示 'None',不管我在 Azure-Monitor 上都能看到正确的值。
当我 运行 从 Azure 负载均衡器获取指标的脚本时,脚本 return 是正确的值。
这个URL(https://docs.microsoft.com/en-us/azure/azure-monitor/essentials/metrics-supported#microsoftcomputevirtualmachines)表示PercentageCPU的聚合类型是Average,所以脚本似乎是正确的。
我不知道为什么这个获取百分比的脚本 CPU 与 Azure-Monitor return 的值不同。
有人知道解决办法吗?

Azure 监视器按 UTC 时间记录指标,因此您应该使用 today = datetime.datetime.utcnow() 来定义您的时间跨度。

根据您的代码,您查询的是最新的 1 分钟 VM CPU 百分比,Azure 监控日志指标会有一些延迟,所以可能由于延迟而无法获取此值,所以也许您可以尝试获取最后 5 分钟的 i,e CPU 百分比。

只需尝试下面的代码片段:

today = datetime.datetime.utcnow()
nexttime = today - datetime.timedelta(minutes=5)

query_timespan = "{}/{}".format(nexttime, today - datetime.timedelta(minutes=4))

print(query_timespan)

metrics_data = client.metrics.list(
    resource_id,
    timespan=query_timespan,
    interval='PT1M',
    metricnames='Percentage CPU',
    aggregation='average'
)
for item in metrics_data.value:
    for timeserie in item.timeseries:
        for data in timeserie.data:
            print("{}".format(data.average))

我这边的结果:

传送门展示(我的时区是UTC+8):