Search code examples
azure-functionstimer-trigger

Azure Functions IsPastDue - when is it set to true?


I am trying to understand the IsPastDue flag.

I have written the following function in an attempt to simulate it.

[FunctionName("Function1")]
public static void Run([TimerTrigger("*/30 * * * * *")]TimerInfo myTimer, ILogger log)
{
    if (myTimer.IsPastDue)
    {
        log.LogInformation($"$Custom$C# Timer trigger was delayed at: {DateTime.Now}");
    }
    else
    {
        log.LogInformation($"$Custom$C# Timer trigger function started at: {DateTime.Now}");
        Thread.Sleep(45000);
        log.LogInformation($"$Custom$C# Timer trigger function ended at: {DateTime.Now}");
    }
}

The resulting logs are:

  • 2020-11-05T11:17:00.984 [Information] Executing 'Function1' (Reason='Timer fired at 2020-11-05T11:17:00.9844456+00:00', Id=0080629c-8b23-4c64-ab2b-233e389115c0)
  • 2020-11-05T11:17:00.985 [Information] $Custom$C# Timer trigger function started at: 11/5/2020 11:17:00 AM
  • 2020-11-05T11:17:45.991 [Information] $Custom$C# Timer trigger function ended at: 11/5/2020 11:17:45 AM
  • 2020-11-05T11:17:45.991 [Information] Executed 'Function1' (Succeeded, Id=0080629c-8b23-4c64-ab2b-233e389115c0, Duration=45007ms)
  • 2020-11-05T11:17:46.006 [Information] Executing 'Function1' (Reason='Timer fired at 2020-11-05T11:17:46.0066396+00:00', Id=94521af2-c5ef-49d9-bb05-14e54581d3f8)
  • 2020-11-05T11:17:46.007 [Information] $Custom$C# Timer trigger function started at: 11/5/2020 11:17:46 AM
  • 2020-11-05T11:18:31.015 [Information] $Custom$C# Timer trigger function ended at: 11/5/2020 11:18:31 AM
  • 2020-11-05T11:18:31.016 [Information] Executed 'Function1' (Succeeded, Id=94521af2-c5ef-49d9-bb05-14e54581d3f8, Duration=45009ms)
  • 2020-11-05T11:18:31.031 [Information] Executing 'Function1' (Reason='Timer fired at 2020-11-05T11:18:31.0312837+00:00', Id=aaae053a-5d91-4d8e-bd1b-99cec8813eec)
  • 2020-11-05T11:18:31.032 [Information] $Custom$C# Timer trigger function started at: 11/5/2020 11:18:31 AM
  • 2020-11-05T11:19:16.045 [Information] $Custom$C# Timer trigger function ended at: 11/5/2020 11:19:16 AM
  • 2020-11-05T11:19:16.046 [Information] Executed 'Function1' (Succeeded, Id=aaae053a-5d91-4d8e-bd1b-99cec8813eec, Duration=45015ms)
  • 2020-11-05T11:19:16.062 [Information] Executing 'Function1' (Reason='Timer fired at 2020-11-05T11:19:16.0624948+00:00', Id=a00c778f-a64c-4f87-a4c3-d523100204cb)
  • 2020-11-05T11:19:16.063 [Information] $Custom$C# Timer trigger function started at: 11/5/2020 11:19:16 AM
  • 2020-11-05T11:20:01.073 [Information] $Custom$C# Timer trigger function ended at: 11/5/2020 11:20:01 AM
  • 2020-11-05T11:20:01.074 [Information] Executed 'Function1' (Succeeded, Id=a00c778f-a64c-4f87-a4c3-d523100204cb, Duration=45012ms)
  • 2020-11-05T11:20:01.089 [Information] Executing 'Function1' (Reason='Timer fired at 2020-11-05T11:20:01.0890795+00:00', Id=37ad85ca-a0c0-4b7d-a39e-f9a42a5bca77)
  • 2020-11-05T11:20:01.090 [Information] $Custom$C# Timer trigger function started at: 11/5/2020 11:20:01 AM
  • 2020-11-05T11:20:46.094 [Information] $Custom$C# Timer trigger function ended at: 11/5/2020 11:20:46 AM
  • 2020-11-05T11:20:46.095 [Information] Executed 'Function1' (Succeeded, Id=37ad85ca-a0c0-4b7d-a39e-f9a42a5bca77, Duration=45005ms)
  • 2020-11-05T11:20:46.110 [Information] Executing 'Function1' (Reason='Timer fired at 2020-11-05T11:20:46.1101441+00:00', Id=bd3e21a2-f574-4c8b-834b-bdcf19e67d20)
  • 2020-11-05T11:20:46.110 [Information] $Custom$C# Timer trigger function started at: 11/5/2020 11:20:46 AM

The flag IsPastDue is never set to true. When is it set to true?


Solution

  • The isPastDue property is true when the current function invocation is later than scheduled. For example, a function app restart might cause an invocation to be missed. Here is the official document about it.

    You can try to repro it by run the function -> stop the function -> re-run the function in visual studio locally. But this is not 100% repro. I tried it for more than 10 times, it only occurs 1 time. Here is the screenshot when isPastDue is true in my test:

    enter image description here