当作为持久编排链的一部分的活动函数中发生未知异常时,我希望通过电子邮件警报得到通知。问题是,当在 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;
}
}