为什么 Application Insight 将 400 错误请求记录为成功请求而不记录异常

Why does application insight log 400 bad request as successful request and not log exception

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

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

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

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

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

我首先创建了一个 AI 资源。

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

之后,我将 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)

在 Application insights 中,我只能看到 StatusCode 的错误请求:500 但是 400 个错误请求被记录为成功请求。

而且 TrackException 功能不记录任何自定义属性...

所以我错过了什么?

关于异常记录的更多详细信息:

服务器(Azure Function)处理请求没有错误,你从它返回了一个结果,所以从 Function App 运行时的角度来看,请求被成功处理。您也可以从日志中看到:

... Function completed (Success, ...

因此,Function App 在 Application Insights 中也将调用注册为成功是有道理的。至少,他们是这样选择实施它的。

"for this operation" 未显示异常意味着您发送的异常与 azure 函数没有相同的 operationId。手术 id 是应用程序见解 "links" 将遥测相关联在一起的方式。

您的 "exeption logging" 屏幕截图不是 exception,而是 request,因此您的异常记录的自定义属性不会在那里。

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

@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;
}

那会 return 500(而不是 400),Functions 会将跟踪记录到 Application Insights,然后记录异常和请求失败。如果您没有在其他任何地方使用您的 TelemetryClient,您可以将其从您的代码中删除。