我遇到了一个我不熟悉的问题。
所以我尝试记录来自测试Azure函数的异常,但是当我抛出一个异常并返回一个400错误的请求时,应用程序洞察力将日志注册为一个成功的请求。
据我所知,这可能是注册函数的成功运行,但我不明白的是,我应该如何记录异常。
到目前为止,我所做的就是这个。
(从现在起,我将把应用洞察力称为AI )
我一开始创造了一个人工智能资源。
然后,我拿起仪器钥匙,并将其应用到我的功能的应用程序设置中。
在此之后,我将AI NUGET安装到我的函数中,创建一个Projet.json文件,然后粘贴类似的东西,安装必要的程序集等等。
{
"frameworks": {
"net46":{
"dependencies": {
"Microsoft.ApplicationInsights": "2.4.0"
}
}
}
}在此之后,我在函数中初始化TelemetryClient,并尝试在捕获中记录和异常:
发起:
string key = TelemetryConfiguration.Active.InstrumentationKey = System.Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY", EnvironmentVariableTarget.Process);
TelemetryClient telemetry = new TelemetryClient() {
InstrumentationKey = key
}; 捕获:
catch (Exception e)
{
Dictionary<string,string> properties = new Dictionary<string,string>();
properties.Add("Function Payload", data.ToString());
properties.Add("Function Exception", e.ToString());
telemetry.TrackException(e, properties);
return req.CreateResponse(HttpStatusCode.BadRequest, e);
}测试运行我得到的函数:
2018-03-07T14:24:36.171 [Info] Function started (Id=0292b455-314d-4c4c-872a-2b8137a72305)
2018-03-07T14:24:37.092 [Info] Function completed (Success, Id=0292b455-314d-4c4c-872a-2b8137a72305, Duration=931ms)

在应用程序洞察力中,我只能看到StatusCode的坏请求:500个,但是400个坏请求被记录为成功的请求。
而且TrackException功能不记录任何自定义属性..。

那我错过了什么?
有关异常日志记录的更多详细信息:


发布于 2018-03-08 19:47:50
@Mikhail是对的,我们认为这是成功的,因为它的功能是成功的。我们不想使用状态代码来猜测是否有一个成功的操作,所以我们寻找函数是否抛出了一个异常。
您的异常没有出现在屏幕上,因为它没有与此函数执行相关的属性。如果您转到App分析并查询该ExceptionTelemetry,您应该会看到它。
为了将它与特定的函数关联起来,您需要设置OperationId,这与函数的InvocationId相同。有一个示例展示了如何使用事件、度量和依赖来完成此操作,但对于异常执行此操作是相同的(您可以忽略User.Id分配):https://learn.microsoft.com/en-us/azure/azure-functions/functions-monitoring#custom-telemetry-in-c-functions
更新:根据您在上面所展示的功能,您可能可以通过这样的操作而逃脱:
catch (Exception e)
{
log.Error("Function Payload " + data.ToString());
throw;
}这将返回500 (而不是400),函数将记录跟踪到Application,然后记录异常和请求失败。如果您不在其他地方使用TelemetryClient,则可以将其从代码中删除。
发布于 2018-03-07 15:59:44
服务器(Azure函数)处理请求时没有出错,您从它返回了一个结果,因此从函数Azure的角度来看,请求被成功地处理了。您也可以从日志中看到这一点:
..。功能完成(成功,.
因此,函数App将调用注册为在Application中的成功也是有意义的。至少,这是他们选择实现它的方式。
发布于 2018-03-07 22:17:57
“用于此操作”不显示异常意味着您发送的异常不具有与azure函数相同的operationId。操作id是如何将应用洞察力“链接”到一起的相关遥测。
您的“盗用日志”屏幕快照不是exception,而是request,因此在异常上记录的自定义属性不会出现。
如果您希望您的azure函数失败,并显示为失败的请求,并记录一个异常,您为什么要捕获异常并自己记录呢?是否会捕捉到异常,从而导致azure函数成功?为什么不让异常流出来,让函数运行时为您完成这个部分呢?(不是吗?)
https://stackoverflow.com/questions/49155906
复制相似问题