Python:如何检查 Azure Functions 是否仍然是 运行 并且有队列

Python: How to check if Azure Function is still running and has queue

我知道有一个 post () 有类似的问题。真的没什么用。

我有一个函数可以在一段时间内分批接收输入(例如:1000 批,每批 n 个样本)。批次不会同时到达。该函数处理每个批次并将输出写入 blobstoragecontainer 中的 blob。

我的问题是如何知道结果已全部写入 blob 存储以便触发下载?

我试图查看 azure-mgmt-monitor 以检查我是否可以监控最后一分钟的 requests/function 调用次数并将其放入 while 循环直到某些指标(可能是其他指标)是 0。我可以通过一些聚合在一个时间跨度内调用一些指标,但出于某种原因,我一直将所有值都设置为 0(当我知道有调用时)。

下面的一些代码(azure_mngr.monitor 是 azure.mgmt.monitor.MonitorManagementClient 的一个实例:

start_date = datetime.datetime(2020, 6, 2, 10, 0, 0)
end_date = datetime.datetime(2020, 6, 2, 11, 0, 0)
azure_mngr.monitor.metrics.list(azure_function_id, metricnames='Requests,RequestsInApplicationQueue,FunctionExecutionCount', interval='PT1M', timespan=f'{start_date}/{end_date}', aggregation='Count,Average,Maximum,Minimum')

结果

for metric in a.value:
    for datapoint in metric.timeseries[0].data:
        print(f'{metric.name.value} | {datapoint.time_stamp} | {datapoint.count}')

Requests | 2020-06-02 10:00:00+00:00 | 0.0
Requests | 2020-06-02 10:15:00+00:00 | 0.0
Requests | 2020-06-02 10:30:00+00:00 | 0.0
Requests | 2020-06-02 10:45:00+00:00 | 0.0
RequestsInApplicationQueue | 2020-06-02 10:00:00+00:00 | 0.0
RequestsInApplicationQueue | 2020-06-02 10:15:00+00:00 | 0.0
RequestsInApplicationQueue | 2020-06-02 10:30:00+00:00 | 0.0
RequestsInApplicationQueue | 2020-06-02 10:45:00+00:00 | 0.0
FunctionExecutionCount | 2020-06-02 10:00:00+00:00 | 0.0
FunctionExecutionCount | 2020-06-02 10:15:00+00:00 | 0.0
FunctionExecutionCount | 2020-06-02 10:30:00+00:00 | 0.0
FunctionExecutionCount | 2020-06-02 10:45:00+00:00 | 0.0

以及那个时期请求计数的图表(来自洞察力资源)

我最大胆的猜测告诉我,我应该传递的 id 可能不是 azure 函数,而是另一个...... 我也不知道如何做到这一点。我也一直在看azure-mgmt-applicationinsights,但它比monitor更晦涩...

所以几天后,我找到了一种从 azure insights 中阅读的方法,尽管我没有坚持使用该解决方案。

洞察方法

对于任何感兴趣的人,要从您需要使用 azure-applicationinsights 包(而不是 azure-mgmt-applicationinsights)的见解中读取指标。 然后您使用您的 Azure 凭据实例化一个 ApplicationInsightsDataClient,您可以按如下方式发送查询:

from azure.applicationinsights import ApplicationInsightsDataClient

client = ApplicationInsightsDataClient(<credentials>)
metric = client.metrics.get(<application_id>, <metric>, custom_headers=<custom_headers>, **<other_kwargs>)

现在,棘手的部分是 "application_id" 和 "custom_headers"。 首先,您可以从 API 访问密钥选项卡上的见解资源中的 azure 中检索它。

对于自定义 headers,您需要将您的令牌指定为您需要在见解资源中创建的 API_key(与上述相同的位置)。格式应为:

custom_headers = {'x-api-key': <api_key>}

要了解您可以从洞察资源中获得哪些指标,您可以

available_metrics = client.metrics.get_metadata(<application_id>, custom_headers=custom_headers)

此外,如果您在 CI/CD 管道中部署,您还可以自动检索 ApplicationID 和创建 api_key。

要在我刚刚创建的 gitlab 管道日志上获取应用程序 ID,并以 terraform 的形式输出它(查看 terraform 输出文档) 对于 api_key 创建,您需要使用 azure-mgmt-applicationinsights 包并实例化一个 ApplicationInsightsManagementClient(现在不确定这个名称)

传递凭据并在 "api_keys" 属性中使用 "create" 方法。这可能有点棘手,因为您需要传递一些 "linked_read_properties"。

我的建议是先在 azure portal 中创建它,在 python 中阅读它,检查您需要的属性,然后尝试通过 python 创建它。

至于我最终坚持的解决方案。

我创建了将结果写入 blob_storage 的 azure 函数,以便同时写入 "metadata" key/value。

如果还有一些批次要 运行,它会将其写为 False。如果是最后一批将其更改为 True。

然后我只读取 python 中的 blob 属性,直到值为 True。

希望这可以帮助遇到类似问题的任何人 ;)