如何在应用程序洞察中处理来自webjobs的异常?

问题描述 投票:0回答:1

当从webjob抛出异常时,它退出而不记录应用程序洞察。观察到将日志刷新到应用程序见解只需几分钟,因此我们在此处缺少例外情况。怎么办呢?

此外,有没有办法将触发异常的消息自动移动到毒性队列而无需手动将该消息插入毒性队列?

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

创建了一个实现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)当遇到默认情况时,即使在等待并再次启动Web作业之后,webjob也会立即终止并且记录器不会刷新到应用程序洞察中。由于需要花几分钟时间反映在应用洞察中,并且webjob停止,我将丢失错误日志。怎么办呢?

2)从这里的示例webjobs,https://github.com/Azure/azure-webjobs-sdk-samples/blob/master/BasicSamples/QueueOperations/Functions.cs他们正在使用JobHost host = new JobHost();如果'FailAlways'功能失败,它会自动重试5次并将消息推送到毒药队列中。但是我的代码中没有发生这种情况。是因为不同的主机?或者我是否必须添加更多配置?

azure azure-webjobs azure-application-insights azure-webjobssdk
1个回答
0
投票

在检查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.

有没有办法将触发异常的消息自动移动到毒性队列而无需手动将该消息插入毒性队列?

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

应该在代码中添加MaxDequeueCount配置在哪里?

您可以在program.cs中的JobHostConfiguration中设置该属性

© www.soinside.com 2019 - 2024. All rights reserved.