首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么应用程序洞察力记录400错误请求为成功请求而不是日志异常

为什么应用程序洞察力记录400错误请求为成功请求而不是日志异常
EN

Stack Overflow用户
提问于 2018-03-07 15:43:13
回答 3查看 3.1K关注 0票数 2

我遇到了一个我不熟悉的问题。

所以我尝试记录来自测试Azure函数的异常,但是当我抛出一个异常并返回一个400错误的请求时,应用程序洞察力将日志注册为一个成功的请求。

据我所知,这可能是注册函数的成功运行,但我不明白的是,我应该如何记录异常。

到目前为止,我所做的就是这个。

(从现在起,我将把应用洞察力称为AI )

我一开始创造了一个人工智能资源。

然后,我拿起仪器钥匙,并将其应用到我的功能的应用程序设置中。

在此之后,我将AI NUGET安装到我的函数中,创建一个Projet.json文件,然后粘贴类似的东西,安装必要的程序集等等。

代码语言:javascript
复制
{
  "frameworks": {
  "net46":{
  "dependencies": {
    "Microsoft.ApplicationInsights": "2.4.0"
      }
    }
  }
}

在此之后,我在函数中初始化TelemetryClient,并尝试在捕获中记录和异常:

发起:

代码语言:javascript
复制
    string key = TelemetryConfiguration.Active.InstrumentationKey = System.Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY", EnvironmentVariableTarget.Process);
    TelemetryClient telemetry = new TelemetryClient() { 
    InstrumentationKey = key 
    }; 

捕获:

代码语言:javascript
复制
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);
}

测试运行我得到的函数:

代码语言:javascript
复制
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功能不记录任何自定义属性..。

那我错过了什么?

有关异常日志记录的更多详细信息:

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

更新:根据您在上面所展示的功能,您可能可以通过这样的操作而逃脱:

代码语言:javascript
复制
catch (Exception e)
{    
    log.Error("Function Payload " + data.ToString());
    throw;
}

这将返回500 (而不是400),函数将记录跟踪到Application,然后记录异常和请求失败。如果您不在其他地方使用TelemetryClient,则可以将其从代码中删除。

票数 2
EN

Stack Overflow用户

发布于 2018-03-07 15:59:44

服务器(Azure函数)处理请求时没有出错,您从它返回了一个结果,因此从函数Azure的角度来看,请求被成功地处理了。您也可以从日志中看到这一点:

..。功能完成(成功,.

因此,函数App将调用注册为在Application中的成功也是有意义的。至少,这是他们选择实现它的方式。

票数 1
EN

Stack Overflow用户

发布于 2018-03-07 22:17:57

“用于此操作”不显示异常意味着您发送的异常不具有与azure函数相同的operationId。操作id是如何将应用洞察力“链接”到一起的相关遥测。

您的“盗用日志”屏幕快照不是exception,而是request,因此在异常上记录的自定义属性不会出现。

如果您希望您的azure函数失败,并显示为失败的请求,并记录一个异常,您为什么要捕获异常并自己记录呢?是否会捕捉到异常,从而导致azure函数成功?为什么不让异常流出来,让函数运行时为您完成这个部分呢?(不是吗?)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49155906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档