【问题标题】:Why does application insight log 400 bad request as successful request and not log exception为什么应用程序洞察力将 400 错误请求记录为成功请求而不记录异常
【发布时间】:2018-08-15 18:58:48
【问题描述】:

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

所以我尝试从测试 Azure 函数中记录异常,但是当我抛出异常并返回 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)

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

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

那我错过了什么?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗯,这就是我的 TrackException 尝试不起作用的原因,就像在注册属性时一样?
    • TrackException 无论如何都应该工作。但是你只有 Request 事件摘要的截图,没有 Exception 细节,所以很难说
    • 嗯,我没有在应用程序洞察力中获得任何异常详细信息,因为它根本不记录任何内容。但我会用我所拥有的更多截图来更新这个问题。谢谢米哈伊尔。
    • 我已经提供了更多信息,请告诉我您是否需要查看其他内容以更好地理解。我对这个很陌生,呵呵:)
    【解决方案2】:

    “for this operation”未显示异常意味着您发送的异常与 azure 函数的 operationId 不同。手术 id 是应用洞察如何将相关遥测数据“链接”在一起。

    您的“异常记录”屏幕截图不是exception,而是request,因此您的异常中记录的自定义属性将不存在。

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

    【讨论】:

    • 你说得有道理,我是新手,感觉就像我在尝试手动执行异常时获得了更多控制权,而不是让函数运行时抛出异常。但我明白你在说什么。如果我想将自定义数据记录到异常中怎么办。你能做到让运行时处理异常抛出可以这么说还是我现在在森林里想知道? :P
    【解决方案3】:

    @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),Functions 会将跟踪记录到 Application Insights,然后记录异常以及请求失败。如果您没有在其他任何地方使用您的 TelemetryClient,您可以将其从您的代码中删除。

    【讨论】:

    • 好的,我一定会检查的。谢谢! :)
    • 只是另一个问题@brettsam,我还应该捕捉到异常吗?
    • 我的回答越来越复杂,所以请查看我的回答的更新,看看是否有帮助。
    • 这有帮助 谢谢你,虽然感觉像是某种解决方法:P 但如果这就是我控制我想做的事情的方式,那就这样吧:P 谢谢你的回答! :)
    猜你喜欢
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    相关资源
    最近更新 更多