如何处理 application insights 中 webjobs 的异常?

How to handle exceptions from webjobs in application insights?

当 webjob 抛出异常时,它会退出而不记录到 application insights。观察到将日志刷新到 application insights 需要几分钟,所以我们在这里忽略了异常。如何处理?

另外,有没有办法将命中异常的消息自动移动到毒队列,而无需手动将该消息插入毒队列?

我正在为 2 个 NuGet 包使用最新的稳定 3.x 版本: Microsoft.Azure.WebJobs 和 Microsoft.Azure.WebJobs.扩展

创建了一个实现 IHost 的主机,如下所示:

        var builder = new HostBuilder()
            .UseEnvironment("Development")
            .ConfigureWebJobs(b =>
            {
                ...
            })
            .ConfigureLogging((context, b) =>
            {
                string appInsightsKey = context.Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
                if (!string.IsNullOrEmpty(appInsightsKey))
                {
                    b.AddApplicationInsights(o => o.InstrumentationKey = appInsightsKey);
                    appInsights.TrackEvent("Application Insights is starting!!");
                }
            })
            .ConfigureServices(services =>
            {
              ….
            })
            .UseConsoleLifetime();
        var host = builder.Build();
        using (host)
        {
            host.RunAsync().Wait();
        }

和Function.cs

   public static async void ProcessQueueMessageAsync([QueueTrigger("queue")] Message message, int dequeueCount, IBinder binder, ILogger logger)
    {
        switch (message.Name)
        {
            case blah:
                ...break;
            default:
                logger.LogError("Invalid Message object in the queue.", message);
                logger.LogWarning("Current dequeue count: " + dequeueCount);
                throw new InvalidOperationException("Simulated Failure");
        }
    }

我的问题是:

1) 当遇到默认情况时,webjob 会立即终止,即使在等待并再次启动 web 作业后,记录器也不会刷新到应用洞察中。由于需要几分钟才能反映在应用程序洞察中,并且 webjob 停止,所以我丢失了错误日志。如何处理?

2) 从此处的示例网络作业中,https://github.com/Azure/azure-webjobs-sdk-samples/blob/master/BasicSamples/QueueOperations/Functions.cs 他们正在使用 JobHost host = new JobHost();如果 'FailAlways' 函数失败,它会自动重试 5 次并将消息推入毒队列。但这并没有发生在我的代码中。是因为Host不同吗?还是我必须添加更多配置?

在检查 Application Insights SDK 的源代码后,很明显要在 Application Insights 中获取异常,您必须将异常对象传递到 LogError 调用中。

log.Error(ex, "my error message") - will result in Application Insight Exception

log.Error("my error message") - will result in Application Insight Trace.

is there a way to move the message which hit the exception to poison queue automatically without manually inserting that message to poison queue?

您可以在 webjob 中设置 config.Queues.MaxDequeueCount = 1;。在将消息移至病毒队列之前尝试处理消息的次数。

And where is the MaxDequeueCount configuration should be added in the code?

您可以在 program.cs

中设置 JobHostConfiguration 中的 属性

尝试将函数更改为 return Task 而不是 void:

public static async Task ProcessQueueMessageAsync([QueueTrigger("queue")] Message message, int dequeueCount, IBinder binder, ILogger logger)

这对我有用,即使我正在记录错误并抛出异常,Application Insights 也会显示调用成功或没有调用发生。