我遇到了一个我不熟悉的问题。
因此,我尝试记录来自测试 Azure 函数的异常,但当我引发异常并返回 400 错误请求时,应用程序洞察会将日志注册为成功请求。
据我了解,它可能是注册函数的成功运行,但我不明白的是我应该如何记录异常。
所以到目前为止我所做的是这样的。
(从现在开始,我将把 Application Insights 称为 AI)
我首先创建了一个 AI 资源。
然后我拿起仪器 key 并将其应用到我的功能的应用程序设置中。
之后,我将 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 功能不会记录任何自定义属性...
那我错过了什么?
有关异常日志记录的更多详细信息:
最佳答案
@Mikhail 是对的,我们认为这是成功的,因为该函数是成功的。我们不想使用状态码来猜测操作是否成功,因此我们寻找函数是否抛出异常。
您的异常没有出现在该屏幕中,因为它没有与此函数执行相关的属性。如果您转到 App Insights Analytics 并查询该 ExceptionTelemetry
,您应该会看到它。
为了将其与特定函数相关联,您需要设置 OperationId
,它与函数的 InitationId
相同。有一个示例展示了如何对事件、指标和依赖项执行此操作,但对异常执行此操作是相同的(您可以忽略 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),Functions 会将跟踪记录到 Application Insights,然后记录异常以及请求失败。如果您没有在其他地方使用 TelemetryClient
,您可以将其从代码中删除。
关于azure - 为什么应用程序洞察将 400 错误请求记录为成功请求而不记录异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49155906/
多年来,这一直是令人困惑和沮丧的根源。假设您导入了一个文档记录特别差的模块,并且您需要的某个方法只有 **kwargs 作为其参数,您应该如何知道该方法正在检查哪些键? def test(**kwar
一:背景 1. 讲故事 前几天写了一篇 如何洞察 .NET程序 非托管句柄泄露 的文章,文中使用 WinDbg 的 !htrace 命令实现了句柄泄露的洞察,在文末我也说了,Wi
所以我正在尝试使用 Facebook Python API提取我们的参与数据(点赞、分享等,基本上是 Facebook 网站上“洞察”选项卡下的所有内容)。 我已设法通过 API 建立连接并使访问 t
我注意到从 facebook insights 返回的数据在从 API 获取数据时与从 CSV 导出数据中获取时存在一致的差异。例如,对于某个指标 (page_impressions_unique_d
我用 Python 创建了一个 XGBoost 模型,并使用以下代码来更好地理解该模型: xgb.plot_importance(model) 或 xgb.plot_importance(model,
谁能告诉我 Visual Studio 的内存转储中概述的行为类型 正常吗?例如,StackExchange.Redis.PhysicalConnection 在包含大小(字节)上运行得那么高吗?还是
谁能告诉我 Visual Studio 的内存转储中概述的行为类型 正常吗?例如,StackExchange.Redis.PhysicalConnection 在包含大小(字节)上运行得那么高吗?还是