使用AzureWebJobsSDK错误监控ErrorTrigger扩展无法正常工作

时间:2016-09-20 11:44:18

标签: azure error-handling azure-webjobs azure-webjobssdk

我试图在2分钟的滑动窗口持续时间内发生超过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:布鲁斯的建议使得即使在处理try-catch块中的错误后也能从Trace中获取错误消息。必须在期望错误的函数中传递TraceWriter。修改后的代码是:

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

1 个答案:

答案 0 :(得分:2)

根据您的要求,我测试了它,我可以按照预期在我这边工作。请注意,您不需要使用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);
}

注意:在代码中,只要在20秒的滑动窗口内发生1次错误就会触发ErrorMonitor(每40秒最多会发出1次通知)。

此外,您还可以指定仅处理特定函数错误的特定错误处理程序。您可以按照tutorial关于ErrorTrigger的说明来更好地理解它。