我正在使用禁用自动依赖项跟踪的 Azure Functions 并手动跟踪我的依赖项。
我还使用为跟踪和指标提供的 SDK ILogger
,并大量使用ILogger.BeginScope(...)
来跟踪有关操作的详细信息。
是否可以获得当前范围属性,以便我可以将它们添加到我的依赖项跟踪中?
例子是
using(var scope = log.BeginScope("{document}{user}", documentId, userId)){
// do HTTP Call using HttpClient
}
HTTP 客户端配置
.AddHttpMessageHandler(serviceProvider => new
DependencyLoggingMessageHandler(serviceProvider.GetRequiredService<TelemetryClient>()))
和消息处理程序
public class DependencyLoggingMessageHandler : DelegatingHandler
{
private readonly TelemetryClient client;
public DependencyLoggingMessageHandler(TelemetryClient client)
{
this.client = client;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = null;
try
{
response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
return response;
}
finally
{
client.TrackDependency(new DependencyTelemetry(..){
Data = ...,
Properties = /*how to get scope props? */
});
}
}
}
在为此创建的 AppInsights 依赖项中,我希望拥有document
和user
作为属性,如 SDK 创建的跟踪和指标。
更新:
目前我有 2 个(有问题的)解决方案
- 如果你想要一个简洁、简单的实现,使用
LogMetric("HTTP_REQUEST", duration, properties)
它将像往常一样拥有范围属性并将你的东西添加到它的属性中。
当然它不会出现在应用洞察依赖项中,但是您可以将 HTTP 请求的持续时间作为其值,拥有 url、host 等。作为自定义属性并完成大多数事情。我的主要要求是跟踪持续时间和 url,这在这个解决方案中有效,所以我现在已经解决了这个解决方案。
- 自己维护范围属性
我认为这可以通过基本上复制 Functions Runtime 的功能来完成。即在 a 中使用它的自定义版本AsyncLocal
并从当前范围迭代到根范围,然后像运行时一样将它们添加到遥测中。在我看来,工作比它的价值要多得多。