如何处理 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 也会显示调用成功或没有调用发生。
当 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 也会显示调用成功或没有调用发生。