为什么应用程序洞察将400错误请求记录为成功请求而不记录异常

时间:2018-03-07 15:43:14

标签: azure logging exception-handling azure-functions azure-application-insights

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

因此,我尝试从测试Azure功能中记录异常,但是当我抛出异常并返回400错误请求时,应用程序洞察会将日志注册为成功请求。

据我了解,可能注册了该功能的成功运行,但我不明白的是我应该如何记录该异常。

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

(我将从现在开始将Application Insights称为AI)

我从创建AI-Resource开始。

然后我拿了仪器键并将其应用到我的功能的应用程序设置。

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

{
  "frameworks": {
  "net46":{
  "dependencies": {
    "Microsoft.ApplicationInsights": "2.4.0"
      }
    }
  }
}

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

发起:

    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)

Test function result window

在应用程序洞察中,我只能看到对StatusCode的错误请求:500 但400个错误请求被记录为成功请求。

并且TrackException功能也没有记录任何自定义属性......

enter image description here

那我错过了什么?

关于例外记录的更多细节:

enter image description here enter image description here

3 个答案:

答案 0 :(得分:1)

服务器(Azure Function)无错误地处理了请求,您从中返回了结果,因此从Function App运行时的角度来看,请求已成功处理。您也可以从日志中看到:

  

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

因此,功能应用程序也可以在Application Insights中将调用注册为成功。至少,他们是如何选择实施它的。

答案 1 :(得分:1)

“for this operation”不显示异常意味着您发送的异常与azure函数没有相同的operationId。手术 id是应用程序见解如何“链接”相关的遥测。

您的“exeption logging”屏幕截图不是exception,而是request,因此您的例外中记录的自定义属性不会存在。

如果您希望您的azure函数失败,并显示为失败的请求,并记录异常,为什么要捕获异常并自行记录?没有捕获异常然后导致azure功能成功?为什么不让异常涓涓细流,让函数运行时为你做那部分? (不是吗?)

答案 2 :(得分:1)

@Mikhail是对的,我们认为这是成功的,因为功能是成功的。我们不想使用状态代码来猜测是否有成功的操作,因此我们查看该函数是否引发了异常。

您的异常未出现在该屏幕中,因为它与此功能执行没有属性相关。如果您转到App Insights Analytics并查询该ExceptionTelemetry,您应该会看到它。

为了将其与特定功能相关联,您需要设置OperationId,它与函数InvocationId相同。有一个示例显示如何使用事件,度量标准和依赖关系执行此操作,但对异常执行此操作是相同的(您可以忽略User.Id分配):https://docs.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 Insights,然后记录异常以及请求失败。如果您未在其他地方使用TelemetryClient,则可以从代码中删除它。

相关问题