0

当作为持久编排链的一部分的活动函数中发生未知异常时,我希望通过电子邮件警报得到通知。问题是,当在 Activity Function 中引发异常时,Application Insights 中记录的错误显示状态代码为零。在 Azure 警报中,没有警报配置会查找零的日志消息状态代码,只有 1xx、2xx、4xx 等。无论我尝试过什么代码,我都无法让函数返回4xx of 5xx 错误代码。

如何在 Azure Monitor 警报中设置以捕获失败的业务流程?有没有办法在抛出异常时强制使用非零状态代码?

背景信息

如以下屏幕截图所示,持久功能的 Azure Monitor 显示失败,这正是我所期待的......

在此处输入图像描述

但是,我不知道如何设置警报来检测此故障。在 Application Insights 中查找异常,导致失败的响应代码为零...

在此处输入图像描述

转到 Azure Monitor 警报,在设置新警报以检测此情况时,没有状态代码为零的警报条件之类的东西(这很有意义,但对我没有帮助)...

在此处输入图像描述

这是一个 Activity 函数的外壳,它故意抛出一个异常来帮助我设置警报并知道它正在工作......

[FunctionName("SearchProductIndexFunctionActivity")]
public static async Task Run(
    [ActivityTrigger]string input,
    ILogger logger,
    ExecutionContext context)
{
    logger.LogInformation("Started SearchProductIndexFunctionActivity...");

    throw new ArgumentException("Oops...");

    logger.LogInformation("Finished SearchProductIndexFunctionActivity successfully.");
}

这是调用 Activity 函数的 Orchestrator 函数。如果没有捕获并重新抛出所有异常,Orchestrator Function 会显示无用的“成功”状态......我想知道失败的事情。但是,此异常导致的响应状态代码为零无助于设置警报。对于如何解决这个问题,有任何的建议吗?

[FunctionName("SearchOrchestration")]
public static async Task Run(
    [OrchestrationTrigger]DurableOrchestrationContext orchestrationContext,
    ExecutionContext context,
    ILogger logger)
{
    try
    {
        await orchestrationContext.CallActivityAsync(PART_INDEX_UPDATE_ACTIVITY_NAME, null);

        await orchestrationContext.CallActivityAsync(PRODUCT_INDEX_UPDATE_ACTIVITY_NAME, null);
    }
    catch (Exception ex)
    {
        logger.LogError(ex, $"Search index orchestration failed.");
        throw;
    }
}
4

1 回答 1

0

由于您使用的是应用程序洞察力,因此您可以考虑使用根据此文档创建自定义日志搜索警报

对于“资源”,您应该选择用于 azure 功能的应用程序洞察力。

对于“条件”,选择“自定义日志搜索”。然后在“搜索查询”文本框中,您可以编写查询。在您的情况下,错误应该在应用程序洞察的异常表中,因此查询看起来像exceptions | your_query_for_error.


如果对应用洞察中的类sql查询不熟悉,可以参考这篇文章。您可以先在应用程序洞察力中编写查询,以确保它可以按预期工作。应用洞察中的查询截图:

在此处输入图像描述

于 2019-12-06T02:19:43.073 回答