2

我正在使用禁用自动依赖项跟踪的 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 依赖项中,我希望拥有documentuser作为属性,如 SDK 创建的跟踪和指标。


更新:

目前我有 2 个(有问题的)解决方案

  1. 如果你想要一个简洁、简单的实现,使用LogMetric("HTTP_REQUEST", duration, properties)它将像往常一样拥有范围属性并将你的东西添加到它的属性中。

当然它不会出现在应用洞察依赖项中,但是您可以将 HTTP 请求的持续时间作为其值,拥有 url、host 等。作为自定义属性并完成大多数事情。我的主要要求是跟踪持续时间和 url,这在这个解决方案中有效,所以我现在已经解决了这个解决方案。

  1. 自己维护范围属性

我认为这可以通过基本上复制 Functions Runtime 的功能来完成。即在 a 中使用它的自定义版本AsyncLocal并从当前范围迭代到根范围,然后像运行时一样将它们添加到遥测中。在我看来,工作比它的价值要多得多。


如果您有更好/不同的解决方案,请将您的答案放在下面。

4

0 回答 0