作为我们正在构建的基于微服务的解决方案的一部分,我们在一个Azure功能应用程序中有许多Azure功能。这些函数为不同的API编排了大量请求,其中一些请求需要很长时间才能完成。我们在函数中添加了Application Insights,以便对请求进行一些跟踪,但依赖关系跟踪在Azure Functions中尚未运行。可以手动跟踪依赖关系,但这涉及在每个依赖关系调用周围插入一些跟踪代码,但是我们希望避免手动跟踪每个调用的依赖关系。
我想到的解决方案之一是创建一个跟踪来自函数的所有传出Web请求的请求跟踪器。在请求跟踪器中,我可以跟踪依赖请求,包括他们的时间。我想将请求跟踪器挂钩到某种Web流量处理程序,遗憾的是我无法找到很多关于这样做的信息。很多posts提到使用System.Net跟踪编写器,但据我所知,这需要Web.config设置和功能没有。
我已经看到一些帖子提到创建一个请求包装器并将其放在我的传出请求上,但不幸的是,这不是一个选项,因为我们使用了许多在内部发出请求的包。如果您有任何想法可以让我朝着正确的方向前进,请告诉我。谢谢
更新:
我添加了以下帮助器方法,它允许我手动跟踪任务作为依赖项请求
public static async Task<T> TrackDependency<T>(this Task<T> task, string dependecyName, string callName, string operationId)
{
var telemtryClient = new TelemetryClient();
var startTime = DateTime.UtcNow;
var timer = System.Diagnostics.Stopwatch.StartNew();
var success = true;
T result = default(T);
try
{
result = await task;
}
catch (Exception)
{
success = false;
}
finally
{
timer.Stop();
var dependencyTelemetry = new DependencyTelemetry(dependecyName, callName, startTime, timer.Elapsed, success);
dependencyTelemetry.Context.Operation.Id = operationId;
telemtryClient.Track(dependencyTelemetry);
}
return result;
}
然后可以使用如下:
client.Accounts.UpdateWithHttpMessagesAsync(accountId, account).TrackDependency("Accounts", "UpdateAccounts", requestContextProvider.CorrelationId);
我现在可以在Application Insights中看到各个请求依赖项,但显然它们上的实际遥测非常有限,它不包含路径信息或其他内容。
因此,当您说依赖关系跟踪在Azure Functions中不起作用时,您究竟是什么意思?您是否真的在实际功能中添加并配置了Application Insights SDK? Azure Functions的开箱即用监控体验不会自动添加依赖关系跟踪,但如果您在功能项目中实际添加/配置Application Insights SDK,它应该开始跟踪那里发生的一切。