使用 AzureWebJobsSDK ErrorTrigger 扩展的错误监控不起作用

Error monitoring using AzureWebJobsSDK ErrorTrigger Extension not working

我正在尝试在 2 分钟的滑动 window 持续时间内发生超过 2 个错误时触发电子邮件功能。但是在测试期间,错误监视器不起作用。例如在下面的函数中

private void Deserialize(string info)
{
     try {
           SampleData data = JsonConvert.DeserializeObject<SampleData>(info); 
         }

      catch ( Exception e ) {
            TraceEvent error = new TraceEvent(TraceLevel.Error, "Error detected");
            error.Properties.Add("ErrorInfo", e.Message);
            trace.Trace(error);
}

如果字符串info无法反序列化,抛出异常,2个这样的错误应该触发这个函数:

  private void ErrorMonitor([ErrorTrigger("00:02:00", 2, Throttle = "1:00:00")] TraceFilter filter)
        {
            EmailInfo();
        }

但是,这不起作用。我是否正确地将 ErrorMonitor 绑定到 TraceFilter?这只是一个示例代码,我有不止一个可能发生错误的函数,而 ErrorMonitor() 需要跟踪所有这些错误。

更新: 我发现 ErrorTrigger 工作得很好。 ErrorTrigger 不工作的原因是因为所有异常都在 try-catch 块中处理。 ErrorTrigger 从 Trace 中获取错误。控制台上的任何非错误消息(显示为红色)都不会被 ErrorTriggers 视为错误;不管发生多少异常。

更新 2: Bruce 的建议即使在处理 try-catch 块中的错误之后也能从 Trace 中提取错误消息。 TraceWriter 必须在预计会出现错误的函数中传递。修改后的代码为:

private void Deserialize(string info, TraceWriter trace) { }

根据您的要求,我测试了一下,我这边可以正常使用。请注意,您不需要用 try-catch 包装您的代码。发生错误时,运行时会自动收集错误。这是我的代码片段,您可以参考它:

Program.cs

static void Main()
{
    JobHostConfiguration config = new JobHostConfiguration();
    config.Tracing.ConsoleLevel = System.Diagnostics.TraceLevel.Verbose;
    config.UseTimers();
    config.UseCore();
    JobHost host = new JobHost(config);
    host.RunAndBlock();
}

Functions.cs

public static void TimerWorker([TimerTrigger("00:00:10")] TimerInfo timer)
{
    //Simulate throwing errors when running your logic code
    throw new Exception(string.Format("GenerateError:{0}", DateTime.Now.Ticks));
}

/// <summary>
/// Global error monitor function that will be triggered whenever errors
/// </summary>
/// <param name="filter"></param>
public static void ErrorMonitor([ErrorTrigger("00:00:20", 1, Throttle = "00:00:40")] TraceFilter filter)
{
    //log last 5 detailed errors to the Dashboard 
    string errors = filter.GetDetailedMessage(5);
    Console.WriteLine("ErrorMonitor: " + errors);
}

注意:根据代码,只要在滑动window的20秒内发生1个错误,就会触发ErrorMonitor(最多限制为1每 40 秒通知一次)。

此外,您还可以指定仅处理特定函数错误的特定错误处理程序。您可以关注此 tutorial 关于 ErrorTrigger 的内容,以便更好地理解它。