如何解决在 Application Insights 中记录了 3 次我的 Azure 函数的异常
我已经创建了一个Blob Trigger Azure Function,我希望能够在出现异常时创建邮件警报,并且在邮件警报发送的信息中,应该有发生异常的文件的名称.
我注意到异常会自动记录在 Azure 中,但我发现无法自定义消息或随异常发送的信息。所以我决定在我的函数应用程序中注入一个遥测服务,并将文件名添加为自定义属性,如下面的代码所示:
public class Function1
{
private readonly IGremlinService _gremlinService;
private readonly TelemetryClient _telemetryClient;
public Function1(IGremlinService gremlinService,TelemetryConfiguration telemetryConfiguration)
{
this._gremlinService = gremlinService;
this._telemetryClient = new TelemetryClient(telemetryConfiguration);
}
[FunctionName(nameof(Function1))]
public async Task Run([BlobTrigger("files/{directory}/{name}.00.pdf",Connection = "AzureWebJobsStorage")] Stream myBlob,string name,ILogger logger)
{
try
{
//some code not related to the issue
}
catch (Exception e)
{
var properties = new Dictionary<string,string>
{{"Filename",name}};
_telemetryClient.TrackException(e,properties);
if (e is ResponseException)
{
ResponseException re = (ResponseException) e;
var statusCode = (long) re.StatusAttributes["x-ms-status-code"];
_telemetryClient.TrackTrace("Error on file " + name + ". Status code: " + statusCode + " " + re.StackTrace,SeverityLevel.Error,properties);
}
else
{
_telemetryClient.TrackTrace("Error on file " + name,properties);
}
throw;
}
}
}
}
但我仍然无法自定义消息以向用户提供其他信息。我知道我可以在跟踪消息上发送警报,并以这种方式发送自定义消息,这就是我目前正在做的事情,但我会发现发送异常警报更清晰。
我的第二个问题是,我的异常仍然会在被遥测服务记录的基础上自动记录,由于某种原因我无法理解,它们被记录了两次,正如您在下面来自 Application Insights 的屏幕截图中看到的:
有没有办法关闭异常的自动记录?或者有没有办法自定义这些我不知道的异常消息,而不是使用遥测服务?
解决方法
我相信,由于以下原因记录了 3 个异常:
- 正在记录的
IGremlinService
抛出异常的实现服务。 - 您正在通过
_telemetryClient.TrackException(e,properties);
登录
- 调用
throw
时,Azure 基础架构正在处理。
现在来回答你的问题
我找不到自定义消息或随异常发送的信息的方法
我建议您对 LogException 使用 ILogger
并使用 BeginScope
(读取 here)定义范围属性,这些属性将在所有日志的应用程序洞察中记录为自定义属性在创建范围的生命周期内调用。
使用 ILogger
对象,您的代码将被简化如下,范围内的所有跟踪和异常都将 FileName
作为应用程序洞察中的自定义属性。
[FunctionName(nameof(Function1))]
public async Task Run([BlobTrigger("files/{directory}/{name}.00.pdf",Connection = "AzureWebJobsStorage")] Stream myBlob,string name,ILogger logger)
{
using (logger.BeginScope(new Dictionary<string,object>()
{
["FileName"] = name,}))
{
try
{
//some code not related to the issue
}
catch (Exception e)
{
logger.LogError(e,"Error occurred with {StatusCode}",(long) re.StatusAttributes["x-ms-status-code"]);
throw;
}
}
}
下面总结了语句logger.LogException(e,(long) re.StatusAttributes["x-ms-status-code"]);
的定义
-
e
表示实际发生的异常。 - 代码部分
{StatusCode}
会将 StatusCode 作为自定义属性记录在应用程序洞察中,以便您无需创建任何字典。 -
FileName
将被记录为 Scope 定义的自定义属性。
您可以在 here 查看示例实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。