Python:如何检查Azure Function是否仍在运行并具有队列

问题描述 投票:0回答:1

我知道这则帖子(how to check if Azure Function is still running or not)也有类似的问题。它并没有真正的帮助。

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

我的问题是我怎么知道结果已经全部写入Blob存储中,所以我可以触发下载?

我正在尝试研究azure-mgmt-monitor,以检查是否可以监视最后一分钟的请求/函数调用数,并将其放入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

并且在该时间段内带有请求计数的图表(来自见解资源)enter image description here

我最疯狂的猜测告诉我,我应该传递的id可能不是azure函数,而可能是另一个...我也没有其他关于如何执行此操作的想法。我也一直在看azure-mgmt-applicationinsights,但它比监视者还要晦涩难懂...

python azure azure-functions monitor
1个回答
0
投票

因此,几天后,我找到了一种从蔚蓝的见解中进行阅读的方法,尽管我并没有坚持该解决方案。

洞察方法

对于任何有兴趣的人,要使用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 Access Keys选项卡上的见解资源内从azure检索它。

对于自定义标头,您需要将您的令牌指定为您需要在见解资源中创建的一个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”属性中使用“创建”方法。这可能有点棘手,因为您需要传递一些“ linked_read_properties”。

我建议首先在azure门户中创建它,在python中阅读它,检查所需的属性,然后尝试通过python创建它。

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

我做了我的azure函数,该函数将结果写入blob_storage,还写入了“元数据”键/值。

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

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

希望这可以帮助所有人解决类似的问题;)

© www.soinside.com 2019 - 2024. All rights reserved.